summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/node/ops/http2.rs10
-rw-r--r--ext/node/polyfills/http2.ts12
2 files changed, 14 insertions, 8 deletions
diff --git a/ext/node/ops/http2.rs b/ext/node/ops/http2.rs
index 9595cb33d..705a8ecdc 100644
--- a/ext/node/ops/http2.rs
+++ b/ext/node/ops/http2.rs
@@ -488,13 +488,11 @@ pub async fn op_http2_client_get_response_body_chunk(
loop {
let result = poll_fn(|cx| poll_data_or_trailers(cx, &mut body)).await;
if let Err(err) = result {
- let reason = err.reason();
- if let Some(reason) = reason {
- if reason == Reason::CANCEL {
- return Ok((None, false, true));
- }
+ match err.reason() {
+ Some(Reason::NO_ERROR) => return Ok((None, true, false)),
+ Some(Reason::CANCEL) => return Ok((None, false, true)),
+ _ => return Err(err.into()),
}
- return Err(err.into());
}
match result.unwrap() {
DataOrTrailers::Data(data) => {
diff --git a/ext/node/polyfills/http2.ts b/ext/node/polyfills/http2.ts
index a9ced2bd9..dc2379aeb 100644
--- a/ext/node/polyfills/http2.ts
+++ b/ext/node/polyfills/http2.ts
@@ -882,6 +882,7 @@ export class ClientHttp2Stream extends Duplex {
trailersReady: false,
endAfterHeaders: false,
shutdownWritableCalled: false,
+ serverEndedCall: false,
};
this[kDenoResponse] = undefined;
this[kDenoRid] = undefined;
@@ -1109,7 +1110,9 @@ export class ClientHttp2Stream extends Duplex {
}
debugHttp2(">>> chunk", chunk, finished, this[kDenoResponse].bodyRid);
- if (chunk === null) {
+ if (finished || chunk === null) {
+ this[kState].serverEndedCall = true;
+
const trailerList = await op_http2_client_get_response_trailers(
this[kDenoResponse].bodyRid,
);
@@ -1237,7 +1240,9 @@ export class ClientHttp2Stream extends Duplex {
this[kSession] = undefined;
session[kMaybeDestroy]();
- callback(err);
+ if (callback) {
+ callback(err);
+ }
}
[kMaybeDestroy](code = constants.NGHTTP2_NO_ERROR) {
@@ -1280,6 +1285,9 @@ function shutdownWritable(stream, callback, streamRid) {
if (state.flags & STREAM_FLAGS_HAS_TRAILERS) {
onStreamTrailers(stream);
callback();
+ } else if (state.serverEndedCall) {
+ debugHttp2(">>> stream finished");
+ callback();
} else {
op_http2_client_send_data(streamRid, new Uint8Array(), true)
.then(() => {