mirror of
https://github.com/tokio-rs/axum.git
synced 2026-08-24 00:00:16 +02:00
Update to tower-http 0.4 (#1783)
This commit is contained in:
@@ -9,6 +9,6 @@ axum = { path = "../../axum" }
|
||||
hyper = "0.14"
|
||||
tokio = { version = "1.0", features = ["full"] }
|
||||
tower = "0.4"
|
||||
tower-http = { version = "0.3", features = ["map-request-body", "util"] }
|
||||
tower-http = { version = "0.4.0", features = ["map-request-body", "util"] }
|
||||
tracing = "0.1"
|
||||
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
|
||||
|
||||
@@ -7,4 +7,4 @@ publish = false
|
||||
[dependencies]
|
||||
axum = { path = "../../axum" }
|
||||
tokio = { version = "1.0", features = ["full"] }
|
||||
tower-http = { version = "0.3.0", features = ["cors"] }
|
||||
tower-http = { version = "0.4.0", features = ["cors"] }
|
||||
|
||||
@@ -8,7 +8,7 @@ publish = false
|
||||
axum = { path = "../../axum" }
|
||||
tokio = { version = "1.0", features = ["full"] }
|
||||
tower = { version = "0.4", features = ["util", "timeout", "load-shed", "limit"] }
|
||||
tower-http = { version = "0.3.0", features = [
|
||||
tower-http = { version = "0.4.0", features = [
|
||||
"add-extension",
|
||||
"auth",
|
||||
"compression-full",
|
||||
|
||||
@@ -25,8 +25,8 @@ use std::{
|
||||
};
|
||||
use tower::{BoxError, ServiceBuilder};
|
||||
use tower_http::{
|
||||
auth::RequireAuthorizationLayer, compression::CompressionLayer, limit::RequestBodyLimitLayer,
|
||||
trace::TraceLayer,
|
||||
compression::CompressionLayer, limit::RequestBodyLimitLayer, trace::TraceLayer,
|
||||
validate_request::ValidateRequestHeaderLayer,
|
||||
};
|
||||
use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt};
|
||||
|
||||
@@ -128,7 +128,7 @@ fn admin_routes() -> Router<SharedState> {
|
||||
.route("/keys", delete(delete_all_keys))
|
||||
.route("/key/:key", delete(remove_key))
|
||||
// Require bearer auth for all admin routes
|
||||
.layer(RequireAuthorizationLayer::bearer("secret-token"))
|
||||
.layer(ValidateRequestHeaderLayer::bearer("secret-token"))
|
||||
}
|
||||
|
||||
async fn handle_error(error: BoxError) -> impl IntoResponse {
|
||||
|
||||
@@ -7,6 +7,6 @@ publish = false
|
||||
[dependencies]
|
||||
axum = { path = "../../axum", features = ["multipart"] }
|
||||
tokio = { version = "1.0", features = ["full"] }
|
||||
tower-http = { version = "0.3.0", features = ["limit", "trace"] }
|
||||
tower-http = { version = "0.4.0", features = ["limit", "trace"] }
|
||||
tracing = "0.1"
|
||||
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
|
||||
|
||||
@@ -10,6 +10,6 @@ futures = "0.3"
|
||||
headers = "0.3"
|
||||
tokio = { version = "1.0", features = ["full"] }
|
||||
tokio-stream = "0.1"
|
||||
tower-http = { version = "0.3.0", features = ["fs", "trace"] }
|
||||
tower-http = { version = "0.4.0", features = ["fs", "trace"] }
|
||||
tracing = "0.1"
|
||||
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
|
||||
|
||||
@@ -6,9 +6,8 @@
|
||||
|
||||
use axum::{
|
||||
extract::TypedHeader,
|
||||
http::StatusCode,
|
||||
response::sse::{Event, Sse},
|
||||
routing::{get, get_service},
|
||||
routing::get,
|
||||
Router,
|
||||
};
|
||||
use futures::stream::{self, Stream};
|
||||
@@ -29,15 +28,7 @@ async fn main() {
|
||||
|
||||
let assets_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("assets");
|
||||
|
||||
let static_files_service = get_service(
|
||||
ServeDir::new(assets_dir).append_index_html_on_directories(true),
|
||||
)
|
||||
.handle_error(|error: std::io::Error| async move {
|
||||
(
|
||||
StatusCode::INTERNAL_SERVER_ERROR,
|
||||
format!("Unhandled internal error: {}", error),
|
||||
)
|
||||
});
|
||||
let static_files_service = ServeDir::new(assets_dir).append_index_html_on_directories(true);
|
||||
|
||||
// build our application with a route
|
||||
let app = Router::new()
|
||||
|
||||
@@ -9,6 +9,6 @@ axum = { path = "../../axum" }
|
||||
axum-extra = { path = "../../axum-extra", features = ["spa"] }
|
||||
tokio = { version = "1.0", features = ["full"] }
|
||||
tower = { version = "0.4", features = ["util"] }
|
||||
tower-http = { version = "0.3.0", features = ["fs", "trace"] }
|
||||
tower-http = { version = "0.4.0", features = ["fs", "trace"] }
|
||||
tracing = "0.1"
|
||||
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
|
||||
|
||||
@@ -8,12 +8,11 @@ use axum::{
|
||||
body::Body,
|
||||
handler::HandlerWithoutStateExt,
|
||||
http::{Request, StatusCode},
|
||||
response::IntoResponse,
|
||||
routing::{get, get_service},
|
||||
routing::get,
|
||||
Router,
|
||||
};
|
||||
use axum_extra::routing::SpaRouter;
|
||||
use std::{io, net::SocketAddr};
|
||||
use std::net::SocketAddr;
|
||||
use tower::ServiceExt;
|
||||
use tower_http::{
|
||||
services::{ServeDir, ServeFile},
|
||||
@@ -56,7 +55,7 @@ fn using_serve_dir() -> Router {
|
||||
// `SpaRouter` is just a convenient wrapper around `ServeDir`
|
||||
//
|
||||
// You can use `ServeDir` directly to further customize your setup
|
||||
let serve_dir = get_service(ServeDir::new("assets")).handle_error(handle_error);
|
||||
let serve_dir = ServeDir::new("assets");
|
||||
|
||||
Router::new()
|
||||
.route("/foo", get(|| async { "Hi from /foo" }))
|
||||
@@ -69,7 +68,6 @@ fn using_serve_dir_with_assets_fallback() -> Router {
|
||||
// so with this `GET /assets/doesnt-exist.jpg` will return `index.html`
|
||||
// rather than a 404
|
||||
let serve_dir = ServeDir::new("assets").not_found_service(ServeFile::new("assets/index.html"));
|
||||
let serve_dir = get_service(serve_dir).handle_error(handle_error);
|
||||
|
||||
Router::new()
|
||||
.route("/foo", get(|| async { "Hi from /foo" }))
|
||||
@@ -81,7 +79,6 @@ fn using_serve_dir_only_from_root_via_fallback() -> Router {
|
||||
// you can also serve the assets directly from the root (not nested under `/assets`)
|
||||
// by only setting a `ServeDir` as the fallback
|
||||
let serve_dir = ServeDir::new("assets").not_found_service(ServeFile::new("assets/index.html"));
|
||||
let serve_dir = get_service(serve_dir).handle_error(handle_error);
|
||||
|
||||
Router::new()
|
||||
.route("/foo", get(|| async { "Hi from /foo" }))
|
||||
@@ -93,13 +90,7 @@ fn using_serve_dir_with_handler_as_service() -> Router {
|
||||
(StatusCode::NOT_FOUND, "Not found")
|
||||
}
|
||||
|
||||
// you can convert handler function to service
|
||||
let service = handle_404
|
||||
.into_service()
|
||||
.map_err(|err| -> std::io::Error { match err {} });
|
||||
|
||||
let serve_dir = ServeDir::new("assets").not_found_service(service);
|
||||
let serve_dir = get_service(serve_dir).handle_error(handle_error);
|
||||
let serve_dir = ServeDir::new("assets").not_found_service(handle_404.into_service());
|
||||
|
||||
Router::new()
|
||||
.route("/foo", get(|| async { "Hi from /foo" }))
|
||||
@@ -108,8 +99,8 @@ fn using_serve_dir_with_handler_as_service() -> Router {
|
||||
|
||||
fn two_serve_dirs() -> Router {
|
||||
// you can also have two `ServeDir`s nested at different paths
|
||||
let serve_dir_from_assets = get_service(ServeDir::new("assets")).handle_error(handle_error);
|
||||
let serve_dir_from_dist = get_service(ServeDir::new("dist")).handle_error(handle_error);
|
||||
let serve_dir_from_assets = ServeDir::new("assets");
|
||||
let serve_dir_from_dist = ServeDir::new("dist");
|
||||
|
||||
Router::new()
|
||||
.nest_service("/assets", serve_dir_from_assets)
|
||||
@@ -123,17 +114,13 @@ fn calling_serve_dir_from_a_handler() -> Router {
|
||||
Router::new().nest_service(
|
||||
"/foo",
|
||||
get(|request: Request<Body>| async {
|
||||
let service = get_service(ServeDir::new("assets")).handle_error(handle_error);
|
||||
let service = ServeDir::new("assets");
|
||||
let result = service.oneshot(request).await;
|
||||
result
|
||||
}),
|
||||
)
|
||||
}
|
||||
|
||||
async fn handle_error(_err: io::Error) -> impl IntoResponse {
|
||||
(StatusCode::INTERNAL_SERVER_ERROR, "Something went wrong...")
|
||||
}
|
||||
|
||||
async fn serve(app: Router, port: u16) {
|
||||
let addr = SocketAddr::from(([127, 0, 0, 1], port));
|
||||
tracing::debug!("listening on {}", addr);
|
||||
|
||||
@@ -10,7 +10,7 @@ hyper = { version = "0.14", features = ["full"] }
|
||||
mime = "0.3"
|
||||
serde_json = "1.0"
|
||||
tokio = { version = "1.0", features = ["full"] }
|
||||
tower-http = { version = "0.3.0", features = ["trace"] }
|
||||
tower-http = { version = "0.4.0", features = ["trace"] }
|
||||
tracing = "0.1"
|
||||
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@ axum = { path = "../../axum" }
|
||||
serde = { version = "1.0", features = ["derive"] }
|
||||
tokio = { version = "1.0", features = ["full"] }
|
||||
tower = { version = "0.4", features = ["util", "timeout"] }
|
||||
tower-http = { version = "0.3.0", features = ["add-extension", "trace"] }
|
||||
tower-http = { version = "0.4.0", features = ["add-extension", "trace"] }
|
||||
tracing = "0.1"
|
||||
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
|
||||
uuid = { version = "1.0", features = ["serde", "v4"] }
|
||||
|
||||
@@ -7,6 +7,6 @@ publish = false
|
||||
[dependencies]
|
||||
axum = { path = "../../axum" }
|
||||
tokio = { version = "1.0", features = ["full"] }
|
||||
tower-http = { version = "0.3.0", features = ["trace"] }
|
||||
tower-http = { version = "0.4.0", features = ["trace"] }
|
||||
tracing = "0.1"
|
||||
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
|
||||
|
||||
@@ -12,7 +12,7 @@ headers = "0.3"
|
||||
tokio = { version = "1.0", features = ["full"] }
|
||||
tokio-tungstenite = "0.18.0"
|
||||
tower = { version = "0.4", features = ["util"] }
|
||||
tower-http = { version = "0.3.0", features = ["fs", "trace"] }
|
||||
tower-http = { version = "0.4.0", features = ["fs", "trace"] }
|
||||
tracing = "0.1"
|
||||
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@ use tokio_tungstenite::{
|
||||
};
|
||||
|
||||
const N_CLIENTS: usize = 2; //set to desired number
|
||||
const SERVER: &'static str = "ws://127.0.0.1:3000/ws";
|
||||
const SERVER: &str = "ws://127.0.0.1:3000/ws";
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() {
|
||||
|
||||
@@ -21,9 +21,8 @@ use axum::{
|
||||
ws::{Message, WebSocket, WebSocketUpgrade},
|
||||
TypedHeader,
|
||||
},
|
||||
http::StatusCode,
|
||||
response::IntoResponse,
|
||||
routing::{get, get_service},
|
||||
routing::get,
|
||||
Router,
|
||||
};
|
||||
|
||||
@@ -58,15 +57,7 @@ async fn main() {
|
||||
|
||||
// build our application with some routes
|
||||
let app = Router::new()
|
||||
.fallback_service(
|
||||
get_service(ServeDir::new(assets_dir).append_index_html_on_directories(true))
|
||||
.handle_error(|error: std::io::Error| async move {
|
||||
(
|
||||
StatusCode::INTERNAL_SERVER_ERROR,
|
||||
format!("Unhandled internal error: {}", error),
|
||||
)
|
||||
}),
|
||||
)
|
||||
.fallback_service(ServeDir::new(assets_dir).append_index_html_on_directories(true))
|
||||
.route("/ws", get(ws_handler))
|
||||
// logging so we can see whats going on
|
||||
.layer(
|
||||
@@ -98,7 +89,7 @@ async fn ws_handler(
|
||||
} else {
|
||||
String::from("Unknown browser")
|
||||
};
|
||||
println!("`{}` at {} connected.", user_agent, addr.to_string());
|
||||
println!("`{user_agent}` at {addr} connected.");
|
||||
// finalize the upgrade process by returning upgrade callback.
|
||||
// we can customize the callback by sending additional info such as address.
|
||||
ws.on_upgrade(move |socket| handle_socket(socket, addr))
|
||||
@@ -107,7 +98,7 @@ async fn ws_handler(
|
||||
/// Actual websocket statemachine (one will be spawned per connection)
|
||||
async fn handle_socket(mut socket: WebSocket, who: SocketAddr) {
|
||||
//send a ping (unsupported by some browsers) just to kick things off and get a response
|
||||
if let Ok(_) = socket.send(Message::Ping(vec![1, 2, 3])).await {
|
||||
if socket.send(Message::Ping(vec![1, 2, 3])).await.is_ok() {
|
||||
println!("Pinged {}...", who);
|
||||
} else {
|
||||
println!("Could not send ping {}!", who);
|
||||
@@ -126,7 +117,7 @@ async fn handle_socket(mut socket: WebSocket, who: SocketAddr) {
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
println!("client {} abruptly disconnected", who);
|
||||
println!("client {who} abruptly disconnected");
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -137,11 +128,11 @@ async fn handle_socket(mut socket: WebSocket, who: SocketAddr) {
|
||||
// connecting to server and receiving their greetings.
|
||||
for i in 1..5 {
|
||||
if socket
|
||||
.send(Message::Text(String::from(format!("Hi {} times!", i))))
|
||||
.send(Message::Text(format!("Hi {i} times!")))
|
||||
.await
|
||||
.is_err()
|
||||
{
|
||||
println!("client {} abruptly disconnected", who);
|
||||
println!("client {who} abruptly disconnected");
|
||||
return;
|
||||
}
|
||||
tokio::time::sleep(std::time::Duration::from_millis(100)).await;
|
||||
@@ -157,7 +148,7 @@ async fn handle_socket(mut socket: WebSocket, who: SocketAddr) {
|
||||
for i in 0..n_msg {
|
||||
// In case of any websocket error, we exit.
|
||||
if sender
|
||||
.send(Message::Text(format!("Server message {} ...", i)))
|
||||
.send(Message::Text(format!("Server message {i} ...")))
|
||||
.await
|
||||
.is_err()
|
||||
{
|
||||
@@ -167,7 +158,7 @@ async fn handle_socket(mut socket: WebSocket, who: SocketAddr) {
|
||||
tokio::time::sleep(std::time::Duration::from_millis(300)).await;
|
||||
}
|
||||
|
||||
println!("Sending close to {}...", who);
|
||||
println!("Sending close to {who}...");
|
||||
if let Err(e) = sender
|
||||
.send(Message::Close(Some(CloseFrame {
|
||||
code: axum::extract::ws::close_code::NORMAL,
|
||||
|
||||
Reference in New Issue
Block a user