feat: include README.md inside mod doc
This commit is contained in:
parent
102d50a024
commit
e73a76600c
112
src/lib.rs
112
src/lib.rs
@ -1,113 +1,5 @@
|
|||||||
//!
|
#![doc = include_str!("../README.md")]
|
||||||
//! 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`].
|
|
||||||
//!
|
|
||||||
//! [Hyper]: http://hyper.rs/
|
|
||||||
//! [Hop-by-hop headers]: http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html
|
|
||||||
//! [`httputil.ReverseProxy`]: https://golang.org/pkg/net/http/httputil/#ReverseProxy
|
|
||||||
//!
|
|
||||||
//! # Example
|
|
||||||
//!
|
|
||||||
//! Add these dependencies to your `Cargo.toml` file.
|
|
||||||
//!
|
|
||||||
//! ```toml
|
|
||||||
//! [dependencies]
|
|
||||||
//! hyper-reverse-proxy = "0.5"
|
|
||||||
//! hyper = { version = "0.14", features = ["full"] }
|
|
||||||
//! tokio = { version = "1", features = ["full"] }
|
|
||||||
//! ```
|
|
||||||
//!
|
|
||||||
//! To enable support for connecting to downstream HTTPS servers, enable the `https` feature:
|
|
||||||
//!
|
|
||||||
//! ```toml
|
|
||||||
//! hyper-reverse-proxy = { version = "0.4", features = ["https"] }
|
|
||||||
//! ```
|
|
||||||
//!
|
|
||||||
//! The following example will set up a reverse proxy listening on `127.0.0.1:13900`,
|
|
||||||
//! and will proxy these calls:
|
|
||||||
//!
|
|
||||||
//! * `"/target/first"` will be proxied to `http://127.0.0.1:13901`
|
|
||||||
//!
|
|
||||||
//! * `"/target/second"` will be proxied to `http://127.0.0.1:13902`
|
|
||||||
//!
|
|
||||||
//! * All other URLs will be handled by `debug_request` function, that will display request information.
|
|
||||||
//!
|
|
||||||
//! ```rust,no_run
|
|
||||||
//! use hyper::server::conn::AddrStream;
|
|
||||||
//! use hyper::service::{make_service_fn, service_fn};
|
|
||||||
//! use hyper::{Body, Request, Response, Server, StatusCode};
|
|
||||||
//! use hyper_reverse_proxy::ReverseProxy;
|
|
||||||
//! use hyper_trust_dns::{RustlsHttpsConnector, TrustDnsResolver};
|
|
||||||
//! use std::net::IpAddr;
|
|
||||||
//! use std::{convert::Infallible, net::SocketAddr};
|
|
||||||
//!
|
|
||||||
//! lazy_static::lazy_static! {
|
|
||||||
//! static ref PROXY_CLIENT: ReverseProxy<RustlsHttpsConnector> = {
|
|
||||||
//! ReverseProxy::new(
|
|
||||||
//! hyper::Client::builder().build::<_, hyper::Body>(TrustDnsResolver::default().into_rustls_webpki_https_connector()),
|
|
||||||
//! )
|
|
||||||
//! };
|
|
||||||
//! }
|
|
||||||
//!
|
|
||||||
//! fn debug_request(req: &Request<Body>) -> Result<Response<Body>, Infallible> {
|
|
||||||
//! let body_str = format!("{:?}", req);
|
|
||||||
//! Ok(Response::new(Body::from(body_str)))
|
|
||||||
//! }
|
|
||||||
//!
|
|
||||||
//! async fn handle(client_ip: IpAddr, req: Request<Body>) -> Result<Response<Body>, Infallible> {
|
|
||||||
//! if req.uri().path().starts_with("/target/first") {
|
|
||||||
//! match PROXY_CLIENT.call(client_ip, "http://127.0.0.1:13901", req)
|
|
||||||
//! .await
|
|
||||||
//! {
|
|
||||||
//! Ok(response) => {
|
|
||||||
//! Ok(response)
|
|
||||||
//! },
|
|
||||||
//! Err(_error) => {
|
|
||||||
//! Ok(Response::builder()
|
|
||||||
//! .status(StatusCode::INTERNAL_SERVER_ERROR)
|
|
||||||
//! .body(Body::empty())
|
|
||||||
//! .unwrap())},
|
|
||||||
//! }
|
|
||||||
//! } else if req.uri().path().starts_with("/target/second") {
|
|
||||||
//! match PROXY_CLIENT.call(client_ip, "http://127.0.0.1:13902", req)
|
|
||||||
//! .await
|
|
||||||
//! {
|
|
||||||
//! Ok(response) => Ok(response),
|
|
||||||
//! Err(_error) => Ok(Response::builder()
|
|
||||||
//! .status(StatusCode::INTERNAL_SERVER_ERROR)
|
|
||||||
//! .body(Body::empty())
|
|
||||||
//! .unwrap()),
|
|
||||||
//! }
|
|
||||||
//! } else {
|
|
||||||
//! debug_request(&req)
|
|
||||||
//! }
|
|
||||||
//! }
|
|
||||||
//!
|
|
||||||
//! #[tokio::main]
|
|
||||||
//! async fn main() {
|
|
||||||
//! let bind_addr = "127.0.0.1:8000";
|
|
||||||
//! let addr: SocketAddr = bind_addr.parse().expect("Could not parse ip:port.");
|
|
||||||
//!
|
|
||||||
//! let make_svc = make_service_fn(|conn: &AddrStream| {
|
|
||||||
//! let remote_addr = conn.remote_addr().ip();
|
|
||||||
//! async move { Ok::<_, Infallible>(service_fn(move |req| handle(remote_addr, req))) }
|
|
||||||
//! });
|
|
||||||
//!
|
|
||||||
//! let server = Server::bind(&addr).serve(make_svc);
|
|
||||||
//!
|
|
||||||
//! println!("Running server on {:?}", addr);
|
|
||||||
//!
|
|
||||||
//! if let Err(e) = server.await {
|
|
||||||
//! eprintln!("server error: {}", e);
|
|
||||||
//! }
|
|
||||||
//! }
|
|
||||||
//!
|
|
||||||
//! ```
|
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate tracing;
|
extern crate tracing;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user