diff options
author | Divy Srivastava <dj.srivastava23@gmail.com> | 2024-11-08 18:46:11 +0530 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-11-08 18:46:11 +0530 |
commit | b482a50299ae4f636a186038460e54af65e2b627 (patch) | |
tree | 0d9cb0f2348391b438efa133afd391b189ec0e30 /ext/http/service.rs | |
parent | 637b1d5508293ed02bef2f317b30bb7c1f0cbc71 (diff) |
feat(ext/http): abort event when request is cancelled (#26781)
```js
Deno.serve(async (req) => {
const { promise, resolve } = Promise.withResolvers<void>();
req.signal.addEventListener("abort", () => {
resolve();
});
await promise;
return new Response("Ok");
});
```
Diffstat (limited to 'ext/http/service.rs')
-rw-r--r-- | ext/http/service.rs | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/ext/http/service.rs b/ext/http/service.rs index 75f93d77c..ce24dea43 100644 --- a/ext/http/service.rs +++ b/ext/http/service.rs @@ -27,6 +27,7 @@ use std::rc::Rc; use std::task::Context; use std::task::Poll; use std::task::Waker; +use tokio::sync::oneshot; pub type Request = hyper::Request<Incoming>; pub type Response = hyper::Response<HttpRecordResponse>; @@ -211,6 +212,7 @@ pub struct UpgradeUnavailableError; struct HttpRecordInner { server_state: SignallingRc<HttpServerState>, + closed_channel: Option<oneshot::Sender<()>>, request_info: HttpConnectionProperties, request_parts: http::request::Parts, request_body: Option<RequestBodyState>, @@ -276,6 +278,7 @@ impl HttpRecord { response_body_finished: false, response_body_waker: None, trailers: None, + closed_channel: None, been_dropped: false, finished: false, needs_close_after_finish: false, @@ -312,6 +315,10 @@ impl HttpRecord { RefMut::map(self.self_mut(), |inner| &mut inner.needs_close_after_finish) } + pub fn on_cancel(&self, sender: oneshot::Sender<()>) { + self.self_mut().closed_channel = Some(sender); + } + fn recycle(self: Rc<Self>) { assert!( Rc::strong_count(&self) == 1, @@ -390,6 +397,9 @@ impl HttpRecord { inner.been_dropped = true; // The request body might include actual resources. inner.request_body.take(); + if let Some(closed_channel) = inner.closed_channel.take() { + let _ = closed_channel.send(()); + } } /// Complete this record, potentially expunging it if it is fully complete (ie: cancelled as well). |