Class: Faye::WebSocket::Protocol8Parser
- Inherits:
-
Object
- Object
- Faye::WebSocket::Protocol8Parser
- 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
- #close(error_type = nil, &callback) ⇒ Object
- #create_handshake ⇒ Object
- #frame(data, type = nil, error_type = nil) ⇒ Object
- #handshake_response ⇒ Object
-
#initialize(web_socket) ⇒ Protocol8Parser
constructor
A new instance of Protocol8Parser.
- #parse(data) ⇒ Object
- #version ⇒ Object
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_handshake ⇒ Object
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_response ⇒ Object
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 |
#version ⇒ Object
85 86 87 |
# File 'lib/faye/util/web_socket/protocol8_parser.rb', line 85 def version 'protocol-8' end |