summaryrefslogtreecommitdiff
path: root/ext/http
diff options
context:
space:
mode:
authorAaron O'Mullan <aaron.omullan@gmail.com>2021-09-25 13:22:19 +0200
committerGitHub <noreply@github.com>2021-09-25 13:22:19 +0200
commit3c88dffd3262e62f7def6f7437c6ce8a27f6cd73 (patch)
tree016db98652c42e5df3ce83f7b0627e2e34ef3d97 /ext/http
parent16ea39ee483ec8d256b0361485a7550e158b5fb1 (diff)
fix(http): panic when responding to a closed conn (#12216)
Our oneshot receiver in `HyperService::call` would unwrap and panic, the `.await` on the oneshot receiver happens when the sender is dropped. The sender is dropped in `op_http_response` because: 1. We take `ResponseSenderResource` 2. Then get `ConnResource` and early exit on failure (conn already closed) 3. The taken sender then gets dropped in this early exit before any response is sent over the channel Fallbacking to returning a dummy response to hyper seems to be a fine quickfix
Diffstat (limited to 'ext/http')
-rw-r--r--ext/http/lib.rs9
1 files changed, 8 insertions, 1 deletions
diff --git a/ext/http/lib.rs b/ext/http/lib.rs
index 9aef3d370..aabf5d839 100644
--- a/ext/http/lib.rs
+++ b/ext/http/lib.rs
@@ -108,7 +108,14 @@ impl HyperService<Request<Body>> for Service {
response_tx: resp_tx,
});
- async move { Ok(resp_rx.await.unwrap()) }.boxed_local()
+ async move {
+ resp_rx.await.or_else(|_|
+ // Fallback dummy response in case sender was dropped due to closed conn
+ Response::builder()
+ .status(hyper::StatusCode::INTERNAL_SERVER_ERROR)
+ .body(vec![].into()))
+ }
+ .boxed_local()
}
}