Hyper Middleware

A compact HTTP middleware and handler system for Hyper 0.14.x
.
NOTE: This crate is still under active development.
Features
Example
examples/server.rs
#![deny(warnings)]
use hyper::{header, Server, StatusCode};
use std::{net::SocketAddr, path::PathBuf};
use hyper_middleware::{
AfterMiddleware, BeforeMiddleware, Body, Chain, Error, Handler, Request, Response, Result,
Service,
};
struct Config {
pub root: PathBuf,
}
struct Application {
opts: Config,
}
impl Handler for Application {
fn handle(&self, req: &mut Request) -> Result<Response> {
println!("Handler - URI Path: {}", req.uri().path());
println!("Config Root: {}", self.opts.root.display());
println!(
"Remote Addr: {}",
req.extensions().get::<SocketAddr>().unwrap()
);
Ok(Response::builder().body(Body::from("¡Hola!")).unwrap())
}
}
struct FirstMiddleware {}
impl BeforeMiddleware for FirstMiddleware {
fn before(&self, req: &mut Request) -> Result {
println!("First Middleware called!");
println!("First - URI Path: {}", req.uri().path());
Ok(())
}
fn catch(&self, _: &mut Request, err: Error) -> Result {
Err(err)
}
}
struct SecondMiddleware {}
impl AfterMiddleware for SecondMiddleware {
fn after(&self, _: &mut Request, mut res: Response) -> Result<Response> {
println!("Second Middleware called!");
res.headers_mut().insert(
header::CONTENT_TYPE,
"text/html; charset=utf-8".parse().unwrap(),
);
Ok(res)
}
fn catch(&self, _: &mut Request, err: Error) -> Result<Response> {
Ok(Response::builder()
.status(StatusCode::NOT_FOUND)
.body(Body::from(err.to_string()))
.unwrap())
}
}
#[tokio::main(flavor = "multi_thread")]
async fn main() -> Result {
let opts = Config {
root: std::env::current_dir().unwrap(),
};
let mut handler = Chain::new(Application { opts });
handler.link_before(FirstMiddleware {});
handler.link_after(SecondMiddleware {});
let service = Service::new(handler);
let addr = ([127, 0, 0, 1], 8787).into();
let server = Server::bind(&addr).serve(service);
println!("Listening on http://{}", addr);
server.await?;
Ok(())
}
To run the example just type:
cargo run --example server
Contributions
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in current work by you, as defined in the Apache-2.0 license, shall be dual licensed as described below, without any additional terms or conditions.
Feel free to send some Pull request or file an issue.
License
This work is primarily distributed under the terms of both the MIT license and the Apache License (Version 2.0).
© 2022-present Jose Quintana