diff --git a/.changes/http-release-request-resources.md b/.changes/http-release-request-resources.md new file mode 100644 index 000000000..8f83b0518 --- /dev/null +++ b/.changes/http-release-request-resources.md @@ -0,0 +1,6 @@ +--- +"http": patch +"http-js": patch +--- + +`fetch_send` now releases the request's resources once the send settles. Before, a request that got a response or failed to send left its `FetchRequest` and abort sender in the webview's resource table until the webview was destroyed, so a long-lived app grew with every request. diff --git a/plugins/http/src/commands.rs b/plugins/http/src/commands.rs index d4775c48f..fe5c3bcde 100644 --- a/plugins/http/src/commands.rs +++ b/plugins/http/src/commands.rs @@ -438,14 +438,19 @@ pub async fn fetch_send( let mut fut = req.fut.lock().await; let res = tokio::select! { - res = fut.as_mut() => res?, - _ = abort_rx.0 => { - let mut resources_table = webview.resources_table(); - resources_table.close(rid)?; - return Err(Error::RequestCanceled); - } + res = fut.as_mut() => res, + _ = abort_rx.0 => Err(Error::RequestCanceled), }; + // Release resources + { + let mut resources_table = webview.resources_table(); + let _ = resources_table.take::(req.abort_tx_rid); + let _ = resources_table.close(rid); + } + + let res = res?; + #[cfg(feature = "tracing")] tracing::trace!("{:?}", res);