summary refs log tree commit
diff options
context:
space:
mode:
authorJoshua Peek <josh@joshpeek.com>2010-10-26 10:25:01 -0500
committerJoshua Peek <josh@joshpeek.com>2010-10-26 10:25:01 -0500
commitdda892d60daff0fe7289008a4153fa628dcc8d11 (patch)
treefa3936cc1028cacaa192d34c9a2e7206b508cbcf
parent1598f873c891288954981435e707de26cf49395d (diff)
downloadrack-dda892d60daff0fe7289008a4153fa628dcc8d11.tar.gz
Request#scheme returns 'https' if forwarded protocol headers are set
-rw-r--r--lib/rack/request.rb20
-rw-r--r--test/spec_request.rb11
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