Created
March 28, 2014 09:05
-
-
Save mattheworiordan/9828493 to your computer and use it in GitHub Desktop.
CloudFlare IP Middleware for Rails to ensure HTTP_CF_CONNECTING_IP is used and the clients IP is correct within Rails
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module RailsAppName | |
class Application < Rails::Application | |
# .... your settings | |
require "#{Rails.root}/lib/cloud_flare_middleware" | |
config.middleware.insert_before(0, Rack::CloudFlareMiddleware) | |
# ... your settings | |
end | |
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# CloudFlare masks the true IP | |
# This middleware ensures the Rails stack obtains the correct IP when using request.remote_ip | |
# See https://support.cloudflare.com/hc/en-us/articles/200170786 | |
module Rack | |
class CloudFlareMiddleware | |
def initialize(app) | |
@app = app | |
end | |
def call(env) | |
if env['HTTP_CF_CONNECTING_IP'] | |
env['HTTP_REMOTE_ADDR_BEFORE_CF'] = env['REMOTE_ADDR'] | |
env['HTTP_X_FORWARDED_FOR_BEFORE_CF'] = env['HTTP_X_FORWARDED_FOR'] | |
env['REMOTE_ADDR'] = env['HTTP_CF_CONNECTING_IP'] | |
env['HTTP_X_FORWARDED_FOR'] = env['HTTP_CF_CONNECTING_IP'] | |
end | |
@app.call(env) | |
end | |
end | |
end |
I see that we are setting environment variables. If I'm trying to make my code thread-safe to use Puma effectively with multi-threading, I guess this code isn't thread-safe right, because we are mutating the global shared space(for threads). What's the solution in this case? How should I proceed to make it thread-safe?
Good one
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Thanks for this!
Btw - there is a typo
require "#{Rails.root}/lib/cloud_flare_middleware"
should berequire "#{Rails.root}/lib/cloudflare-middleware"