class Faye::WebSocket::HybiParser
def emit_frame
def emit_frame payload = @masked ? Mask.mask(@payload, @mask) : @payload case @opcode when OPCODES[:continuation] then return @socket.close(ERRORS[:protocol_error], nil, false) unless @mode @buffer.concat(payload) if @final message = @buffer message = WebSocket.encode(message, true) if @mode == :text reset if message @socket.receive(message) else @socket.close(ERRORS[:encoding_error], nil, false) end end when OPCODES[:text] then if @final message = WebSocket.encode(payload, true) if message @socket.receive(message) else @socket.close(ERRORS[:encoding_error], nil, false) end else @mode = :text @buffer.concat(payload) end when OPCODES[:binary] then if @final @socket.receive(payload) else @mode = :binary @buffer.concat(payload) end when OPCODES[:close] then code = (payload.size >= 2) ? 256 * payload[0] + payload[1] : nil unless (payload.size == 0) or (code && code >= 3000 && code < 5000) or ERROR_CODES.include?(code) code = ERRORS[:protocol_error] end if payload.size > 125 or not WebSocket.valid_utf8?(payload[2..-1] || []) code = ERRORS[:protocol_error] end reason = (payload.size > 2) ? WebSocket.encode(payload[2..-1], true) : nil @socket.close(code, reason, false) @closing_callback.call if @closing_callback when OPCODES[:ping] then return @socket.close(ERRORS[:protocol_error], nil, false) if payload.size > 125 @socket.send(payload, :pong) when OPCODES[:pong] then message = WebSocket.encode(payload, true) callback = @ping_callbacks[message] @ping_callbacks.delete(message) callback.call if callback end end