Class: Async::WebSocket::UpgradeRequest

Inherits:
Protocol::HTTP::Request
  • Object
show all
Includes:
Protocol::WebSocket::Headers
Defined in:
lib/async/websocket/upgrade_request.rb

Overview

This is required for HTTP/1.x to upgrade the connection to the WebSocket protocol. See tools.ietf.org/html/rfc6455

Defined Under Namespace

Classes: Wrapper

Instance Method Summary collapse

Constructor Details

#initialize(request, protocols: [], version: 13, &block) ⇒ UpgradeRequest

Returns a new instance of UpgradeRequest.



57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/async/websocket/upgrade_request.rb', line 57

def initialize(request, protocols: [], version: 13, &block)
	@key = Nounce.generate_key
	
	headers = ::Protocol::HTTP::Headers[request.headers]
	
	headers.add(SEC_WEBSOCKET_KEY, @key)
	headers.add(SEC_WEBSOCKET_VERSION, String(version))
	
	if protocols.any?
		headers.add(SEC_WEBSOCKET_PROTOCOL, protocols.join(","))
	end
	
	super(request.scheme, request.authority, ::Protocol::HTTP::Methods::GET, request.path, nil, headers, nil, PROTOCOL)
end

Instance Method Details

#call(connection) ⇒ Object



72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/async/websocket/upgrade_request.rb', line 72

def call(connection)
	response = super
	
	if accept_digest = response.headers[SEC_WEBSOCKET_ACCEPT]&.first
		expected_accept_digest = Nounce.accept_digest(@key)
		
		unless accept_digest and accept_digest == expected_accept_digest
			raise ProtocolError, "Invalid accept digest, expected #{expected_accept_digest.inspect}, got #{accept_digest.inspect}!"
		end
	end
	
	verified = accept_digest && Array(response.protocol).map(&:downcase) == %w(websocket) && response.headers["connection"]&.include?("upgrade")
	
	return Wrapper.new(response, verified: verified)
end