diff options
author | Divy Srivastava <dj.srivastava23@gmail.com> | 2022-04-25 22:50:29 +0530 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-04-25 19:20:29 +0200 |
commit | 609c359dd448f2a7736ba1d93e94e1feff6acadc (patch) | |
tree | 284387075ed07627cff88f2cdba7bb5811dca7e5 /ext/http | |
parent | c0e3b6096d37e9a4243c7ad461487db291c824fa (diff) |
fix(ext/http): truncate read bytes when streaming bodies (#14389)
stream shutdown wasn't happening correctly (moved it to call op_http_shutdown) & extra zeroed bytes were being sent for when body length not a multiple of 64*1024
Diffstat (limited to 'ext/http')
-rw-r--r-- | ext/http/01_http.js | 12 | ||||
-rw-r--r-- | ext/http/lib.rs | 17 |
2 files changed, 9 insertions, 20 deletions
diff --git a/ext/http/01_http.js b/ext/http/01_http.js index 152241522..5c9deb5a3 100644 --- a/ext/http/01_http.js +++ b/ext/http/01_http.js @@ -318,13 +318,13 @@ throw error; } } + } - try { - await core.opAsync("op_http_shutdown", streamRid); - } catch (error) { - await reader.cancel(error); - throw error; - } + try { + await core.opAsync("op_http_shutdown", streamRid); + } catch (error) { + await reader.cancel(error); + throw error; } } diff --git a/ext/http/lib.rs b/ext/http/lib.rs index b4a2f0c45..28689654e 100644 --- a/ext/http/lib.rs +++ b/ext/http/lib.rs @@ -729,7 +729,9 @@ async fn op_http_write_resource( } } HttpResponseWriter::BodyUncompressed(body) => { - if let Err(err) = body.send_data(Bytes::from(buf.to_temp())).await { + let mut buf = buf.to_temp(); + buf.truncate(nread); + if let Err(err) = body.send_data(Bytes::from(buf)).await { assert!(err.is_closed()); // Pull up the failure associated with the transport connection instead. http_stream.conn.closed().await?; @@ -740,19 +742,6 @@ async fn op_http_write_resource( _ => unreachable!(), }; } - - let wr = take(&mut *wr); - if let HttpResponseWriter::Body(mut body_writer) = wr { - match body_writer.shutdown().await { - Ok(_) => {} - Err(err) => { - assert_eq!(err.kind(), std::io::ErrorKind::BrokenPipe); - // Don't return "broken pipe", that's an implementation detail. - // Pull up the failure associated with the transport connection instead. - http_stream.conn.closed().await?; - } - } - } Ok(()) } |