mirror of
https://github.com/denoland/deno.git
synced 2024-11-21 15:04:11 -05:00
fix(ext/node): handle http2 server ending stream (#26235)
Closes #24845
This commit is contained in:
parent
3888806169
commit
c5a7f98d82
2 changed files with 14 additions and 8 deletions
|
@ -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) => {
|
||||
|
|
|
@ -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(() => {
|
||||
|
|
Loading…
Reference in a new issue