From 14ce740d0be22ea57fa9be4b47a0cacfb871a031 Mon Sep 17 00:00:00 2001 From: Kenichi Nakamura Date: Wed, 8 Apr 2015 13:24:32 -0700 Subject: [PATCH 1/3] remove rack dep, mimic rack env minimally --- lib/reel/websocket.rb | 26 +++++++++++--------------- reel.gemspec | 1 - 2 files changed, 11 insertions(+), 16 deletions(-) diff --git a/lib/reel/websocket.rb b/lib/reel/websocket.rb index 3871fb5..97e95a0 100644 --- a/lib/reel/websocket.rb +++ b/lib/reel/websocket.rb @@ -1,6 +1,5 @@ require 'forwardable' require 'websocket/driver' -require 'rack' module Reel class WebSocket @@ -12,8 +11,8 @@ class WebSocket def_delegators :@socket, :addr, :peeraddr def initialize(info, connection) - driver_env = DriverEnvironment.new(info, connection.socket) - + driver_env = DriverEnvironment.new(info, connection.socket) + @socket = connection.hijack_socket @request_info = info @@ -98,19 +97,16 @@ class DriverEnvironment def_delegators :socket, :write - def initialize(info, socket) - @url = info.url - - env_hash = Hash[info.headers.map { |key, value| ['HTTP_' + key.upcase.gsub('-','_'),value ] }] - - env_hash.merge!({ - :method => info.method, - :input => info.body.to_s, - 'REMOTE_ADDR' => info.remote_addr - }) - - @env = ::Rack::MockRequest.env_for(@url, env_hash) + RACK_HEADERS = { + 'Sec-WebSocket-Key' => 'HTTP_SEC_WEBSOCKET_KEY', + 'Sec-WebSocket-Extensions' => 'HTTP_SEC_WEBSOCKET_EXTENSIONS', + 'Sec-WebSocket-Protocol' => 'HTTP_SEC_WEBSOCKET_PROTOCOL', + 'Sec-WebSocket-Version' => 'HTTP_SEC_WEBSOCKET_VERSION' + } + def initialize(info, socket) + @env, @url = {}, info.url + RACK_HEADERS.each {|k,v| @env[v] = info.headers[k]} @socket = socket end end diff --git a/reel.gemspec b/reel.gemspec index 404ebeb..e4612f3 100644 --- a/reel.gemspec +++ b/reel.gemspec @@ -20,7 +20,6 @@ Gem::Specification.new do |gem| gem.add_runtime_dependency 'http', '>= 0.6.0.pre' gem.add_runtime_dependency 'http_parser.rb', '>= 0.6.0' gem.add_runtime_dependency 'websocket-driver', '>= 0.5.1' - gem.add_runtime_dependency 'rack' gem.add_development_dependency 'rake' gem.add_development_dependency 'rspec', '>= 2.11.0' From 3e5517a77a25eb102fb7609142516a72f414e035 Mon Sep 17 00:00:00 2001 From: Kenichi Nakamura Date: Wed, 8 Apr 2015 13:25:16 -0700 Subject: [PATCH 2/3] forward ping to driver --- lib/reel/websocket.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/reel/websocket.rb b/lib/reel/websocket.rb index 97e95a0..65cfa08 100644 --- a/lib/reel/websocket.rb +++ b/lib/reel/websocket.rb @@ -9,6 +9,7 @@ class WebSocket attr_reader :socket def_delegators :@socket, :addr, :peeraddr + def_delegators :@driver, :ping def initialize(info, connection) driver_env = DriverEnvironment.new(info, connection.socket) From 4bb8a3e15a9457f7fe9c000ee7d152a26e5126c0 Mon Sep 17 00:00:00 2001 From: Kenichi Nakamura Date: Thu, 9 Apr 2015 09:38:36 -0700 Subject: [PATCH 3/3] add older protocol headers to env map --- lib/reel/websocket.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/reel/websocket.rb b/lib/reel/websocket.rb index 65cfa08..b723924 100644 --- a/lib/reel/websocket.rb +++ b/lib/reel/websocket.rb @@ -99,7 +99,10 @@ class DriverEnvironment def_delegators :socket, :write RACK_HEADERS = { + 'Origin' => 'HTTP_ORIGIN', 'Sec-WebSocket-Key' => 'HTTP_SEC_WEBSOCKET_KEY', + 'Sec-WebSocket-Key1' => 'HTTP_SEC_WEBSOCKET_KEY1', + 'Sec-WebSocket-Key2' => 'HTTP_SEC_WEBSOCKET_KEY2', 'Sec-WebSocket-Extensions' => 'HTTP_SEC_WEBSOCKET_EXTENSIONS', 'Sec-WebSocket-Protocol' => 'HTTP_SEC_WEBSOCKET_PROTOCOL', 'Sec-WebSocket-Version' => 'HTTP_SEC_WEBSOCKET_VERSION'