~sergiodj/debian_ruby-rack-proxy

Update changelog for 0.6.1-1.1 release
Prevent testcases that access the internet to run
a5b0bebb — Praveen Arimbrathodiyil 7 years ago
tag patch

refs

master
browse  log 
debian/0.6.1-1
release notes 

clone

read-only
https://git.sr.ht/~sergiodj/debian_ruby-rack-proxy
read/write
git@git.sr.ht:~sergiodj/debian_ruby-rack-proxy

You can also use your local clone with git send-email.

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:

  1. For Rails we could add a configuration in config/application.rb
config.middleware.use RackPhpProxy, {ssl_verify_none: true}
  1. 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.