feat(server): implement forgotten settings for case preserving
This commit is contained in:
committed by
Sean McArthur
parent
a303b3c329
commit
4fd6c4cb0b
@@ -23,14 +23,21 @@ type HttpClient = Client<hyper::client::HttpConnector>;
|
|||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
async fn main() {
|
async fn main() {
|
||||||
let addr = SocketAddr::from(([127, 0, 0, 1], 8100));
|
let addr = SocketAddr::from(([127, 0, 0, 1], 8100));
|
||||||
let client = HttpClient::new();
|
|
||||||
|
let client = Client::builder()
|
||||||
|
.http1_title_case_headers(true)
|
||||||
|
.http1_preserve_header_case(true)
|
||||||
|
.build_http();
|
||||||
|
|
||||||
let make_service = make_service_fn(move |_| {
|
let make_service = make_service_fn(move |_| {
|
||||||
let client = client.clone();
|
let client = client.clone();
|
||||||
async move { Ok::<_, Infallible>(service_fn(move |req| proxy(client.clone(), req))) }
|
async move { Ok::<_, Infallible>(service_fn(move |req| proxy(client.clone(), req))) }
|
||||||
});
|
});
|
||||||
|
|
||||||
let server = Server::bind(&addr).serve(make_service);
|
let server = Server::bind(&addr)
|
||||||
|
.http1_preserve_header_case(true)
|
||||||
|
.http1_title_case_headers(true)
|
||||||
|
.serve(make_service);
|
||||||
|
|
||||||
println!("Listening on http://{}", addr);
|
println!("Listening on http://{}", addr);
|
||||||
|
|
||||||
|
|||||||
@@ -89,6 +89,7 @@ pub struct Http<E = Exec> {
|
|||||||
h1_half_close: bool,
|
h1_half_close: bool,
|
||||||
h1_keep_alive: bool,
|
h1_keep_alive: bool,
|
||||||
h1_title_case_headers: bool,
|
h1_title_case_headers: bool,
|
||||||
|
h1_preserve_header_case: bool,
|
||||||
#[cfg(feature = "http2")]
|
#[cfg(feature = "http2")]
|
||||||
h2_builder: proto::h2::server::Config,
|
h2_builder: proto::h2::server::Config,
|
||||||
mode: ConnectionMode,
|
mode: ConnectionMode,
|
||||||
@@ -236,6 +237,7 @@ impl Http {
|
|||||||
h1_half_close: false,
|
h1_half_close: false,
|
||||||
h1_keep_alive: true,
|
h1_keep_alive: true,
|
||||||
h1_title_case_headers: false,
|
h1_title_case_headers: false,
|
||||||
|
h1_preserve_header_case: false,
|
||||||
#[cfg(feature = "http2")]
|
#[cfg(feature = "http2")]
|
||||||
h2_builder: Default::default(),
|
h2_builder: Default::default(),
|
||||||
mode: ConnectionMode::default(),
|
mode: ConnectionMode::default(),
|
||||||
@@ -301,6 +303,19 @@ impl<E> Http<E> {
|
|||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Set whether HTTP/1 connections will write header names as provided
|
||||||
|
/// at the socket level.
|
||||||
|
///
|
||||||
|
/// Note that this setting does not affect HTTP/2.
|
||||||
|
///
|
||||||
|
/// Default is false.
|
||||||
|
#[cfg(feature = "http1")]
|
||||||
|
#[cfg_attr(docsrs, doc(cfg(feature = "http1")))]
|
||||||
|
pub fn http1_preserve_header_case(&mut self, enabled: bool) -> &mut Self {
|
||||||
|
self.h1_preserve_header_case = enabled;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
/// Sets whether HTTP2 is required.
|
/// Sets whether HTTP2 is required.
|
||||||
///
|
///
|
||||||
/// Default is false
|
/// Default is false
|
||||||
@@ -475,6 +490,7 @@ impl<E> Http<E> {
|
|||||||
h1_half_close: self.h1_half_close,
|
h1_half_close: self.h1_half_close,
|
||||||
h1_keep_alive: self.h1_keep_alive,
|
h1_keep_alive: self.h1_keep_alive,
|
||||||
h1_title_case_headers: self.h1_title_case_headers,
|
h1_title_case_headers: self.h1_title_case_headers,
|
||||||
|
h1_preserve_header_case: self.h1_preserve_header_case,
|
||||||
#[cfg(feature = "http2")]
|
#[cfg(feature = "http2")]
|
||||||
h2_builder: self.h2_builder,
|
h2_builder: self.h2_builder,
|
||||||
mode: self.mode,
|
mode: self.mode,
|
||||||
@@ -533,6 +549,9 @@ impl<E> Http<E> {
|
|||||||
if self.h1_title_case_headers {
|
if self.h1_title_case_headers {
|
||||||
conn.set_title_case_headers();
|
conn.set_title_case_headers();
|
||||||
}
|
}
|
||||||
|
if self.h1_preserve_header_case {
|
||||||
|
conn.set_preserve_header_case();
|
||||||
|
}
|
||||||
conn.set_flush_pipeline(self.pipeline_flush);
|
conn.set_flush_pipeline(self.pipeline_flush);
|
||||||
if let Some(max) = self.max_buf_size {
|
if let Some(max) = self.max_buf_size {
|
||||||
conn.set_max_buf_size(max);
|
conn.set_max_buf_size(max);
|
||||||
|
|||||||
@@ -244,6 +244,19 @@ impl<I, E> Builder<I, E> {
|
|||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Set whether HTTP/1 connections will write header names as provided
|
||||||
|
/// at the socket level.
|
||||||
|
///
|
||||||
|
/// Note that this setting does not affect HTTP/2.
|
||||||
|
///
|
||||||
|
/// Default is false.
|
||||||
|
#[cfg(feature = "http1")]
|
||||||
|
#[cfg_attr(docsrs, doc(cfg(feature = "http1")))]
|
||||||
|
pub fn http1_preserve_header_case(mut self, val: bool) -> Self {
|
||||||
|
self.protocol.http1_preserve_header_case(val);
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
/// Sets whether HTTP/1 is required.
|
/// Sets whether HTTP/1 is required.
|
||||||
///
|
///
|
||||||
/// Default is `false`.
|
/// Default is `false`.
|
||||||
|
|||||||
Reference in New Issue
Block a user