Add support for extracting typed headers (#18)

Uses the `headers` crate.
This commit is contained in:
David Pedersen
2021-06-15 21:27:21 +02:00
committed by GitHub
parent 2f6699aeae
commit b6e67eefd7
5 changed files with 91 additions and 1 deletions
+28 -1
View File
@@ -1,4 +1,4 @@
use crate::{handler::on, prelude::*, routing::MethodFilter, service};
use crate::{handler::on, prelude::*, response::IntoResponse, routing::MethodFilter, service};
use bytes::Bytes;
use http::{Request, Response, StatusCode};
use hyper::{Body, Server};
@@ -580,6 +580,33 @@ async fn disjunction() {
assert_eq!(res.text().await.unwrap(), "v0: games#show (123)");
}
#[tokio::test]
async fn typed_header() {
use extract::TypedHeader;
async fn handle(TypedHeader(user_agent): TypedHeader<headers::UserAgent>) -> impl IntoResponse {
user_agent.to_string()
}
let app = route("/", get(handle));
let addr = run_in_background(app).await;
let client = reqwest::Client::new();
let res = client
.get(format!("http://{}", addr))
.header("user-agent", "foobar")
.send()
.await
.unwrap();
let body = res.text().await.unwrap();
assert_eq!(body, "foobar");
let res = client.get(format!("http://{}", addr)).send().await.unwrap();
let body = res.text().await.unwrap();
assert_eq!(body, "invalid HTTP header (user-agent)");
}
/// Run a `tower::Service` in the background and get a URI for it.
async fn run_in_background<S, ResBody>(svc: S) -> SocketAddr
where