summaryrefslogtreecommitdiff
path: root/vendor/bundle/ruby/3.4.0/gems/em-websocket-0.5.3/lib/em-websocket/handshake04.rb
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/bundle/ruby/3.4.0/gems/em-websocket-0.5.3/lib/em-websocket/handshake04.rb')
-rw-r--r--vendor/bundle/ruby/3.4.0/gems/em-websocket-0.5.3/lib/em-websocket/handshake04.rb37
1 files changed, 37 insertions, 0 deletions
diff --git a/vendor/bundle/ruby/3.4.0/gems/em-websocket-0.5.3/lib/em-websocket/handshake04.rb b/vendor/bundle/ruby/3.4.0/gems/em-websocket-0.5.3/lib/em-websocket/handshake04.rb
new file mode 100644
index 0000000..7600787
--- /dev/null
+++ b/vendor/bundle/ruby/3.4.0/gems/em-websocket-0.5.3/lib/em-websocket/handshake04.rb
@@ -0,0 +1,37 @@
+require 'digest/sha1'
+require 'base64'
+
+module EventMachine
+ module WebSocket
+ module Handshake04
+ def self.handshake(headers, _, __)
+ # Required
+ unless key = headers['sec-websocket-key']
+ raise HandshakeError, "sec-websocket-key header is required"
+ end
+
+ string_to_sign = "#{key}258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
+ signature = Base64.encode64(Digest::SHA1.digest(string_to_sign)).chomp
+
+ upgrade = ["HTTP/1.1 101 Switching Protocols"]
+ upgrade << "Upgrade: websocket"
+ upgrade << "Connection: Upgrade"
+ upgrade << "Sec-WebSocket-Accept: #{signature}"
+ if protocol = headers['sec-websocket-protocol']
+ validate_protocol!(protocol)
+ upgrade << "Sec-WebSocket-Protocol: #{protocol}"
+ end
+
+ # TODO: Support sec-websocket-protocol selection
+ # TODO: sec-websocket-extensions
+
+ return upgrade.join("\r\n") + "\r\n\r\n"
+ end
+
+ def self.validate_protocol!(protocol)
+ raise HandshakeError, "Invalid WebSocket-Protocol: empty" if protocol.empty?
+ # TODO: Validate characters
+ end
+ end
+ end
+end