97 lines
2 KiB
Markdown
97 lines
2 KiB
Markdown
|
A request/response rewriting HTTP proxy. A Rack app. Subclass `Rack::Proxy` and provide your `rewrite_env` and `rewrite_response` methods.
|
||
|
|
||
|
Example
|
||
|
-------
|
||
|
|
||
|
```ruby
|
||
|
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
|
||
|
|
||
|
```ruby
|
||
|
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
|
||
|
|
||
|
```ruby
|
||
|
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:
|
||
|
|
||
|
```ruby
|
||
|
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:
|
||
|
|
||
|
1) For Rails we could add a configuration in config/application.rb
|
||
|
|
||
|
```ruby
|
||
|
config.middleware.use RackPhpProxy, {ssl_verify_none: true}
|
||
|
```
|
||
|
|
||
|
2) For Sinatra or any Rack-based application:
|
||
|
|
||
|
```ruby
|
||
|
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.
|