Class: Faye::WebSocket::Protocol8Parser

Inherits:
Object
  • Object
show all
Defined in:
lib/faye/util/web_socket/protocol8_parser.rb

Defined Under Namespace

Classes: Handshake

Constant Summary collapse

GUID =
'258EAFA5-E914-47DA-95CA-C5AB0DC85B11'
FIN =
MASK = 0b10000000
RSV1 =
0b01000000
RSV2 =
0b00100000
RSV3 =
0b00010000
OPCODE =
0b00001111
LENGTH =
0b01111111
OPCODES =
{
  :continuation => 0,
  :text         => 1,
  :binary       => 2,
  :close        => 8,
  :ping         => 9,
  :pong         => 10
}
ERRORS =
{
  :normal_closure => 1000,
  :going_away     => 1001,
  :protocol_error => 1002,
  :unacceptable   => 1003,
  :too_large      => 1004,
  :encoding_error => 1007
}

Instance Method Summary collapse

Constructor Details

#initialize(web_socket) ⇒ Protocol8Parser

Returns a new instance of Protocol8Parser.



79
80
81
82
83
# File 'lib/faye/util/web_socket/protocol8_parser.rb', line 79

def initialize(web_socket)
  reset
  @socket = web_socket
  @stage  = 0
end

Instance Method Details

#close(error_type = nil, &callback) ⇒ Object



145
146
147
148
149
150
# File 'lib/faye/util/web_socket/protocol8_parser.rb', line 145

def close(error_type = nil, &callback)
  return if @closed
  @closing_callback ||= callback
  @socket.send('', :close, error_type || :normal_closure)
  @closed = true
end

#create_handshakeObject



103
104
105
# File 'lib/faye/util/web_socket/protocol8_parser.rb', line 103

def create_handshake
  Handshake.new(@socket.uri)
end

#frame(data, type = nil, error_type = nil) ⇒ Object



119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# File 'lib/faye/util/web_socket/protocol8_parser.rb', line 119

def frame(data, type = nil, error_type = nil)
  return nil if @closed
  
  if error_type
    data = [ERRORS[error_type]].pack('n') + data
  end
  
  opcode = OPCODES[type || :text]
  frame  = (FIN | opcode).chr
  length = data.respond_to?(:bytes) ? data.bytes.count : data.size
  
  case length
    when 0..125 then
      frame << length
    when 126..65535 then
      frame << 126
      frame << [length].pack('n')
    else
      frame << 127
      frame << [length >> 32, length & 0xFFFFFFFF].pack('NN')
  end
  
  
  Faye.encode(frame) + Faye.encode(data)
end

#handshake_responseObject



89
90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/faye/util/web_socket/protocol8_parser.rb', line 89

def handshake_response
  sec_key = @socket.request.env['HTTP_SEC_WEBSOCKET_KEY']
  return '' unless String === sec_key
  
  accept = Base64.encode64(Digest::SHA1.digest(sec_key + GUID)).strip
  
  upgrade =  "HTTP/1.1 101 Switching Protocols\r\n"
  upgrade << "Upgrade: websocket\r\n"
  upgrade << "Connection: Upgrade\r\n"
  upgrade << "Sec-WebSocket-Accept: #{accept}\r\n"
  upgrade << "\r\n"
  upgrade
end

#parse(data) ⇒ Object



107
108
109
110
111
112
113
114
115
116
117
# File 'lib/faye/util/web_socket/protocol8_parser.rb', line 107

def parse(data)
  data.each_byte do |byte|
    case @stage
    when 0 then parse_opcode(byte)
    when 1 then parse_length(byte)
    when 2 then parse_extended_length(byte)
    when 3 then parse_mask(byte)
    when 4 then parse_payload(byte)
    end
  end
end

#versionObject



85
86
87
# File 'lib/faye/util/web_socket/protocol8_parser.rb', line 85

def version
  'protocol-8'
end