diff --git a/lib/falcon/adapters/rack.rb b/lib/falcon/adapters/rack.rb index f803808..facc291 100644 --- a/lib/falcon/adapters/rack.rb +++ b/lib/falcon/adapters/rack.rb @@ -114,6 +114,10 @@ def unwrap_request(request, env) def call(request) request_path, query_string = request.path.split('?', 2) server_name, server_port = (request.authority || '').split(':', 2) + + unless request.headers["x-forwarded-proto"].nil? + request.scheme = request.headers["x-forwarded-proto"].first + end env = { RACK_VERSION => [2, 0, 0], diff --git a/spec/falcon/adapters/rack_spec.rb b/spec/falcon/adapters/rack_spec.rb index f2a45e5..8b46700 100644 --- a/spec/falcon/adapters/rack_spec.rb +++ b/spec/falcon/adapters/rack_spec.rb @@ -91,6 +91,28 @@ end end + context "rack.url_scheme" do + include_context Falcon::Server + let(:protocol) {Async::HTTP::Protocol::HTTP1} + + let(:app) do + lambda do |env| + [200, {}, ["Scheme: #{env['rack.url_scheme'].inspect}"]] + end + end + + it 'defaults to http' do + response = client.get('/') + + expect(response.read).to be == 'Scheme: "http"' + end + + it 'responses X-Forwarded-Proto headers' do + response = client.get('/', [["X-Forwarded-Proto", "https"]]) + + expect(response.read).to be == 'Scheme: "https"' + end + end context "early hints" do it_behaves_like Falcon::Adapters::EarlyHints end