[![Build Status](https://travis-ci.org/bpmason1/fastforward.svg?branch=master)](https://travis-ci.org/bpmason1/fastforward) [![minimum rustc 1.31](https://img.shields.io/badge/rustc-1.31+-yellow.svg) # fastforward Fastforward is library for writing reverse proxies in rust. ## usage - simple_proxy To implement a proxy that just receives traffic on `listen_addr` and forwards the it to `proxy_addr` use the `simple_proxy` function. ``` extern crate fastforward; extern crate http; use std::net::SocketAddr; use proxy::simple_proxy; fn main() { let listen_addr: SocketAddr = "127.0.0.1:8080".parse().unwrap(); let proxy_addr: SocketAddr = "127.0.0.1:4000".parse().unwrap(); println!("running on port :8080"); simple_proxy(listen_addr, proxy_addr); } ``` ## usage - generic_proxy To implement arbitrary logic for your proxy write a request director function. The request, after be passed into the director, will be proxied to the address specified by the "Host" header on the request. ``` extern crate fastforward; extern crate http; use http::{ header::HeaderValue, Response }; use std::io; use std::net::SocketAddr; use fastforward::generic_proxy; // The director function mutates the incoming request before proxying it. // In this example, the request URI is changed to the proxy URI. // This examle mimics the functionality of the `simple_proxy` function. fn req_transform(req: &mut http::Request>) -> Option>> { // set the variables let proxy_addr = HeaderValue::from_str("127.0.0.1:4000").unwrap(); let req_headers = req.headers_mut(); req_headers.remove(http::header::HOST); req_headers.insert(http::header::HOST, proxy_addr); None // ignore the return type for this example } fn resp_transform(resp: &mut http::Response>) { let x_header_val = HeaderValue::from_str("Foo Bar").unwrap(); let resp_headers = resp.headers_mut(); resp_headers.insert("X-HEADER-VAL", x_header_val); } fn main() { let listen_addr: SocketAddr = "127.0.0.1:8080".parse().unwrap(); generic_proxy(listen_addr, req_transform, resp_transform); } ```