diff options
author | Joshua Peek <josh@joshpeek.com> | 2010-10-26 10:25:01 -0500 |
---|---|---|
committer | Joshua Peek <josh@joshpeek.com> | 2010-10-26 10:25:01 -0500 |
commit | dda892d60daff0fe7289008a4153fa628dcc8d11 (patch) | |
tree | fa3936cc1028cacaa192d34c9a2e7206b508cbcf | |
parent | 1598f873c891288954981435e707de26cf49395d (diff) | |
download | rack-dda892d60daff0fe7289008a4153fa628dcc8d11.tar.gz |
Request#scheme returns 'https' if forwarded protocol headers are set
-rw-r--r-- | lib/rack/request.rb | 20 | ||||
-rw-r--r-- | test/spec_request.rb | 11 |
2 files changed, 24 insertions, 7 deletions
diff --git a/lib/rack/request.rb b/lib/rack/request.rb index 73933fef..9f8adfd7 100644 --- a/lib/rack/request.rb +++ b/lib/rack/request.rb @@ -22,7 +22,6 @@ module Rack end def body; @env["rack.input"] end - def scheme; @env["rack.url_scheme"] end def script_name; @env["SCRIPT_NAME"].to_s end def path_info; @env["PATH_INFO"].to_s end def request_method; @env["REQUEST_METHOD"] end @@ -63,6 +62,20 @@ module Rack media_type_params['charset'] end + def scheme + if @env['HTTPS'] == 'on' + 'https' + elsif @env['HTTP_X_FORWARDED_PROTO'] + @env['HTTP_X_FORWARDED_PROTO'] + else + @env["rack.url_scheme"] + end + end + + def ssl? + scheme == 'https' + end + def host_with_port if forwarded = @env["HTTP_X_FORWARDED_HOST"] forwarded.split(/,\s?/).last @@ -265,11 +278,6 @@ module Rack end end - def ssl? - (@env['HTTPS'] == 'on' || @env['HTTP_X_FORWARDED_PROTO'] == 'https') || - (@env['rack.url_scheme'] == 'https') - end - protected def parse_query(qs) Utils.parse_nested_query(qs) diff --git a/test/spec_request.rb b/test/spec_request.rb index 6838e56c..418463e0 100644 --- a/test/spec_request.rb +++ b/test/spec_request.rb @@ -229,20 +229,29 @@ describe Rack::Request do req.should.be.xhr end - should "figure out if using ssl" do + should "ssl detection" do request = Rack::Request.new(Rack::MockRequest.env_for("/")) + request.scheme.should.equal "http" request.should.not.be.ssl? request = Rack::Request.new(Rack::MockRequest.env_for("/", 'HTTPS' => 'on')) + request.scheme.should.equal "https" request.should.be.ssl? request = Rack::Request.new(Rack::MockRequest.env_for("/", 'rack.url_scheme' => 'https')) + request.scheme.should.equal "https" request.should.be.ssl? request = Rack::Request.new(Rack::MockRequest.env_for("/", 'HTTP_HOST' => 'www.example.org:8080')) + request.scheme.should.equal "http" request.should.not.be.ssl? request = Rack::Request.new(Rack::MockRequest.env_for("/", 'HTTP_HOST' => 'www.example.org:8443', 'HTTPS' => 'on')) + request.scheme.should.equal "https" + request.should.be.ssl? + + request = Rack::Request.new(Rack::MockRequest.env_for("/", 'HTTP_X_FORWARDED_PROTO' => 'https')) + request.scheme.should.equal "https" request.should.be.ssl? end |