No description
Sergio Durigan Junior
859759267c
Some testcases (test/http_streaming_response_test.rb and test/rack_proxy_test.rb) try to access the internet, but that is against Debian Policy guidelines, and therefore we need to disable them. Closes: #860198 |
||
---|---|---|
debian | ||
lib | ||
test | ||
.gitignore | ||
.travis.yml | ||
Gemfile | ||
Gemfile.lock | ||
LICENSE | ||
rack-proxy.gemspec | ||
Rakefile | ||
README.md |
A request/response rewriting HTTP proxy. A Rack app. Subclass Rack::Proxy
and provide your rewrite_env
and rewrite_response
methods.
Example
class Foo < Rack::Proxy
def rewrite_env(env)
env["HTTP_HOST"] = "example.com"
env
end
def rewrite_response(triplet)
status, headers, body = triplet
headers["X-Foo"] = "Bar"
triplet
end
end
Disable SSL session verification when proxying a server with e.g. self-signed SSL certs
class TrustingProxy < Rack::Proxy
def rewrite_env(env)
env["rack.ssl_verify_none"] = true
env
end
end
The same can be achieved for all requests going through the Rack::Proxy
instance by using
Rack::Proxy.new(ssl_verify_none: true)
Using it as a middleware:
Example: Proxying only requests that end with ".php" could be done like this:
require 'rack/proxy'
class RackPhpProxy < Rack::Proxy
def perform_request(env)
request = Rack::Request.new(env)
if request.path =~ %r{\.php}
env["HTTP_HOST"] = "localhost"
env["REQUEST_PATH"] = "/php/#{request.fullpath}"
super(env)
else
@app.call(env)
end
end
end
To use the middleware, please consider the following:
- For Rails we could add a configuration in config/application.rb
config.middleware.use RackPhpProxy, {ssl_verify_none: true}
- For Sinatra or any Rack-based application:
class MyAwesomeSinatra < Sinatra::Base
use RackPhpProxy, {ssl_verify_none: true}
end
This will allow to run the other requests through the application and only proxy the requests that match the condition from the middleware.
See tests for more examples.
WARNING
Doesn't work with fakeweb/webmock. Both libraries monkey-patch net/http code.
Todos
- Make the docs up to date with the current use case for this code: everything except streaming which involved a rather ugly monkey patch and only worked in 1.8, but does not work now.