Skip to content

Commit b1284d1

Browse files
authored
Merge pull request #7 from http-rs/tide-v0.15
update for tide v0.15
2 parents fdc699b + d0b3e40 commit b1284d1

File tree

3 files changed

+93
-27
lines changed

3 files changed

+93
-27
lines changed

Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ keywords = ["tide", "https", "tls"]
1212
categories = ["web-programming::http-server", "web-programming"]
1313

1414
[dependencies]
15-
async-std = "1.6.5"
16-
tide = { version = "0.14.0", default-features = false }
15+
async-std = "1.7.0"
16+
tide = { version = "0.15.0", default-features = false }
1717
async-tls = "0.10.0"
1818
rustls = "0.18.1"
1919
async-h1 = "2.1.2"

src/tls_listener.rs

Lines changed: 68 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use crate::{TcpConnection, TlsListenerBuilder, TlsListenerConfig, TlsStreamWrapper};
22

3+
use tide::listener::ListenInfo;
34
use tide::listener::{Listener, ToListener};
45
use tide::Server;
56

@@ -19,15 +20,36 @@ use std::sync::Arc;
1920
use std::time::Duration;
2021

2122
/// The primary type for this crate
22-
#[derive(Debug)]
23-
pub struct TlsListener {
23+
pub struct TlsListener<State> {
2424
connection: TcpConnection,
2525
config: TlsListenerConfig,
26+
server: Option<Server<State>>,
2627
}
2728

28-
impl TlsListener {
29+
impl<State> Debug for TlsListener<State> {
30+
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
31+
f.debug_struct("TlsListener")
32+
.field(&"connection", &self.connection)
33+
.field(&"config", &self.config)
34+
.field(
35+
&"server",
36+
if self.server.is_some() {
37+
&"Some(Server<State>)"
38+
} else {
39+
&"None"
40+
},
41+
)
42+
.finish()
43+
}
44+
}
45+
46+
impl<State> TlsListener<State> {
2947
pub(crate) fn new(connection: TcpConnection, config: TlsListenerConfig) -> Self {
30-
Self { connection, config }
48+
Self {
49+
connection,
50+
config,
51+
server: None,
52+
}
3153
}
3254
/// The primary entrypoint to create a TlsListener. See
3355
/// [TlsListenerBuilder](crate::TlsListenerBuilder) for more
@@ -37,13 +59,13 @@ impl TlsListener {
3759
///
3860
/// ```rust
3961
/// # use tide_rustls::TlsListener;
40-
/// let listener = TlsListener::build()
62+
/// let listener = TlsListener::<()>::build()
4163
/// .addrs("localhost:4433")
4264
/// .cert("./tls/localhost-4433.cert")
4365
/// .key("./tls/localhost-4433.key")
4466
/// .finish();
4567
/// ```
46-
pub fn build() -> TlsListenerBuilder {
68+
pub fn build() -> TlsListenerBuilder<State> {
4769
TlsListenerBuilder::new()
4870
}
4971

@@ -77,6 +99,20 @@ impl TlsListener {
7799
}
78100
}
79101

102+
fn acceptor(&self) -> Option<&TlsAcceptor> {
103+
match self.config {
104+
TlsListenerConfig::Acceptor(ref a) => Some(a),
105+
_ => None,
106+
}
107+
}
108+
109+
fn tcp(&self) -> Option<&TcpListener> {
110+
match self.connection {
111+
TcpConnection::Connected(ref t) => Some(t),
112+
_ => None,
113+
}
114+
}
115+
80116
async fn connect(&mut self) -> io::Result<&TcpListener> {
81117
if let TcpConnection::Addrs(addrs) = &self.connection {
82118
let tcp = TcpListener::bind(&addrs[..]).await?;
@@ -125,44 +161,59 @@ fn handle_tls<State: Clone + Send + Sync + 'static>(
125161
});
126162
}
127163

128-
impl<State: Clone + Send + Sync + 'static> ToListener<State> for TlsListener {
164+
impl<State: Clone + Send + Sync + 'static> ToListener<State> for TlsListener<State> {
129165
type Listener = Self;
130166
fn to_listener(self) -> io::Result<Self::Listener> {
131167
Ok(self)
132168
}
133169
}
134170

135-
impl<State: Clone + Send + Sync + 'static> ToListener<State> for TlsListenerBuilder {
136-
type Listener = TlsListener;
171+
impl<State: Clone + Send + Sync + 'static> ToListener<State> for TlsListenerBuilder<State> {
172+
type Listener = TlsListener<State>;
137173
fn to_listener(self) -> io::Result<Self::Listener> {
138174
self.finish()
139175
}
140176
}
141177

142178
#[tide::utils::async_trait]
143-
impl<State: Clone + Send + Sync + 'static> Listener<State> for TlsListener {
144-
async fn listen(&mut self, app: Server<State>) -> io::Result<()> {
145-
let acceptor = self.configure().await?;
146-
let listener = self.connect().await?;
179+
impl<State: Clone + Send + Sync + 'static> Listener<State> for TlsListener<State> {
180+
async fn bind(&mut self, server: Server<State>) -> io::Result<()> {
181+
self.configure().await?;
182+
self.connect().await?;
183+
self.server = Some(server);
184+
Ok(())
185+
}
186+
187+
async fn accept(&mut self) -> io::Result<()> {
188+
let listener = self.tcp().unwrap();
147189
let mut incoming = listener.incoming();
190+
let acceptor = self.acceptor().unwrap();
191+
let server = self.server.as_ref().unwrap();
148192

149193
while let Some(stream) = incoming.next().await {
150194
match stream {
151195
Err(ref e) if is_transient_error(e) => continue,
196+
152197
Err(error) => {
153198
let delay = Duration::from_millis(500);
154199
tide::log::error!("Error: {}. Pausing for {:?}.", error, delay);
155200
task::sleep(delay).await;
156201
continue;
157202
}
158203

159-
Ok(stream) => {
160-
handle_tls(app.clone(), stream, acceptor.clone());
161-
}
204+
Ok(stream) => handle_tls(server.clone(), stream, acceptor.clone()),
162205
};
163206
}
164207
Ok(())
165208
}
209+
210+
fn info(&self) -> Vec<ListenInfo> {
211+
vec![ListenInfo::new(
212+
self.connection.to_string(),
213+
String::from("tcp"),
214+
true,
215+
)]
216+
}
166217
}
167218

168219
fn is_transient_error(e: &io::Error) -> bool {
@@ -173,7 +224,7 @@ fn is_transient_error(e: &io::Error) -> bool {
173224
)
174225
}
175226

176-
impl Display for TlsListener {
227+
impl<State> Display for TlsListener<State> {
177228
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
178229
write!(f, "{}", self.connection)
179230
}

src/tls_listener_builder.rs

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use rustls::ServerConfig;
55

66
use super::{TcpConnection, TlsListener, TlsListenerConfig};
77

8+
use std::marker::PhantomData;
89
use std::net::{SocketAddr, ToSocketAddrs};
910
use std::path::{Path, PathBuf};
1011

@@ -19,7 +20,7 @@ use std::path::{Path, PathBuf};
1920
///
2021
/// ```rust
2122
/// # use tide_rustls::TlsListener;
22-
/// let listener = TlsListener::build()
23+
/// let listener = TlsListener::<()>::build()
2324
/// .addrs("localhost:4433")
2425
/// .cert("./tls/localhost-4433.cert")
2526
/// .key("./tls/localhost-4433.key")
@@ -28,21 +29,34 @@ use std::path::{Path, PathBuf};
2829
///
2930
/// ```rust
3031
/// # use tide_rustls::TlsListener;
31-
/// let listener = TlsListener::build()
32+
/// let listener = TlsListener::<()>::build()
3233
/// .tcp(std::net::TcpListener::bind("localhost:4433").unwrap())
3334
/// .config(rustls::ServerConfig::new(rustls::NoClientAuth::new()))
3435
/// .finish();
3536
/// ```
36-
#[derive(Default)]
37-
pub struct TlsListenerBuilder {
37+
pub struct TlsListenerBuilder<State> {
3838
key: Option<PathBuf>,
3939
cert: Option<PathBuf>,
4040
config: Option<ServerConfig>,
4141
tcp: Option<TcpListener>,
4242
addrs: Option<Vec<SocketAddr>>,
43+
_state: PhantomData<State>,
4344
}
4445

45-
impl std::fmt::Debug for TlsListenerBuilder {
46+
impl<State> Default for TlsListenerBuilder<State> {
47+
fn default() -> Self {
48+
Self {
49+
key: None,
50+
cert: None,
51+
config: None,
52+
tcp: None,
53+
addrs: None,
54+
_state: PhantomData,
55+
}
56+
}
57+
}
58+
59+
impl<State> std::fmt::Debug for TlsListenerBuilder<State> {
4660
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
4761
f.debug_struct("TlsListenerBuilder")
4862
.field("key", &self.key)
@@ -61,9 +75,9 @@ impl std::fmt::Debug for TlsListenerBuilder {
6175
}
6276
}
6377

64-
impl TlsListenerBuilder {
78+
impl<State> TlsListenerBuilder<State> {
6579
pub(crate) fn new() -> Self {
66-
TlsListenerBuilder::default()
80+
Self::default()
6781
}
6882

6983
/// Provide a path to a key file, in either pkcs8 or rsa
@@ -123,13 +137,14 @@ impl TlsListenerBuilder {
123137
/// * either of these is provided, but not both
124138
/// * both [`TlsListenerBuilder::cert`] AND [`TlsListenerBuilder::key`]
125139
/// * [`TlsListenerBuilder::config`]
126-
pub fn finish(self) -> io::Result<TlsListener> {
140+
pub fn finish(self) -> io::Result<TlsListener<State>> {
127141
let Self {
128142
key,
129143
cert,
130144
config,
131145
tcp,
132146
addrs,
147+
..
133148
} = self;
134149

135150
let config = match (key, cert, config) {

0 commit comments

Comments
 (0)