Join GitHub today
GitHub is home to over 50 million developers working together to host and review code, manage projects, and build software together.
Sign upsimple proxy example #1096
simple proxy example #1096
Comments
|
This version compiles with master but does not return any data.
extern crate futures;
extern crate hyper;
extern crate tokio_core;
use futures::Future;
use hyper::{client, server, Client, Url};
struct Proxy;
fn server_request_to_client_request(req: &server::Request) -> client::Request {
// todo: handle parse error
let url = Url::parse(&format!("{}", req.uri())).unwrap();
let mut client_req = client::Request::new(req.method().clone(), url);
client_req.set_version(req.version().clone());
*client_req.headers_mut() = req.headers().clone();
client_req
}
impl server::Service for Proxy {
type Request = server::Request;
type Response = server::Response;
type Error = hyper::Error;
type Future = Box<Future<Item = Self::Response, Error = ::hyper::Error>>;
fn call(&self, req: server::Request) -> Self::Future {
let core = tokio_core::reactor::Core::new().unwrap();
let handle = core.handle().clone();
let client = Client::new(&handle);
let mut client_req = server_request_to_client_request(&req);
println!("got request {}", req.uri());
client_req.set_body(req.body());
Box::new(client.request(client_req)
.map_err(|e| {
println!("oops, an error {:?}", e);
e
})
.and_then(|res| {
println!("got response {}", res.headers());
let mut resp: server::Response = server::Response::new();
resp = resp.with_headers(res.headers().clone());
resp.set_status(res.status().clone());
resp.set_body(res.body());
futures::future::ok(resp)
}))
}
}
fn main() {
let addr = "127.0.0.1:1337".parse().unwrap();
let server = server::Http::new().bind(&addr, || Ok(Proxy {})).unwrap();
println!("Listening on http://{} with 1 thread.",
server.local_addr().unwrap());
server.run().unwrap();
}
|
|
Here is a version that uses a tokio Core per Service. This does not print error but hangs. The reason is probably that it mixes multiple event loops. The code hangs on one loop while another has data. //#![deny(warnings)]
extern crate futures;
extern crate hyper;
extern crate tokio_core;
use futures::Future;
use hyper::{client, server, Client, Url};
struct Proxy {
core: tokio_core::reactor::Core,
}
fn server_request_to_client_request(req: &server::Request) -> client::Request {
// todo: handle parse error
let url = Url::parse(&format!("{}", req.uri())).unwrap();
let mut client_req = client::Request::new(req.method().clone(), url);
client_req.set_version(req.version().clone());
*client_req.headers_mut() = req.headers().clone();
client_req
}
impl server::Service for Proxy {
type Request = server::Request;
type Response = server::Response;
type Error = hyper::Error;
type Future = Box<Future<Item = Self::Response, Error = ::hyper::Error>>;
fn call(&self, req: server::Request) -> Self::Future {
let client = Client::new(&self.core.handle());
let mut client_req = server_request_to_client_request(&req);
println!("got request {}", req.uri());
client_req.set_body(req.body());
Box::new(client.request(client_req)
.map_err(|e| {
println!("oops, an error {:?}", e);
e
})
.and_then(|res| {
println!("got response {}", res.headers());
let mut resp: server::Response = server::Response::new();
resp = resp.with_headers(res.headers().clone());
resp.set_status(res.status().clone());
resp.set_body(res.body());
futures::future::ok(resp)
}))
}
}
fn main() {
let addr = "127.0.0.1:1337".parse().unwrap();
let server = server::Http::new()
.bind(&addr, || {
let core = tokio_core::reactor::Core::new().unwrap();
Ok(Proxy { core: core })
})
.unwrap();
println!("Listening on http://{} with 1 thread.",
server.local_addr().unwrap());
server.run().unwrap();
} |
|
I would be very much interested in such example code. Found another, apparently also not working approach https://gist.github.com/infinityb/600c22ae549cecf43244 (maybe I'm using wrong version of the libraries) |
|
I wrote a simple proxy server with single event loop. |
|
Please feel free to submit a PR with such example code! If you need help doing this let me know. |
|
I'm currently writing a simple proxy with possibility of custom middlewares. |
Hyper has client and server http support and can probably be used to write an HTTP proxy. @fmonjalet claims to have already written one. In Node.JS it's very simple to write such a proxy in a few lines.
Here is my attempt at doing this with Hyper. The return type from
fn callis wrong and I've no idea how to fix it. Such a simple proxy would be an useful addition toexamples/.The proxy can be tested with