From 5aa6b7ad7d8847a5d191ecf8606919b7886df7c2 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sat, 6 Jun 2015 00:29:00 +0000 Subject: move the socket into Rack env for hijacking This avoids the expensive generic instance variable for @socket and exposes the socket as `env["unicorn.socket"]' to the Rack application. As as nice side-effect, applications may access `env["unicorn.socket"]' as part of the API may be useful for 3rd-party bits such as Raindrops::TCP_Info for reading the tcp_info struct on Linux-based systems. Yes, `env["unicorn.socket"]' is a proprietary API in unicorn! News at 11! But then again, unicorn is not the first Rack server to implement `env["#{servername}.socket"]', either... --- lib/unicorn/http_request.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/unicorn/http_request.rb b/lib/unicorn/http_request.rb index b60e383..f5c6b5b 100644 --- a/lib/unicorn/http_request.rb +++ b/lib/unicorn/http_request.rb @@ -33,6 +33,7 @@ class Unicorn::HttpParser # 2.2+ optimizes hash assignments when used with literal string keys REMOTE_ADDR = 'REMOTE_ADDR'.freeze RACK_INPUT = 'rack.input'.freeze + UNICORN_SOCKET = 'unicorn.socket'.freeze HTTP_RESPONSE_START = [ 'HTTP', '/1.1 '] @@input_class = Unicorn::TeeInput @@check_client_connection = false @@ -99,7 +100,7 @@ class Unicorn::HttpParser NULL_IO : @@input_class.new(socket, self) # for Rack hijacking in Rack 1.5 and later - @socket = socket + e[UNICORN_SOCKET] = socket e[RACK_HIJACK] = self e.merge!(DEFAULTS) @@ -108,7 +109,7 @@ class Unicorn::HttpParser # for rack.hijack, we respond to this method so no extra allocation # of a proc object def call - env[RACK_HIJACK_IO] = @socket + env[RACK_HIJACK_IO] = env[UNICORN_SOCKET] end def hijacked? -- cgit v1.2.3-24-ge0c7