diff --git a/src/http_server.rs b/src/http_server.rs index f203048..269ad4c 100644 --- a/src/http_server.rs +++ b/src/http_server.rs @@ -15,7 +15,7 @@ use tower_http::limit::RequestBodyLimitLayer; use crate::{ JocalService, discovery::register_device, - transfer::{handle_prepare_upload, handle_receive_upload}, + transfer::{handle_cancel, handle_prepare_upload, handle_receive_upload}, }; impl JocalService { @@ -61,6 +61,7 @@ impl JocalService { post(handle_prepare_upload), ) .route("/api/localsend/v2/upload", post(handle_receive_upload)) + .route("/api/localsend/v2/cancel", post(handle_cancel)) .layer(DefaultBodyLimit::disable()) .layer(RequestBodyLimitLayer::new(1024 * 1024 * 1024)) .with_state(self.clone()) diff --git a/src/transfer.rs b/src/transfer.rs index d034a68..90d7d03 100644 --- a/src/transfer.rs +++ b/src/transfer.rs @@ -329,21 +329,33 @@ pub async fn handle_cancel( Query(params): Query, State(service): State, ) -> impl IntoResponse { + // it's OK to hold this lock for the whole body here, we hardly ever have to + // handle cancels and none of these ops are slow. let mut sessions_lock = service.sessions.write().await; let session = match sessions_lock.get_mut(¶ms.session_id) { Some(session) => session, None => return StatusCode::BAD_REQUEST.into_response(), }; - debug!("got cancel request for {}", params.session_id); + info!( + "{} cancelled the transfer of {}", + &session.sender.alias, + session + .files + .values() + .map(|f| f.file_name.clone()) + .collect::>() + .join(",") + ); session.status = SessionStatus::Cancelled; if let Ok(id) = Julid::from_str(¶ms.session_id) { service.send_event(JocalEvent::Cancelled { session_id: id }); - }; - - StatusCode::OK.into_response() + StatusCode::OK.into_response() + } else { + StatusCode::BAD_REQUEST.into_response() + } } // Cancel parameters struct