diff --git a/lib/protocol/rack/adapter/rack2.rb b/lib/protocol/rack/adapter/rack2.rb index ca98c63..01eee07 100644 --- a/lib/protocol/rack/adapter/rack2.rb +++ b/lib/protocol/rack/adapter/rack2.rb @@ -59,8 +59,12 @@ def make_environment(request) # I'm not sure what sane defaults should be here: CGI::SERVER_NAME => server_name, - CGI::SERVER_PORT => server_port, } + + # SERVER_PORT is optional but must not be set if it is not present. + if server_port + env[CGI::SERVER_PORT] = server_port + end self.unwrap_request(request, env) diff --git a/lib/protocol/rack/adapter/rack3.rb b/lib/protocol/rack/adapter/rack3.rb index eb00e5f..b43febb 100644 --- a/lib/protocol/rack/adapter/rack3.rb +++ b/lib/protocol/rack/adapter/rack3.rb @@ -55,8 +55,12 @@ def make_environment(request) # I'm not sure what sane defaults should be here: CGI::SERVER_NAME => server_name, - CGI::SERVER_PORT => server_port, } + + # SERVER_PORT is optional but must not be set if it is not present. + if server_port + env[CGI::SERVER_PORT] = server_port + end self.unwrap_request(request, env) diff --git a/lib/protocol/rack/adapter/rack31.rb b/lib/protocol/rack/adapter/rack31.rb index 0e1aae5..b2cf73e 100644 --- a/lib/protocol/rack/adapter/rack31.rb +++ b/lib/protocol/rack/adapter/rack31.rb @@ -46,8 +46,12 @@ def make_environment(request) # I'm not sure what sane defaults should be here: CGI::SERVER_NAME => server_name, - CGI::SERVER_PORT => server_port, } + + # SERVER_PORT is optional but must not be set if it is not present. + if server_port + env[CGI::SERVER_PORT] = server_port + end if body = request.body if body.empty? diff --git a/test/protocol/rack/adapter/generic.rb b/test/protocol/rack/adapter/generic.rb index f6f83bb..125780f 100644 --- a/test/protocol/rack/adapter/generic.rb +++ b/test/protocol/rack/adapter/generic.rb @@ -35,6 +35,18 @@ expect(env).to have_keys("CONTENT_TYPE" => be == "text/plain") end end + + with "app server without SERVER_PORT" do + let(:request) do + Protocol::HTTP::Request.new("https", "example.com", "GET", "/", "http/1.1", Protocol::HTTP::Headers[{"accept" => "text/html"}], nil) + end + + it "does not include SERVER_PORT in the Rack environment" do + env = adapter.make_environment(request) + + expect(env).not.to have_keys(Protocol::Rack::CGI::SERVER_PORT) + end + end with "a app that returns nil" do include DisableConsoleContext