mirror of
https://github.com/poem-web/poem.git
synced 2026-01-25 04:18:25 +00:00
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:
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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> {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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))]
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
```
|
||||
|
||||
@@ -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
|
||||
//! }
|
||||
//! ```
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
@@ -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
|
||||
//! }
|
||||
//! ```
|
||||
//!
|
||||
|
||||
@@ -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>,
|
||||
|
||||
@@ -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(())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user