Server::new is no longer an asynchronous method and has no return value.

Remove `Server::local_addr` method.

Add the `Server::name` method to specify the name of the server, it is only used for logs. #96
This commit is contained in:
Sunli
2021-11-23 13:13:39 +08:00
parent 90be55d140
commit 264e6a0274
45 changed files with 196 additions and 154 deletions

View File

@@ -48,13 +48,11 @@ async fn main() -> Result<(), std::io::Error> {
}
tracing_subscriber::fmt::init();
let listener = TcpListener::bind("127.0.0.1:3000");
let api_service =
OpenApiService::new(Api, "Authorization Demo", "1.0").server("http://localhost:3000/api");
let ui = api_service.swagger_ui();
poem::Server::new(listener)
.await?
poem::Server::new(TcpListener::bind("127.0.0.1:3000"))
.run(Route::new().nest("/api", api_service).nest("/", ui))
.await
}

View File

@@ -29,13 +29,11 @@ async fn main() -> Result<(), std::io::Error> {
}
tracing_subscriber::fmt::init();
let listener = TcpListener::bind("127.0.0.1:3000");
let api_service =
OpenApiService::new(Api, "Authorization Demo", "1.0").server("http://localhost:3000/api");
let ui = api_service.swagger_ui();
poem::Server::new(listener)
.await?
poem::Server::new(TcpListener::bind("127.0.0.1:3000"))
.run(Route::new().nest("/api", api_service).nest("/", ui))
.await
}

View File

@@ -2,7 +2,7 @@ use poem::{
error::{BadRequest, InternalServerError},
handler,
listener::TcpListener,
Result, Route,
Result, Route, Server,
};
use poem_openapi::{
auth::Bearer, payload::PlainText, OAuthScopes, OpenApi, OpenApiService, SecurityScheme,
@@ -87,13 +87,11 @@ async fn main() -> Result<(), std::io::Error> {
}
tracing_subscriber::fmt::init();
let listener = TcpListener::bind("127.0.0.1:3000");
let api_service =
OpenApiService::new(Api, "Authorization Demo", "1.0").server("http://localhost:3000/api");
let ui = api_service.swagger_ui();
poem::Server::new(listener)
.await?
Server::new(TcpListener::bind("127.0.0.1:3000"))
.run(
Route::new()
.at("/proxy", oauth_token_url_proxy)

View File

@@ -1,4 +1,4 @@
use poem::{listener::TcpListener, Route};
use poem::{listener::TcpListener, Route, Server};
use poem_openapi::{OpenApi, OpenApiService};
struct Api1;
@@ -38,13 +38,11 @@ async fn main() -> Result<(), std::io::Error> {
}
tracing_subscriber::fmt::init();
let listener = TcpListener::bind("127.0.0.1:3000");
let api_service = OpenApiService::new(Api1.combine(Api2).combine(Api3), "Combined APIs", "1.0")
.server("http://localhost:3000/api");
let ui = api_service.swagger_ui();
poem::Server::new(listener)
.await?
Server::new(TcpListener::bind("127.0.0.1:3000"))
.run(Route::new().nest("/api", api_service).nest("/", ui))
.await
}

View File

@@ -1,4 +1,4 @@
use poem::{listener::TcpListener, Route};
use poem::{listener::TcpListener, Route, Server};
use poem_openapi::{param::Query, payload::PlainText, OpenApi, OpenApiService};
struct Api;
@@ -21,13 +21,11 @@ async fn main() -> Result<(), std::io::Error> {
}
tracing_subscriber::fmt::init();
let listener = TcpListener::bind("127.0.0.1:3000");
let api_service =
OpenApiService::new(Api, "Hello World", "1.0").server("http://localhost:3000/api");
let ui = api_service.swagger_ui();
poem::Server::new(listener)
.await?
Server::new(TcpListener::bind("127.0.0.1:3000"))
.run(Route::new().nest("/api", api_service).nest("/", ui))
.await
}

View File

@@ -1,4 +1,4 @@
use poem::{listener::TcpListener, Route};
use poem::{listener::TcpListener, Route, Server};
use poem_openapi::{payload::Json, Object, OneOf, OpenApi, OpenApiService};
#[derive(Object, Debug, PartialEq)]
@@ -36,12 +36,10 @@ async fn main() -> Result<(), std::io::Error> {
}
tracing_subscriber::fmt::init();
let listener = TcpListener::bind("127.0.0.1:3000");
let api_service = OpenApiService::new(Api, "Oneof", "1.0").server("http://localhost:3000/api");
let ui = api_service.swagger_ui();
poem::Server::new(listener)
.await?
Server::new(TcpListener::bind("127.0.0.1:3000"))
.run(Route::new().nest("/api", api_service).nest("/", ui))
.await
}

View File

@@ -1,4 +1,4 @@
use poem::{listener::TcpListener, web::Data, EndpointExt, Route};
use poem::{listener::TcpListener, web::Data, EndpointExt, Route, Server};
use poem_openapi::{payload::PlainText, OpenApi, OpenApiService, PoemExtractor};
struct Api;
@@ -18,13 +18,11 @@ async fn main() -> Result<(), std::io::Error> {
}
tracing_subscriber::fmt::init();
let listener = TcpListener::bind("127.0.0.1:3000");
let api_service =
OpenApiService::new(Api, "Poem Extractor", "1.0").server("http://localhost:3000/api");
let ui = api_service.swagger_ui();
poem::Server::new(listener)
.await?
Server::new(TcpListener::bind("127.0.0.1:3000"))
.run(
Route::new()
.nest("/api", api_service.data(100i32))

View File

@@ -22,13 +22,11 @@ async fn main() -> Result<(), std::io::Error> {
}
tracing_subscriber::fmt::init();
let listener = TcpListener::bind("127.0.0.1:3000");
let api_service =
OpenApiService::new(Api, "Poem Middleware", "1.0").server("http://localhost:3000/api");
let ui = api_service.swagger_ui();
poem::Server::new(listener)
.await?
poem::Server::new(TcpListener::bind("127.0.0.1:3000"))
.run(Route::new().nest("/api", api_service).nest("/", ui))
.await
}

View File

@@ -1,6 +1,6 @@
use std::collections::HashMap;
use poem::{error::BadRequest, listener::TcpListener, Result, Route};
use poem::{error::BadRequest, listener::TcpListener, Result, Route, Server};
use poem_openapi::{
param::Path,
payload::{Binary, Json},
@@ -90,7 +90,6 @@ async fn main() -> Result<(), std::io::Error> {
}
tracing_subscriber::fmt::init();
let listener = TcpListener::bind("127.0.0.1:3000");
let api_service = OpenApiService::new(
Api {
status: Mutex::new(Status {
@@ -104,8 +103,7 @@ async fn main() -> Result<(), std::io::Error> {
.server("http://localhost:3000/api");
let ui = api_service.swagger_ui();
poem::Server::new(listener)
.await?
Server::new(TcpListener::bind("127.0.0.1:3000"))
.run(Route::new().nest("/api", api_service).nest("/", ui))
.await
}

View File

@@ -1,4 +1,4 @@
use poem::{listener::TcpListener, Route};
use poem::{listener::TcpListener, Route, Server};
use poem_openapi::{
param::Path, payload::Json, types::Password, ApiResponse, Object, OpenApi, OpenApiService, Tags,
};
@@ -135,13 +135,11 @@ async fn main() -> Result<(), std::io::Error> {
}
tracing_subscriber::fmt::init();
let listener = TcpListener::bind("127.0.0.1:3000");
let api_service =
OpenApiService::new(Api::default(), "Users", "1.0").server("http://localhost:3000/api");
let ui = api_service.swagger_ui();
poem::Server::new(listener)
.await?
Server::new(TcpListener::bind("127.0.0.1:3000"))
.run(Route::new().nest("/api", api_service).nest("/", ui))
.await
}

View File

@@ -39,7 +39,7 @@ async fn main() -> Result<(), std::io::Error> {
println!("Playground: http://localhost:3000");
let listener = TcpListener::bind("127.0.0.1:3000");
let server = Server::new(listener).await?;
server.run(app).await
Server::new(TcpListener::bind("127.0.0.1:3000"))
.run(app)
.await
}

View File

@@ -62,7 +62,7 @@ async fn main() -> Result<(), std::io::Error> {
username: "test".to_string(),
password: "123456".to_string(),
});
let listener = TcpListener::bind("127.0.0.1:3000");
let server = Server::new(listener).await?;
server.run(app).await
Server::new(TcpListener::bind("127.0.0.1:3000"))
.run(app)
.await
}

View File

@@ -20,6 +20,5 @@ async fn main() -> Result<(), std::io::Error> {
let listener = TcpListener::bind("127.0.0.1:3000")
.combine(TcpListener::bind("127.0.0.1:3001"))
.combine(TcpListener::bind("127.0.0.1:3002"));
let server = Server::new(listener).await?;
server.run(app).await
Server::new(listener).run(app).await
}

View File

@@ -22,7 +22,7 @@ async fn main() -> Result<(), std::io::Error> {
let app = Route::new()
.at("/", get(count))
.with(CookieSession::new(CookieConfig::default().secure(false)));
let listener = TcpListener::bind("127.0.0.1:3000");
let server = Server::new(listener).await?;
server.run(app).await
Server::new(TcpListener::bind("127.0.0.1:3000"))
.run(app)
.await
}

View File

@@ -32,7 +32,7 @@ async fn main() -> Result<(), std::io::Error> {
tracing_subscriber::fmt::init();
let app = Route::new().at("/", get(hello));
let listener = TcpListener::bind("127.0.0.1:3000");
let server = Server::new(listener).await?;
server.run(app).await
Server::new(TcpListener::bind("127.0.0.1:3000"))
.run(app)
.await
}

View File

@@ -46,7 +46,7 @@ async fn main() -> Result<(), std::io::Error> {
tracing_subscriber::fmt::init();
let app = Route::new().at("/", get(index));
let listener = TcpListener::bind("127.0.0.1:3000");
let server = Server::new(listener).await?;
server.run(app).await
Server::new(TcpListener::bind("127.0.0.1:3000"))
.run(app)
.await
}

View File

@@ -45,9 +45,7 @@ async fn main() -> Result<(), std::io::Error> {
let app = Route::new().at("/", get(index)).at("/event", get(event));
let listener = TcpListener::bind("127.0.0.1:3000");
let server = Server::new(listener).await?;
server
Server::new(TcpListener::bind("127.0.0.1:3000"))
.run_with_graceful_shutdown(
app,
async move {

View File

@@ -27,7 +27,7 @@ async fn main() -> Result<(), std::io::Error> {
}
});
let listener = TcpListener::bind("127.0.0.1:3000");
let server = Server::new(listener).await?;
server.run(app).await
Server::new(TcpListener::bind("127.0.0.1:3000"))
.run(app)
.await
}

View File

@@ -15,7 +15,8 @@ async fn main() -> Result<(), std::io::Error> {
tracing_subscriber::fmt::init();
let app = Route::new().at("/hello/:name", get(hello)).with(Tracing);
let listener = TcpListener::bind("127.0.0.1:3000");
let server = Server::new(listener).await?;
server.run(app).await
Server::new(TcpListener::bind("127.0.0.1:3000"))
.name("hello-world")
.run(app)
.await
}

View File

@@ -22,7 +22,7 @@ async fn main() -> Result<(), std::io::Error> {
tracing_subscriber::fmt::init();
let app = Route::new().at("/hello", post(hello));
let listener = TcpListener::bind("127.0.0.1:3000");
let server = Server::new(listener).await?;
server.run(app).await
Server::new(TcpListener::bind("127.0.0.1:3000"))
.run(app)
.await
}

View File

@@ -44,7 +44,7 @@ async fn main() -> Result<(), std::io::Error> {
tracing_subscriber::fmt::init();
let app = Route::new().at("/", get(index)).with(Log);
let listener = TcpListener::bind("127.0.0.1:3000");
let server = Server::new(listener).await?;
server.run(app).await
Server::new(TcpListener::bind("127.0.0.1:3000"))
.run(app)
.await
}

View File

@@ -27,7 +27,7 @@ async fn main() -> Result<(), std::io::Error> {
tracing_subscriber::fmt::init();
let app = Route::new().at("/", get(index)).around(log);
let listener = TcpListener::bind("127.0.0.1:3000");
let server = Server::new(listener).await?;
server.run(app).await
Server::new(TcpListener::bind("127.0.0.1:3000"))
.run(app)
.await
}

View File

@@ -66,15 +66,11 @@ async fn main() -> io::Result<()> {
.database("test");
let collection = mongodb.collection::<Document>("user");
let listener = TcpListener::bind("127.0.0.1:3000");
let server = Server::new(listener).await?;
server
Server::new(TcpListener::bind("127.0.0.1:3000"))
.run(
Route::new()
.at("/user", get(get_users).post(create_user))
.with(AddData::new(collection)),
)
.await?;
Ok(())
.await
}

View File

@@ -17,6 +17,7 @@ async fn main() -> Result<(), std::io::Error> {
tracing_subscriber::fmt::init();
let app = Route::new().nest("/api", api());
let server = Server::new(TcpListener::bind("127.0.0.1:3000")).await?;
server.run(app).await
Server::new(TcpListener::bind("127.0.0.1:3000"))
.run(app)
.await
}

View File

@@ -80,7 +80,8 @@ async fn main() -> Result<(), std::io::Error> {
.data(tracer.clone())
.with(OpenTelemetryMetrics::new())
.with(OpenTelemetryTracing::new(tracer));
let listener = TcpListener::bind("127.0.0.1:3001");
let server = Server::new(listener).await?;
server.run(app).await
Server::new(TcpListener::bind("127.0.0.1:3001"))
.run(app)
.await
}

View File

@@ -39,7 +39,8 @@ async fn main() -> Result<(), std::io::Error> {
.data(tracer.clone())
.with(OpenTelemetryMetrics::new())
.with(OpenTelemetryTracing::new(tracer));
let listener = TcpListener::bind("127.0.0.1:3002");
let server = Server::new(listener).await?;
server.run(app).await
Server::new(TcpListener::bind("127.0.0.1:3002"))
.run(app)
.await
}

View File

@@ -26,7 +26,7 @@ async fn main() -> Result<(), std::io::Error> {
CookieConfig::default().secure(false),
RedisStorage::new(ConnectionManager::new(client).await.unwrap()),
));
let listener = TcpListener::bind("127.0.0.1:3000");
let server = Server::new(listener).await?;
server.run(app).await
Server::new(TcpListener::bind("127.0.0.1:3000"))
.run(app)
.await
}

View File

@@ -44,8 +44,7 @@ async fn main() -> Result<(), std::io::Error> {
tracing_subscriber::fmt::init();
let app = Route::new().at("/", get(index)).at("/event", get(event));
let listener = TcpListener::bind("127.0.0.1:3000");
let server = Server::new(listener).await?;
server.run(app).await
Server::new(TcpListener::bind("127.0.0.1:3000"))
.run(app)
.await
}

View File

@@ -11,6 +11,7 @@ async fn main() -> Result<(), std::io::Error> {
"/",
Files::new("./examples/poem/static-files/files").show_files_listing(),
);
let server = Server::new(TcpListener::bind("127.0.0.1:3000")).await?;
server.run(app).await
Server::new(TcpListener::bind("127.0.0.1:3000"))
.run(app)
.await
}

View File

@@ -27,7 +27,7 @@ async fn main() -> Result<(), std::io::Error> {
tokio::time::sleep(Duration::from_secs(60)).await;
}
});
Server::new(listener).await?.run(app).await
Server::new(listener).run(app).await
}
fn load_tls_config() -> Result<RustlsConfig, std::io::Error> {

View File

@@ -77,5 +77,5 @@ async fn main() -> Result<(), std::io::Error> {
let listener =
TcpListener::bind("127.0.0.1:3000").rustls(RustlsConfig::new().key(KEY).cert(CERT));
Server::new(listener).await?.run(app).await
Server::new(listener).run(app).await
}

View File

@@ -37,7 +37,7 @@ async fn main() -> Result<(), std::io::Error> {
format!("/{}", GreeterServer::<MyGreeter>::NAME),
GreeterServer::new(MyGreeter).compat(),
);
let listener = TcpListener::bind("127.0.0.1:3000");
let server = Server::new(listener).await?;
server.run(app).await
Server::new(TcpListener::bind("127.0.0.1:3000"))
.run(app)
.await
}

View File

@@ -21,7 +21,7 @@ async fn main() -> Result<(), std::io::Error> {
"/",
get(hello).with(RateLimitLayer::new(5, Duration::from_secs(30)).compat()),
);
let listener = TcpListener::bind("127.0.0.1:3000");
let server = Server::new(listener).await?;
server.run(app).await
Server::new(TcpListener::bind("127.0.0.1:3000"))
.run(app)
.await
}

View File

@@ -15,8 +15,7 @@ async fn main() -> Result<(), std::io::Error> {
let app = Route::new().at("/", get(hello));
let listener = UnixListener::bind("./unix-socket");
let server = Server::new(listener).await?;
server.run(app).await
Server::new(listener).run(app).await
}
#[cfg(not(unix))]

View File

@@ -24,7 +24,7 @@ async fn main() -> Result<(), std::io::Error> {
tracing_subscriber::fmt::init();
let app = Route::new().at("/", post(index));
let listener = TcpListener::bind("127.0.0.1:3000");
let server = Server::new(listener).await?;
server.run(app).await
Server::new(TcpListener::bind("127.0.0.1:3000"))
.run(app)
.await
}

View File

@@ -102,7 +102,7 @@ async fn main() -> Result<(), std::io::Error> {
get(ws.data(tokio::sync::broadcast::channel::<String>(32).0)),
);
let listener = TcpListener::bind("127.0.0.1:3000");
let server = Server::new(listener).await?;
server.run(app).await
Server::new(TcpListener::bind("127.0.0.1:3000"))
.run(app)
.await
}

View File

@@ -78,14 +78,13 @@ impl Api {
#[tokio::main]
async fn main() -> Result<(), std::io::Error> {
let listener = TcpListener::bind("127.0.0.1:3000");
let api_service =
OpenApiService::new(Api, "Hello World", "1.0").server("http://localhost:3000/api");
let ui = api_service.swagger_ui();
let app = Route::new().nest("/api", api_service).nest("/", ui);
poem::Server::new(listener)
.await?
.run(Route::new().nest("/api", api_service).nest("/", ui))
poem::Server::new(TcpListener::bind("127.0.0.1:3000"))
.run(app)
.await
}
```

View File

@@ -51,14 +51,13 @@
//!
//! #[tokio::main]
//! async fn main() -> Result<(), std::io::Error> {
//! let listener = TcpListener::bind("127.0.0.1:3000");
//! let api_service =
//! OpenApiService::new(Api, "Hello World", "1.0").server("http://localhost:3000/api");
//! let ui = api_service.swagger_ui();
//! let app = Route::new().nest("/api", api_service).nest("/", ui);
//!
//! poem::Server::new(listener)
//! .await?
//! .run(Route::new().nest("/api", api_service).nest("/", ui))
//! poem::Server::new(TcpListener::bind("127.0.0.1:3000"))
//! .run(app)
//! .await
//! }
//! ```

View File

@@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
# [1.0.30] 2021-11-23
- `Server::new` is no longer an asynchronous method and has no return value.
- Remove `Server::local_addr` method.
- Add the `Server::name` method to specify the name of the server, it is only used for logs.
# [1.0.28] 2021-11-17
- Add `EndpointExt::with_if` method.

View File

@@ -59,7 +59,7 @@ regex = "1.5.4"
mime_guess = "2.0.3"
smallvec = "1.6.1"
nom = "7.0.0"
tracing = "0.1.28"
tracing = "0.1.29"
headers = "0.3.4"
# Non-feature optional dependencies

View File

@@ -82,9 +82,9 @@ fn hello(Path(name): Path<String>) -> String {
#[tokio::main]
async fn main() -> Result<(), std::io::Error> {
let app = Route::new().at("/hello/:name", get(hello));
let listener = TcpListener::bind("127.0.0.1:3000");
let server = Server::new(listener).await?;
server.run(app).await
Server::new(TcpListener::bind("127.0.0.1:3000"))
.run(app)
.await
}
```

View File

@@ -22,9 +22,9 @@
//! #[tokio::main]
//! async fn main() -> Result<(), std::io::Error> {
//! let app = Route::new().at("/hello/:name", get(hello));
//! let listener = TcpListener::bind("127.0.0.1:3000");
//! let server = Server::new(listener).await?;
//! server.run(app).await
//! Server::new(TcpListener::bind("127.0.0.1:3000"))
//! .run(app)
//! .await
//! }
//! ```
//!

View File

@@ -12,6 +12,7 @@ mod tls;
mod unix;
use std::{
convert::Infallible,
io::Error,
pin::Pin,
task::{Context, Poll},
@@ -153,6 +154,15 @@ pub trait Listener: Send {
}
}
#[async_trait::async_trait]
impl Listener for Infallible {
type Acceptor = Infallible;
async fn into_acceptor(self) -> IoResult<Self::Acceptor> {
unreachable!()
}
}
#[async_trait::async_trait]
impl<T: Acceptor + ?Sized> Acceptor for Box<T> {
type Io = T::Io;
@@ -166,6 +176,19 @@ impl<T: Acceptor + ?Sized> Acceptor for Box<T> {
}
}
#[async_trait::async_trait]
impl Acceptor for Infallible {
type Io = BoxIo;
fn local_addr(&self) -> Vec<LocalAddr> {
vec![]
}
async fn accept(&mut self) -> IoResult<(Self::Io, LocalAddr, RemoteAddr)> {
unreachable!()
}
}
/// An IO type for BoxAcceptor.
pub struct BoxIo {
reader: Box<dyn AsyncRead + Send + Unpin + 'static>,

View File

@@ -15,32 +15,54 @@ use tokio::{
};
use crate::{
listener::{Acceptor, Listener},
listener::{Acceptor, AcceptorExt, Listener},
web::{LocalAddr, RemoteAddr},
Endpoint, EndpointExt, IntoEndpoint, Response,
};
/// An HTTP Server.
pub struct Server<T> {
acceptor: T,
enum Either<L, A> {
Listener(L),
Acceptor(A),
}
impl<T: Acceptor> Server<T> {
/// An HTTP Server.
pub struct Server<L, A> {
listener: Either<L, A>,
name: Option<String>,
}
impl<L: Listener> Server<L, Infallible> {
/// Use the specified listener to create an HTTP server.
pub async fn new<K: Listener<Acceptor = T>>(listener: K) -> IoResult<Server<T>> {
Ok(Self {
acceptor: listener.into_acceptor().await?,
})
pub fn new(listener: L) -> Self {
Self {
listener: Either::Listener(listener),
name: None,
}
}
}
impl<A: Acceptor> Server<Infallible, A> {
/// Use the specified acceptor to create an HTTP server.
pub fn new_with_acceptor(acceptor: T) -> Self {
Self { acceptor }
pub fn new_with_acceptor(acceptor: A) -> Self {
Self {
listener: Either::Acceptor(acceptor),
name: None,
}
}
}
/// Returns the local address that this server is bound to.
pub fn local_addr(&self) -> Vec<LocalAddr> {
self.acceptor.local_addr()
impl<L, A> Server<L, A>
where
L: Listener,
L::Acceptor: 'static,
A: Acceptor + 'static,
{
/// Specify the name of the server, it is only used for logs.
pub fn name(self, name: impl Into<String>) -> Self {
Self {
name: Some(name.into()),
..self
}
}
/// Run this server.
@@ -64,25 +86,31 @@ impl<T: Acceptor> Server<T> {
E: IntoEndpoint,
E::Endpoint: 'static,
{
let ep = ep.into_endpoint();
let ep = Arc::new(ep.map_to_response());
let Server { mut acceptor } = self;
let ep = Arc::new(ep.into_endpoint().map_to_response());
let Server { listener, name } = self;
let name = name.as_deref();
let alive_connections = Arc::new(AtomicUsize::new(0));
let notify = Arc::new(Notify::new());
let timeout_notify = Arc::new(Notify::new());
let mut acceptor = match listener {
Either::Listener(listener) => listener.into_acceptor().await?.boxed(),
Either::Acceptor(acceptor) => acceptor.boxed(),
};
tokio::pin!(signal);
for addr in acceptor.local_addr() {
tracing::info!(addr = %addr, "listening");
tracing::info!(name = name, addr = %addr, "listening");
}
tracing::info!("server started");
tracing::info!(name = name, "server started");
loop {
tokio::select! {
_ = &mut signal => {
if let Some(timeout) = timeout {
tracing::info!(
name = name,
timeout_in_seconds = timeout.as_secs_f32(),
"initiate graceful shutdown",
);
@@ -93,7 +121,7 @@ impl<T: Acceptor> Server<T> {
timeout_notify.notify_waiters();
});
} else {
tracing::info!("initiate graceful shutdown");
tracing::info!(name = name, "initiate graceful shutdown");
}
break;
},
@@ -127,11 +155,11 @@ impl<T: Acceptor> Server<T> {
drop(acceptor);
if alive_connections.load(Ordering::SeqCst) > 0 {
tracing::info!("wait for all connections to close.");
tracing::info!(name = name, "wait for all connections to close.");
notify.notified().await;
}
tracing::info!("server stopped");
tracing::info!(name = name, "server stopped");
Ok(())
}
}

View File

@@ -39,7 +39,11 @@ mod tests {
use http::{header, HeaderValue};
use super::*;
use crate::{handler, listener::TcpListener, IntoResponse, Server};
use crate::{
handler,
listener::{Acceptor, Listener, TcpListener},
IntoResponse, Server,
};
#[tokio::test]
async fn test_negotiation() {
@@ -48,8 +52,11 @@ mod tests {
ws.protocols(["aaa", "bbb"]).on_upgrade(|_| async move {})
}
let server = Server::new(TcpListener::bind("127.0.0.1:0")).await.unwrap();
let addr = server
let acceptor = TcpListener::bind("127.0.0.1:0")
.into_acceptor()
.await
.unwrap();
let addr = acceptor
.local_addr()
.remove(0)
.as_socket_addr()
@@ -57,7 +64,7 @@ mod tests {
.unwrap();
let handle = tokio::spawn(async move {
let _ = server.run(index).await;
let _ = Server::new_with_acceptor(acceptor).run(index).await;
});
let (_, resp) = tokio_tungstenite::connect_async(format!("ws://{}", addr))
@@ -104,13 +111,17 @@ mod tests {
})
}
let server = Server::new(TcpListener::bind("127.0.0.1:0")).await.unwrap();
let addr = server
let acceptor = TcpListener::bind("127.0.0.1:0")
.into_acceptor()
.await
.unwrap();
let addr = acceptor
.local_addr()
.remove(0)
.as_socket_addr()
.cloned()
.unwrap();
let server = Server::new_with_acceptor(acceptor);
let handle = tokio::spawn(async move {
let _ = server.run(index).await;