Correctly handle HEAD requests (#129)

This commit is contained in:
David Pedersen
2021-08-15 20:27:13 +02:00
committed by GitHub
parent 9cd543401f
commit 995ffc1aa2
9 changed files with 184 additions and 22 deletions
+73
View File
@@ -0,0 +1,73 @@
use super::*;
use http::Method;
use tower::ServiceExt;
mod for_handlers {
use super::*;
#[tokio::test]
async fn get_handles_head() {
let app = route(
"/",
get(|| async {
let mut headers = HeaderMap::new();
headers.insert("x-some-header", "foobar".parse().unwrap());
(headers, "you shouldn't see this")
}),
);
// don't use reqwest because it always strips bodies from HEAD responses
let res = app
.oneshot(
Request::builder()
.uri("/")
.method(Method::HEAD)
.body(Body::empty())
.unwrap(),
)
.await
.unwrap();
assert_eq!(res.status(), StatusCode::OK);
assert_eq!(res.headers()["x-some-header"], "foobar");
let body = hyper::body::to_bytes(res.into_body()).await.unwrap();
assert_eq!(body.len(), 0);
}
}
mod for_services {
use super::*;
use crate::service::get;
#[tokio::test]
async fn get_handles_head() {
let app = route(
"/",
get((|| async {
let mut headers = HeaderMap::new();
headers.insert("x-some-header", "foobar".parse().unwrap());
(headers, "you shouldn't see this")
})
.into_service()),
);
// don't use reqwest because it always strips bodies from HEAD responses
let res = app
.oneshot(
Request::builder()
.uri("/")
.method(Method::HEAD)
.body(Body::empty())
.unwrap(),
)
.await
.unwrap();
assert_eq!(res.status(), StatusCode::OK);
assert_eq!(res.headers()["x-some-header"], "foobar");
let body = hyper::body::to_bytes(res.into_body()).await.unwrap();
assert_eq!(body.len(), 0);
}
}
+5 -1
View File
@@ -5,7 +5,10 @@ use crate::{
};
use bytes::Bytes;
use futures_util::future::Ready;
use http::{header::AUTHORIZATION, Request, Response, StatusCode, Uri};
use http::{
header::{HeaderMap, AUTHORIZATION},
Request, Response, StatusCode, Uri,
};
use hyper::{Body, Server};
use serde::Deserialize;
use serde_json::json;
@@ -18,6 +21,7 @@ use std::{
};
use tower::{make::Shared, service_fn, BoxError, Service};
mod get_to_head;
mod handle_error;
mod nest;
mod or;