Skip to content

Commit 5690d7e

Browse files
authored
Merge pull request #99 from neoeinstein/restore-prior-functionality
feat: restore ability to control HTTP config and set `TCP_NODELAY`
2 parents 0090643 + b66c08a commit 5690d7e

File tree

2 files changed

+52
-2
lines changed

2 files changed

+52
-2
lines changed

src/accept.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ use std::{
55
io,
66
};
77

8+
use tokio::net::TcpStream;
9+
810
/// An asynchronous function to modify io stream and service.
911
pub trait Accept<I, S> {
1012
/// IO stream produced by accept.
@@ -40,3 +42,24 @@ impl<I, S> Accept<I, S> for DefaultAcceptor {
4042
std::future::ready(Ok((stream, service)))
4143
}
4244
}
45+
46+
/// An acceptor that sets `TCP_NODELAY` on accepted streams.
47+
#[derive(Clone, Copy, Debug, Default)]
48+
pub struct NoDelayAcceptor;
49+
50+
impl NoDelayAcceptor {
51+
/// Create a new acceptor that sets `TCP_NODELAY` on accepted streams.
52+
pub fn new() -> Self {
53+
Self::default()
54+
}
55+
}
56+
57+
impl<S> Accept<TcpStream, S> for NoDelayAcceptor {
58+
type Stream = TcpStream;
59+
type Service = S;
60+
type Future = Ready<io::Result<(Self::Stream, Self::Service)>>;
61+
62+
fn accept(&self, stream: TcpStream, service: S) -> Self::Future {
63+
std::future::ready(stream.set_nodelay(true).and(Ok((stream, service))))
64+
}
65+
}

src/server.rs

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ use hyper_util::{
1212
server::conn::auto::Builder,
1313
};
1414
use std::{
15+
fmt,
1516
io::{self, ErrorKind},
1617
net::SocketAddr,
1718
time::Duration,
@@ -22,13 +23,27 @@ use tokio::{
2223
};
2324

2425
/// HTTP server.
25-
#[derive(Debug)]
2626
pub struct Server<A = DefaultAcceptor> {
2727
acceptor: A,
28+
builder: Builder<TokioExecutor>,
2829
listener: Listener,
2930
handle: Handle,
3031
}
3132

33+
// Builder doesn't implement Debug or Clone right now
34+
impl<A> fmt::Debug for Server<A>
35+
where
36+
A: fmt::Debug,
37+
{
38+
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
39+
f.debug_struct("Server")
40+
.field("acceptor", &self.acceptor)
41+
.field("listener", &self.listener)
42+
.field("handle", &self.handle)
43+
.finish_non_exhaustive()
44+
}
45+
}
46+
3247
#[derive(Debug)]
3348
enum Listener {
3449
Bind(SocketAddr),
@@ -49,10 +64,12 @@ impl Server {
4964
/// Create a server that will bind to provided address.
5065
pub fn bind(addr: SocketAddr) -> Self {
5166
let acceptor = DefaultAcceptor::new();
67+
let builder = Builder::new(TokioExecutor::new());
5268
let handle = Handle::new();
5369

5470
Self {
5571
acceptor,
72+
builder,
5673
listener: Listener::Bind(addr),
5774
handle,
5875
}
@@ -61,10 +78,12 @@ impl Server {
6178
/// Create a server from existing `std::net::TcpListener`.
6279
pub fn from_tcp(listener: std::net::TcpListener) -> Self {
6380
let acceptor = DefaultAcceptor::new();
81+
let builder = Builder::new(TokioExecutor::new());
6482
let handle = Handle::new();
6583

6684
Self {
6785
acceptor,
86+
builder,
6887
listener: Listener::Std(listener),
6988
handle,
7089
}
@@ -76,6 +95,7 @@ impl<A> Server<A> {
7695
pub fn acceptor<Acceptor>(self, acceptor: Acceptor) -> Server<Acceptor> {
7796
Server {
7897
acceptor,
98+
builder: self.builder,
7999
listener: self.listener,
80100
handle: self.handle,
81101
}
@@ -88,6 +108,7 @@ impl<A> Server<A> {
88108
{
89109
Server {
90110
acceptor: acceptor(self.acceptor),
111+
builder: self.builder,
91112
listener: self.listener,
92113
handle: self.handle,
93114
}
@@ -103,6 +124,11 @@ impl<A> Server<A> {
103124
&mut self.acceptor
104125
}
105126

127+
/// Returns a mutable reference to the Http builder.
128+
pub fn http_builder(&mut self) -> &mut Builder<TokioExecutor> {
129+
&mut self.builder
130+
}
131+
106132
/// Provide a handle for additional utilities.
107133
pub fn handle(mut self, handle: Handle) -> Self {
108134
self.handle = handle;
@@ -134,6 +160,7 @@ impl<A> Server<A> {
134160
{
135161
let acceptor = self.acceptor;
136162
let handle = self.handle;
163+
let builder = std::sync::Arc::new(self.builder);
137164

138165
let mut incoming = match bind_incoming(self.listener).await {
139166
Ok(v) => v,
@@ -164,14 +191,14 @@ impl<A> Server<A> {
164191

165192
let acceptor = acceptor.clone();
166193
let watcher = handle.watcher();
194+
let builder = builder.clone();
167195

168196
tokio::spawn(async move {
169197
if let Ok((stream, send_service)) = acceptor.accept(tcp_stream, service).await {
170198
let io = TokioIo::new(stream);
171199
let service = send_service.into_service();
172200
let service = TowerToHyperService::new(service);
173201

174-
let builder = Builder::new(TokioExecutor::new());
175202
let serve_future = builder.serve_connection_with_upgrades(io, service);
176203
tokio::pin!(serve_future);
177204

0 commit comments

Comments
 (0)