summary refs log tree commit
diff options
context:
space:
mode:
authorpavel <pavel.rosicky@easy.cz>2019-07-23 21:07:34 +0200
committerpavel <pavel.rosicky@easy.cz>2019-07-23 21:07:34 +0200
commit6f349e1d2d1f528c486417d3421609be6e033e31 (patch)
treedfcc672f016f8b21c1a76efceeca1ae94f90fac8
parent91e492a56a4eb1d26f5a8e647f12e364458818de (diff)
downloadrack-6f349e1d2d1f528c486417d3421609be6e033e31.tar.gz
reduce allocations in forwarded_scheme
-rw-r--r--lib/rack/request.rb30
1 files changed, 21 insertions, 9 deletions
diff --git a/lib/rack/request.rb b/lib/rack/request.rb
index 951fe8cb..a0676fff 100644
--- a/lib/rack/request.rb
+++ b/lib/rack/request.rb
@@ -252,14 +252,14 @@ module Rack
       end
 
       def port
-        if port = host_with_port.split(/:/)[1]
+        if port = extract_port(host_with_port)
           port.to_i
         elsif port = get_header(HTTP_X_FORWARDED_PORT)
           port.to_i
         elsif has_header?(HTTP_X_FORWARDED_HOST)
           DEFAULT_PORTS[scheme]
         elsif has_header?(HTTP_X_FORWARDED_PROTO)
-          DEFAULT_PORTS[get_header(HTTP_X_FORWARDED_PROTO).split(',')[0]]
+          DEFAULT_PORTS[extract_proto_header(get_header(HTTP_X_FORWARDED_PROTO))]
         else
           get_header(SERVER_PORT).to_i
         end
@@ -510,16 +510,28 @@ module Rack
       end
 
       def forwarded_scheme
-        scheme_headers = [
-          get_header(HTTP_X_FORWARDED_SCHEME),
-          get_header(HTTP_X_FORWARDED_PROTO).to_s.split(',')[0]
-        ]
+        allowed_scheme(get_header(HTTP_X_FORWARDED_SCHEME)) ||
+        allowed_scheme(extract_proto_header(get_header(HTTP_X_FORWARDED_PROTO)))
+      end
+
+      def allowed_scheme(header)
+        header if ALLOWED_SCHEMES.include?(header)
+      end
 
-        scheme_headers.each do |header|
-          return header if ALLOWED_SCHEMES.include?(header)
+      def extract_proto_header(header)
+        if header
+          if (comma_index = header.index(','))
+            header[0, comma_index]
+          else
+            header
+          end
         end
+      end
 
-        nil
+      def extract_port(uri)
+        if (colon_index = uri.index(':'))
+          uri[colon_index + 1, uri.length]
+        end
       end
     end