feat(server): add experimental pipeline flush aggregation option to Http
By enabling `Http::pipeline`, the connection will aggregate response writes to try to improve sending more responses in a single syscall.
This commit is contained in:
@@ -49,6 +49,7 @@ pub use http::request::Request;
|
||||
/// configured with various protocol-level options such as keepalive.
|
||||
pub struct Http<B = ::Chunk> {
|
||||
keep_alive: bool,
|
||||
pipeline: bool,
|
||||
_marker: PhantomData<B>,
|
||||
}
|
||||
|
||||
@@ -73,6 +74,7 @@ impl<B: AsRef<[u8]> + 'static> Http<B> {
|
||||
pub fn new() -> Http<B> {
|
||||
Http {
|
||||
keep_alive: true,
|
||||
pipeline: false,
|
||||
_marker: PhantomData,
|
||||
}
|
||||
}
|
||||
@@ -85,6 +87,16 @@ impl<B: AsRef<[u8]> + 'static> Http<B> {
|
||||
self
|
||||
}
|
||||
|
||||
/// Aggregates flushes to better support pipelined responses.
|
||||
///
|
||||
/// Experimental, may be have bugs.
|
||||
///
|
||||
/// Default is false.
|
||||
pub fn pipeline(&mut self, enabled: bool) -> &mut Self {
|
||||
self.pipeline = enabled;
|
||||
self
|
||||
}
|
||||
|
||||
/// Bind the provided `addr` and return a server ready to handle
|
||||
/// connections.
|
||||
///
|
||||
@@ -185,6 +197,7 @@ impl<B> fmt::Debug for Http<B> {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
f.debug_struct("Http")
|
||||
.field("keep_alive", &self.keep_alive)
|
||||
.field("pipeline", &self.pipeline)
|
||||
.finish()
|
||||
}
|
||||
}
|
||||
@@ -223,8 +236,10 @@ impl<T, B> ServerProto<T> for Http<B>
|
||||
} else {
|
||||
http::KA::Disabled
|
||||
};
|
||||
let mut conn = http::Conn::new(io, ka);
|
||||
conn.set_flush_pipeline(self.pipeline);
|
||||
__ProtoBindTransport {
|
||||
inner: future::ok(http::Conn::new(io, ka)),
|
||||
inner: future::ok(conn),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user