From 6c3d552c77a66d5869d3379637f0c829b690964c Mon Sep 17 00:00:00 2001 From: Samuel Williams Date: Mon, 11 Dec 2023 20:57:56 +1300 Subject: [PATCH] Rack hijack only works with Rack 3 specification. --- lib/protocol/rack/adapter/generic.rb | 4 ---- lib/protocol/rack/adapter/rack2.rb | 3 --- lib/protocol/rack/adapter/rack3.rb | 4 ++++ lib/protocol/rack/constants.rb | 4 ++++ 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/lib/protocol/rack/adapter/generic.rb b/lib/protocol/rack/adapter/generic.rb index 06fe9d5..6c3a18e 100644 --- a/lib/protocol/rack/adapter/generic.rb +++ b/lib/protocol/rack/adapter/generic.rb @@ -73,10 +73,6 @@ def unwrap_request(request, env) env[CGI::HTTP_UPGRADE] = Array(protocol).join(",") end - if request.respond_to?(:hijack?) and request.hijack? - env[RACK_HIJACK] = proc{request.hijack!.io.dup} - end - # HTTP/2 prefers `:authority` over `host`, so we do this for backwards compatibility. env[CGI::HTTP_HOST] ||= request.authority diff --git a/lib/protocol/rack/adapter/rack2.rb b/lib/protocol/rack/adapter/rack2.rb index a60486c..7db98b9 100644 --- a/lib/protocol/rack/adapter/rack2.rb +++ b/lib/protocol/rack/adapter/rack2.rb @@ -17,9 +17,6 @@ class Rack2 < Generic RACK_MULTIPROCESS = 'rack.multiprocess' RACK_RUN_ONCE = 'rack.run_once' - RACK_IS_HIJACK = 'rack.hijack?' - RACK_HIJACK = 'rack.hijack' - def self.wrap(app) Rewindable.new(self.new(app)) end diff --git a/lib/protocol/rack/adapter/rack3.rb b/lib/protocol/rack/adapter/rack3.rb index a8e1d93..c2d7159 100644 --- a/lib/protocol/rack/adapter/rack3.rb +++ b/lib/protocol/rack/adapter/rack3.rb @@ -59,6 +59,10 @@ def make_environment(request) self.unwrap_request(request, env) + if request.respond_to?(:hijack?) and request.hijack? + env[RACK_HIJACK] = proc{request.hijack!.io.dup} + end + return env end diff --git a/lib/protocol/rack/constants.rb b/lib/protocol/rack/constants.rb index b55c075..355547c 100644 --- a/lib/protocol/rack/constants.rb +++ b/lib/protocol/rack/constants.rb @@ -36,5 +36,9 @@ module CGI RACK_URL_SCHEME = 'rack.url_scheme' RACK_PROTOCOL = 'rack.protocol' RACK_RESPONSE_FINISHED = 'rack.response_finished' + + # Rack hijack support: + RACK_IS_HIJACK = 'rack.hijack?' + RACK_HIJACK = 'rack.hijack' end end