Files
continuwuity/src/router/request.rs
T

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

93 lines
2.7 KiB
Rust
Raw Normal View History

2024-05-09 15:59:08 -07:00
use std::sync::{atomic::Ordering, Arc};
use axum::{
extract::State,
response::{IntoResponse, Response},
};
2024-12-14 21:58:01 -05:00
use conduwuit::{debug, debug_error, debug_warn, defer, err, error, trace, Result};
use conduwuit_service::Services;
2024-05-09 15:59:08 -07:00
use http::{Method, StatusCode, Uri};
2024-12-08 20:31:16 +00:00
#[tracing::instrument(
parent = None,
level = "trace",
skip_all,
)]
2024-05-09 15:59:08 -07:00
pub(crate) async fn spawn(
State(services): State<Arc<Services>>, req: http::Request<axum::body::Body>, next: axum::middleware::Next,
) -> Result<Response, StatusCode> {
let server = &services.server;
2024-06-16 01:39:14 +00:00
if !server.running() {
2024-05-09 15:59:08 -07:00
debug_warn!("unavailable pending shutdown");
return Err(StatusCode::SERVICE_UNAVAILABLE);
}
2024-06-25 05:05:02 +00:00
let active = server
.metrics
.requests_spawn_active
.fetch_add(1, Ordering::Relaxed);
2024-05-09 15:59:08 -07:00
trace!(active, "enter");
defer! {{
2024-06-25 05:05:02 +00:00
let active = server.metrics.requests_spawn_active.fetch_sub(1, Ordering::Relaxed);
let finished = server.metrics.requests_spawn_finished.fetch_add(1, Ordering::Relaxed);
2024-05-09 15:59:08 -07:00
trace!(active, finished, "leave");
}};
let fut = next.run(req);
let task = server.runtime().spawn(fut);
task.await.map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)
}
2024-12-08 20:31:16 +00:00
#[tracing::instrument(level = "debug", skip_all)]
2024-05-09 15:59:08 -07:00
pub(crate) async fn handle(
State(services): State<Arc<Services>>, req: http::Request<axum::body::Body>, next: axum::middleware::Next,
) -> Result<Response, StatusCode> {
let server = &services.server;
2024-06-16 01:39:14 +00:00
if !server.running() {
2024-05-09 15:59:08 -07:00
debug_warn!(
method = %req.method(),
uri = %req.uri(),
"unavailable pending shutdown"
);
return Err(StatusCode::SERVICE_UNAVAILABLE);
}
let active = server
2024-06-25 05:05:02 +00:00
.metrics
2024-05-09 15:59:08 -07:00
.requests_handle_active
.fetch_add(1, Ordering::Relaxed);
trace!(active, "enter");
defer! {{
2024-06-25 05:05:02 +00:00
let active = server.metrics.requests_handle_active.fetch_sub(1, Ordering::Relaxed);
let finished = server.metrics.requests_handle_finished.fetch_add(1, Ordering::Relaxed);
2024-05-09 15:59:08 -07:00
trace!(active, finished, "leave");
}};
let uri = req.uri().clone();
let method = req.method().clone();
2024-05-09 15:59:08 -07:00
let result = next.run(req).await;
handle_result(&method, &uri, result)
}
fn handle_result(method: &Method, uri: &Uri, result: Response) -> Result<Response, StatusCode> {
2024-05-09 15:59:08 -07:00
let status = result.status();
let reason = status.canonical_reason().unwrap_or("Unknown Reason");
let code = status.as_u16();
if status.is_server_error() {
error!(method = ?method, uri = ?uri, "{code} {reason}");
} else if status.is_client_error() {
debug_error!(method = ?method, uri = ?uri, "{code} {reason}");
} else if status.is_redirection() {
debug!(method = ?method, uri = ?uri, "{code} {reason}");
} else {
trace!(method = ?method, uri = ?uri, "{code} {reason}");
}
if status == StatusCode::METHOD_NOT_ALLOWED {
return Ok(err!(Request(Unrecognized("Method Not Allowed"))).into_response());
}
Ok(result)
2024-05-09 15:59:08 -07:00
}