diff --git a/lib/prerender_rails.rb b/lib/prerender_rails.rb
index ef059c6..3392d02 100644
--- a/lib/prerender_rails.rb
+++ b/lib/prerender_rails.rb
@@ -181,32 +181,21 @@ def get_prerendered_page_response(env)
end
end
+ def get_cloudflare_scheme(env)
+ match = /"scheme":"(http|https)"/.match(env['CF-VISITOR'])
+ match && match[1]
+ end
def build_api_url(env)
- new_env = env
- if env["CF-VISITOR"]
- match = /"scheme":"(http|https)"/.match(env['CF-VISITOR'])
- new_env["HTTPS"] = true and new_env["rack.url_scheme"] = "https" and new_env["SERVER_PORT"] = 443 if (match && match[1] == "https")
- new_env["HTTPS"] = false and new_env["rack.url_scheme"] = "http" and new_env["SERVER_PORT"] = 80 if (match && match[1] == "http")
- end
-
- if env["X-FORWARDED-PROTO"]
- new_env["HTTPS"] = true and new_env["rack.url_scheme"] = "https" and new_env["SERVER_PORT"] = 443 if env["X-FORWARDED-PROTO"].split(',')[0] == "https"
- new_env["HTTPS"] = false and new_env["rack.url_scheme"] = "http" and new_env["SERVER_PORT"] = 80 if env["X-FORWARDED-PROTO"].split(',')[0] == "http"
- end
+ request_obj = Rack::Request.new(env)
+ scheme = @options[:protocol] || get_cloudflare_scheme(env) || request_obj.scheme
+ url = "#{scheme}://#{request_obj.host}#{request_obj.fullpath}"
- if @options[:protocol]
- new_env["HTTPS"] = true and new_env["rack.url_scheme"] = "https" and new_env["SERVER_PORT"] = 443 if @options[:protocol] == "https"
- new_env["HTTPS"] = false and new_env["rack.url_scheme"] = "http" and new_env["SERVER_PORT"] = 80 if @options[:protocol] == "http"
- end
-
- url = Rack::Request.new(new_env).url
prerender_url = get_prerender_service_url()
forward_slash = prerender_url[-1, 1] == '/' ? '' : '/'
"#{prerender_url}#{forward_slash}#{url}"
end
-
def get_prerender_service_url
@options[:prerender_service_url] || ENV['PRERENDER_SERVICE_URL'] || 'http://service.prerender.io/'
end
diff --git a/test/lib/prerender_rails.rb b/test/lib/prerender_rails.rb
index 60d66d9..060f4e2 100644
--- a/test/lib/prerender_rails.rb
+++ b/test/lib/prerender_rails.rb
@@ -200,7 +200,7 @@
# Check X-Forwarded-Proto because Heroku SSL Support terminates at the load balancer
it "should build the correct api url for the Heroku SSL Addon support with single value" do
- request = Rack::MockRequest.env_for "http://google.com/search?q=javascript", { 'X-FORWARDED-PROTO' => 'https'}
+ request = Rack::MockRequest.env_for "http://google.com/search?q=javascript", { 'HTTP_X_FORWARDED_PROTO' => 'https'}
ENV['PRERENDER_SERVICE_URL'] = nil
assert_equal 'http://service.prerender.io/https://google.com/search?q=javascript', @prerender.build_api_url(request)
end
@@ -208,7 +208,7 @@
# Check X-Forwarded-Proto because Heroku SSL Support terminates at the load balancer
it "should build the correct api url for the Heroku SSL Addon support with double value" do
- request = Rack::MockRequest.env_for "http://google.com/search?q=javascript", { 'X-FORWARDED-PROTO' => 'https,http'}
+ request = Rack::MockRequest.env_for "http://google.com/search?q=javascript", { 'HTTP_X_FORWARDED_PROTO' => 'https,http'}
ENV['PRERENDER_SERVICE_URL'] = nil
assert_equal 'http://service.prerender.io/https://google.com/search?q=javascript', @prerender.build_api_url(request)
end