mirror of
https://github.com/faye/faye-websocket-ruby.git
synced 2025-11-01 13:59:13 +00:00
Fix draft-76 sockets when running behind HAProxy.
This commit is contained in:
@@ -0,0 +1,21 @@
|
||||
defaults
|
||||
mode http
|
||||
timeout client 5s
|
||||
timeout connect 5s
|
||||
timeout server 5s
|
||||
|
||||
frontend all 0.0.0.0:3000
|
||||
mode http
|
||||
timeout client 120s
|
||||
|
||||
option forwardfor
|
||||
option http-server-close
|
||||
option http-pretend-keepalive
|
||||
|
||||
default_backend sockets
|
||||
|
||||
backend sockets
|
||||
balance uri depth 2
|
||||
timeout server 120s
|
||||
server socket1 127.0.0.1:7000
|
||||
|
||||
@@ -80,7 +80,10 @@ module Faye
|
||||
event.init_event('open', false, false)
|
||||
dispatch_event(event)
|
||||
|
||||
@env[Thin::Request::WEBSOCKET_RECEIVE_CALLBACK] = @parser.method(:parse)
|
||||
@env[Thin::Request::WEBSOCKET_RECEIVE_CALLBACK] = lambda do |data|
|
||||
response = @parser.parse(data)
|
||||
@stream.write(response) if response
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
@@ -24,6 +24,7 @@ module Faye
|
||||
|
||||
def parse(data)
|
||||
data.each_byte(&method(:handle_byte))
|
||||
nil
|
||||
end
|
||||
|
||||
def frame(data, type = nil, error_type = nil)
|
||||
|
||||
@@ -8,16 +8,7 @@ module Faye
|
||||
|
||||
def handshake_response
|
||||
env = @socket.env
|
||||
|
||||
key1 = env['HTTP_SEC_WEBSOCKET_KEY1']
|
||||
value1 = number_from_key(key1) / spaces_in_key(key1)
|
||||
|
||||
key2 = env['HTTP_SEC_WEBSOCKET_KEY2']
|
||||
value2 = number_from_key(key2) / spaces_in_key(key2)
|
||||
|
||||
hash = Digest::MD5.digest(big_endian(value1) +
|
||||
big_endian(value2) +
|
||||
env['rack.input'].read)
|
||||
signature = handshake_signature(env['rack.input'].read)
|
||||
|
||||
upgrade = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n"
|
||||
upgrade << "Upgrade: WebSocket\r\n"
|
||||
@@ -25,10 +16,32 @@ module Faye
|
||||
upgrade << "Sec-WebSocket-Origin: #{env['HTTP_ORIGIN']}\r\n"
|
||||
upgrade << "Sec-WebSocket-Location: #{@socket.url}\r\n"
|
||||
upgrade << "\r\n"
|
||||
upgrade << hash
|
||||
upgrade << signature if signature
|
||||
upgrade
|
||||
end
|
||||
|
||||
def handshake_signature(head)
|
||||
return nil if head.empty?
|
||||
@handshake_complete = true
|
||||
|
||||
env = @socket.env
|
||||
|
||||
key1 = env['HTTP_SEC_WEBSOCKET_KEY1']
|
||||
value1 = number_from_key(key1) / spaces_in_key(key1)
|
||||
|
||||
key2 = env['HTTP_SEC_WEBSOCKET_KEY2']
|
||||
value2 = number_from_key(key2) / spaces_in_key(key2)
|
||||
|
||||
Digest::MD5.digest(big_endian(value1) +
|
||||
big_endian(value2) +
|
||||
head)
|
||||
end
|
||||
|
||||
def parse(data)
|
||||
return super if @handshake_complete
|
||||
handshake_signature(data)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def number_from_key(key)
|
||||
|
||||
@@ -129,6 +129,7 @@ module Faye
|
||||
end
|
||||
emit_frame if @stage == 4 and @length == 0
|
||||
end
|
||||
nil
|
||||
end
|
||||
|
||||
def frame(data, type = nil, code = nil)
|
||||
|
||||
Reference in New Issue
Block a user