hyper-reverse-proxy 0.4.0

A simple reverse proxy, to be used with Hyper and Tokio.

A simple reverse proxy, to be used with Hyper.

The implementation ensures that Hop-by-hop headers are stripped correctly in both directions, and adds the client's IP address to a comma-space-separated list of forwarding addresses in the X-Forwarded-For header.

The implementation is based on Go's httputil.ReverseProxy.


Add these dependencies to your Cargo.toml file.

hyper-reverse-proxy = "0.4"
hyper = "0.12"
futures = "0.1"

The following example will set up a reverse proxy listening on, and will proxy these calls:

  • "/target/first" will be proxied to

  • "/target/second" will be proxied to

  • All other URLs will be handled by debug_request function, that will display request information.

use hyper::server::conn::AddrStream;
use hyper::{Body, Request, Response, Server};
use hyper::service::{service_fn, make_service_fn};
use futures::future::{self, Future};

type BoxFut = Box<Future<Item=Response<Body>, Error=hyper::Error> + Send>;

fn debug_request(req: Request<Body>) -> BoxFut {
let body_str = format!("{:?}", req);
let response = Response::new(Body::from(body_str));

fn main() {

// This is our socket address...
let addr = ([127, 0, 0, 1], 13900).into();

// A `Service` is needed for every connection.
let make_svc = make_service_fn(|socket: &AddrStream| {
let remote_addr = socket.remote_addr();
service_fn(move |req: Request<Body>| { // returns BoxFut

if req.uri().path().starts_with("/target/first") {

// will forward requests to port 13901
return hyper_reverse_proxy::call(remote_addr.ip(), "", req)

} else if req.uri().path().starts_with("/target/second") {

// will forward requests to port 13902
return hyper_reverse_proxy::call(remote_addr.ip(), "", req)

} else {

let server = Server::bind(&addr)
.map_err(|e| eprintln!("server error: {}", e));

println!("Running server on {:?}", addr);

// Run this server for... forever!