diff options
author | pavel <pavel.rosicky@easy.cz> | 2019-07-23 21:07:34 +0200 |
---|---|---|
committer | pavel <pavel.rosicky@easy.cz> | 2019-07-23 21:07:34 +0200 |
commit | 6f349e1d2d1f528c486417d3421609be6e033e31 (patch) | |
tree | dfcc672f016f8b21c1a76efceeca1ae94f90fac8 | |
parent | 91e492a56a4eb1d26f5a8e647f12e364458818de (diff) | |
download | rack-6f349e1d2d1f528c486417d3421609be6e033e31.tar.gz |
reduce allocations in forwarded_scheme
-rw-r--r-- | lib/rack/request.rb | 30 |
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 |