diff --git a/crates/librqbit/src/http_api.rs b/crates/librqbit/src/http_api.rs index 1c5eb85..e8642c9 100644 --- a/crates/librqbit/src/http_api.rs +++ b/crates/librqbit/src/http_api.rs @@ -17,7 +17,8 @@ use std::str::FromStr; use std::time::Duration; use tokio::io::AsyncSeekExt; use tokio::net::TcpListener; -use tracing::{debug, error_span, trace}; +use tower_http::trace::{DefaultOnFailure, DefaultOnResponse, OnFailure}; +use tracing::{debug, error_span, trace, Span}; use axum::Router; @@ -572,17 +573,33 @@ impl HttpApi { let app = app .layer(cors_layer) .layer( - tower_http::trace::TraceLayer::new_for_http().make_span_with(|req: &Request| { - let method = req.method(); - let uri = req.uri(); - if let Some(ConnectInfo(addr)) = - req.extensions().get::>() - { - error_span!("request", %method, %uri, %addr) - } else { - error_span!("request", %method, %uri) - } - }), + tower_http::trace::TraceLayer::new_for_http() + .make_span_with(|req: &Request| { + let method = req.method(); + let uri = req.uri(); + if let Some(ConnectInfo(addr)) = + req.extensions().get::>() + { + error_span!("request", %method, %uri, %addr) + } else { + error_span!("request", %method, %uri) + } + }) + .on_request(|req: &Request, _: &Span| { + if req.uri().path().starts_with("/upnp") { + debug!(headers=?req.headers()) + } + }) + .on_response(DefaultOnResponse::new().include_headers(true)) + .on_failure({ + let mut default = DefaultOnFailure::new(); + move |failure_class, latency, span: &Span| match failure_class { + tower_http::classify::ServerErrorsFailureClass::StatusCode( + StatusCode::NOT_IMPLEMENTED, + ) => {} + _ => default.on_failure(failure_class, latency, span), + } + }), ) .into_make_service_with_connect_info::(); diff --git a/crates/upnp-serve/src/http_handlers.rs b/crates/upnp-serve/src/http_handlers.rs index 41078a2..374e35f 100644 --- a/crates/upnp-serve/src/http_handlers.rs +++ b/crates/upnp-serve/src/http_handlers.rs @@ -29,7 +29,10 @@ use crate::{ }; async fn description_xml(State(state): State) -> impl IntoResponse { - state.rendered_root_description.clone() + ( + [(CONTENT_TYPE, CONTENT_TYPE_XML_UTF8)], + state.rendered_root_description.clone(), + ) } async fn generate_content_directory_control_response( @@ -94,7 +97,6 @@ async fn subscription( } let (parts, _body) = request.into_parts(); - trace!(?parts.headers, "subscription request"); let is_event = parts .headers .get(HeaderName::from_static("nt")) diff --git a/crates/upnp-serve/src/resources/scpd_content_directory.xml b/crates/upnp-serve/src/resources/scpd_content_directory.xml index c792712..51acb3f 100644 --- a/crates/upnp-serve/src/resources/scpd_content_directory.xml +++ b/crates/upnp-serve/src/resources/scpd_content_directory.xml @@ -5,6 +5,16 @@ 0 + + GetSystemUpdateID + + + Id + out + SystemUpdateID + + + Browse diff --git a/crates/upnp-serve/src/resources/templates/root_desc.tmpl.xml b/crates/upnp-serve/src/resources/templates/root_desc.tmpl.xml index adcde22..f8a9262 100644 --- a/crates/upnp-serve/src/resources/templates/root_desc.tmpl.xml +++ b/crates/upnp-serve/src/resources/templates/root_desc.tmpl.xml @@ -24,6 +24,7 @@ urn:upnp-org:serviceId:ConnectionManager {http_prefix}/scpd/ConnectionManager.xml {http_prefix}/control/ConnectionManager + {http_prefix}/subscribe / diff --git a/crates/upnp-serve/src/subscriptions.rs b/crates/upnp-serve/src/subscriptions.rs index 7cb83e2..0dbd0e5 100644 --- a/crates/upnp-serve/src/subscriptions.rs +++ b/crates/upnp-serve/src/subscriptions.rs @@ -10,7 +10,7 @@ use std::{ time::Duration, }; use tokio::sync::{broadcast::error::RecvError, Notify}; -use tracing::{error_span, warn, Instrument}; +use tracing::{debug, error_span, warn, Instrument}; pub struct Subscription { pub url: url::Url, @@ -142,7 +142,7 @@ impl UpnpServerStateInner { ) .await { - warn!(error=?e, "error updating UPNP subscription"); + debug!(error=?e, "error updating UPNP subscription"); } } Err(RecvError::Lagged(by)) => { @@ -158,7 +158,7 @@ impl UpnpServerStateInner { ) .await { - warn!(error=?e, "error updating UPNP subscription"); + debug!(error=?e, "error updating UPNP subscription"); } } Err(RecvError::Closed) => return Ok(()),