def self.build_with_request(connection, request, remains, secure = false, debug = false)
version = if request['sec-websocket-version']
request['sec-websocket-version'].to_i
elsif request['sec-websocket-draft']
request['sec-websocket-draft'].to_i
elsif request['sec-websocket-key1']
76
else
75
end
case version
when 75
if !remains.empty?
raise HandshakeError, "Extra bytes after header"
end
when 76, 1..3
if remains.length < 8
return nil
elsif remains.length > 8
raise HandshakeError, "Extra bytes after third key"
end
request['third-key'] = remains
end
unless request['connection'] && request['connection'] =~ /Upgrade/ && request['upgrade'] && request['upgrade'].downcase == 'websocket'
raise HandshakeError, "Connection and Upgrade headers required"
end
protocol = (secure ? "wss" : "ws")
request['host'] = Addressable::URI.parse("#{protocol}://"+request['host'])
case version
when 75
Handler75.new(connection, request, debug)
when 76
Handler76.new(connection, request, debug)
when 1..3
Handler03.new(connection, request, debug)
when 5
Handler05.new(connection, request, debug)
when 6
Handler06.new(connection, request, debug)
when 7
Handler07.new(connection, request, debug)
when 8
Handler08.new(connection, request, debug)
when 13
Handler13.new(connection, request, debug)
else
raise HandshakeError, "Protocol version #{version} not supported"
end
end