Skip to content

Commit 51cc866

Browse files
authored
Version 0.8.0 (#167)
Make `Server` generic over streams and support Unix sockets
2 parents 759ebbe + 3a66168 commit 51cc866

File tree

11 files changed

+245
-82
lines changed

11 files changed

+245
-82
lines changed

Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ fs-err = { version = "3", features = ["tokio"] }
4242
http = "1.1"
4343
http-body = "1.0"
4444
hyper = { version = "1.4", features = ["http1", "http2", "server"] }
45-
tokio = { version = "1", features = ["macros", "net", "sync"] }
45+
tokio = { version = ">=1.41", features = ["macros", "net", "sync"] }
4646
tower-service = "0.3"
4747
hyper-util = { version = "0.1.18", features = [
4848
"server-auto",
@@ -71,7 +71,7 @@ futures-util = { version = "0.3", default-features = false }
7171
http-body-util = "0.1"
7272
axum = "0.7"
7373
hyper = { version = "1.4", features = ["full"] }
74-
tokio = { version = "1", features = ["full"] }
74+
tokio = { version = ">=1.41", features = ["full"] }
7575
tower = { version = "0.5", features = ["util"] }
7676
tower-http = { version = "0.6", features = ["add-extension"] }
7777

examples/from_std_listener.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ async fn main() {
1313
let listener = TcpListener::bind(addr).unwrap();
1414
println!("listening on {}", addr);
1515
axum_server::from_tcp(listener)
16+
.unwrap()
1617
.serve(app.into_make_service())
1718
.await
1819
.unwrap();

examples/from_std_listener_rustls.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ async fn main() {
2222
let listener = TcpListener::bind(addr).unwrap();
2323
println!("listening on {}", addr);
2424
axum_server::from_tcp_rustls(listener, config)
25+
.unwrap()
2526
.serve(app.into_make_service())
2627
.await
2728
.unwrap();

examples/graceful_shutdown.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ async fn main() {
3232
println!("server is shut down");
3333
}
3434

35-
async fn graceful_shutdown(handle: Handle) {
35+
async fn graceful_shutdown(handle: Handle<SocketAddr>) {
3636
// Wait 10 seconds.
3737
sleep(Duration::from_secs(10)).await;
3838

examples/hello_world_unix.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
//! Run with `cargo run --example hello_world_unix` command.
2+
//!
3+
//! To make a request using curl, try `curl --unix-socket /tmp/axum-server.sock http:/localhost`
4+
5+
use axum::{routing::get, Router};
6+
use std::os::unix::net::SocketAddr;
7+
8+
#[tokio::main]
9+
async fn main() {
10+
let app = Router::new().route("/", get(|| async { "Hello, world!" }));
11+
12+
let addr = SocketAddr::from_pathname("/tmp/axum-server.sock").unwrap();
13+
println!("listening on {}", addr.as_pathname().unwrap().display());
14+
axum_server::bind(addr)
15+
.serve(app.into_make_service())
16+
.await
17+
.unwrap();
18+
}

examples/shutdown.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ async fn main() {
2929
println!("server is shut down");
3030
}
3131

32-
async fn shutdown(handle: Handle) {
32+
async fn shutdown(handle: Handle<SocketAddr>) {
3333
// Wait 20 seconds.
3434
sleep(Duration::from_secs(20)).await;
3535

src/handle.rs

Lines changed: 41 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
use crate::notify_once::NotifyOnce;
1+
use crate::{notify_once::NotifyOnce, server::Address};
22
use std::{
3-
net::SocketAddr,
43
sync::{
54
atomic::{AtomicUsize, Ordering},
65
Arc, Mutex,
@@ -10,14 +9,22 @@ use std::{
109
use tokio::{sync::Notify, time::sleep};
1110

1211
/// A handle for [`Server`](crate::server::Server).
13-
#[derive(Clone, Debug, Default)]
14-
pub struct Handle {
15-
inner: Arc<HandleInner>,
12+
#[derive(Clone, Debug)]
13+
pub struct Handle<A: Address> {
14+
inner: Arc<HandleInner<A>>,
1615
}
1716

18-
#[derive(Debug, Default)]
19-
struct HandleInner {
20-
addr: Mutex<Option<SocketAddr>>,
17+
impl<A: Address> Default for Handle<A> {
18+
fn default() -> Self {
19+
Self {
20+
inner: Default::default(),
21+
}
22+
}
23+
}
24+
25+
#[derive(Debug)]
26+
struct HandleInner<A: Address> {
27+
addr: Mutex<Option<A>>,
2128
addr_notify: Notify,
2229
conn_count: AtomicUsize,
2330
shutdown: NotifyOnce,
@@ -26,7 +33,22 @@ struct HandleInner {
2633
conn_end: NotifyOnce,
2734
}
2835

29-
impl Handle {
36+
// Manually implemented as the derive macro will want A to be Default.
37+
impl<A: Address> Default for HandleInner<A> {
38+
fn default() -> Self {
39+
Self {
40+
addr: Default::default(),
41+
addr_notify: Default::default(),
42+
conn_count: Default::default(),
43+
shutdown: Default::default(),
44+
graceful: Default::default(),
45+
graceful_dur: Default::default(),
46+
conn_end: Default::default(),
47+
}
48+
}
49+
}
50+
51+
impl<A: Address> Handle<A> {
3052
/// Create a new handle.
3153
pub fn new() -> Self {
3254
Self::default()
@@ -54,25 +76,25 @@ impl Handle {
5476
/// Returns local address and port when server starts listening.
5577
///
5678
/// Returns `None` if server fails to bind.
57-
pub async fn listening(&self) -> Option<SocketAddr> {
79+
pub async fn listening(&self) -> Option<A> {
5880
let notified = self.inner.addr_notify.notified();
5981

60-
if let Some(addr) = *self.inner.addr.lock().unwrap() {
82+
if let Some(addr) = self.inner.addr.lock().unwrap().clone() {
6183
return Some(addr);
6284
}
6385

6486
notified.await;
6587

66-
*self.inner.addr.lock().unwrap()
88+
self.inner.addr.lock().unwrap().clone()
6789
}
6890

69-
pub(crate) fn notify_listening(&self, addr: Option<SocketAddr>) {
91+
pub(crate) fn notify_listening(&self, addr: Option<A>) {
7092
*self.inner.addr.lock().unwrap() = addr;
7193

7294
self.inner.addr_notify.notify_waiters();
7395
}
7496

75-
pub(crate) fn watcher(&self) -> Watcher {
97+
pub(crate) fn watcher(&self) -> Watcher<A> {
7698
Watcher::new(self.clone())
7799
}
78100

@@ -102,12 +124,12 @@ impl Handle {
102124
}
103125
}
104126

105-
pub(crate) struct Watcher {
106-
handle: Handle,
127+
pub(crate) struct Watcher<A: Address> {
128+
handle: Handle<A>,
107129
}
108130

109-
impl Watcher {
110-
fn new(handle: Handle) -> Self {
131+
impl<A: Address> Watcher<A> {
132+
fn new(handle: Handle<A>) -> Self {
111133
handle.inner.conn_count.fetch_add(1, Ordering::SeqCst);
112134

113135
Self { handle }
@@ -122,7 +144,7 @@ impl Watcher {
122144
}
123145
}
124146

125-
impl Drop for Watcher {
147+
impl<A: Address> Drop for Watcher<A> {
126148
fn drop(&mut self) {
127149
let count = self.handle.inner.conn_count.fetch_sub(1, Ordering::SeqCst) - 1;
128150

src/lib.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,9 +105,12 @@ pub use self::{
105105
// addr_incoming_config::AddrIncomingConfig,
106106
handle::Handle,
107107
// http_config::HttpConfig,
108-
server::{bind, from_tcp, Server},
108+
server::{bind, from_tcp, AddrListener, Address, Server},
109109
};
110110

111+
#[cfg(unix)]
112+
pub use self::server::from_unix;
113+
111114
#[cfg(feature = "tls-rustls-no-provider")]
112115
#[cfg_attr(docsrs, doc(cfg(feature = "tls-rustls")))]
113116
pub mod tls_rustls;
@@ -116,6 +119,10 @@ pub mod tls_rustls;
116119
#[cfg(feature = "tls-rustls-no-provider")]
117120
pub use self::tls_rustls::export::{bind_rustls, from_tcp_rustls};
118121

122+
#[doc(inline)]
123+
#[cfg(all(feature = "tls-rustls-no-provider", unix))]
124+
pub use self::tls_rustls::export::from_unix_rustls;
125+
119126
#[cfg(feature = "tls-openssl")]
120127
#[cfg_attr(docsrs, doc(cfg(feature = "tls-openssl")))]
121128
pub mod tls_openssl;

0 commit comments

Comments
 (0)