-
Notifications
You must be signed in to change notification settings - Fork 29.7k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
http2: do not start reading after write if new write is on wire
Don’t start reading more input data if we’re still busy writing output. This was overlooked in 8a4a193. Fixes: #29353 Fixes: #29393 PR-URL: #29399 Reviewed-By: David Carlier <[email protected]> Reviewed-By: Colin Ihrig <[email protected]> Reviewed-By: James M Snell <[email protected]> Reviewed-By: Matteo Collina <[email protected]>
- Loading branch information
Showing
2 changed files
with
52 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
47 changes: 47 additions & 0 deletions
47
test/parallel/test-http2-multistream-destroy-on-read-tls.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
'use strict'; | ||
const common = require('../common'); | ||
if (!common.hasCrypto) | ||
common.skip('missing crypto'); | ||
const fixtures = require('../common/fixtures'); | ||
const http2 = require('http2'); | ||
|
||
// Regression test for https://github.com/nodejs/node/issues/29353. | ||
// Test that it’s okay for an HTTP2 + TLS server to destroy a stream instance | ||
// while reading it. | ||
|
||
const server = http2.createSecureServer({ | ||
key: fixtures.readKey('agent2-key.pem'), | ||
cert: fixtures.readKey('agent2-cert.pem') | ||
}); | ||
|
||
const filenames = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']; | ||
|
||
server.on('stream', common.mustCall((stream) => { | ||
function write() { | ||
stream.write('a'.repeat(10240)); | ||
stream.once('drain', write); | ||
} | ||
write(); | ||
}, filenames.length)); | ||
|
||
server.listen(0, common.mustCall(() => { | ||
const client = http2.connect(`https://localhost:${server.address().port}`, { | ||
ca: fixtures.readKey('agent2-cert.pem'), | ||
servername: 'agent2' | ||
}); | ||
|
||
let destroyed = 0; | ||
for (const entry of filenames) { | ||
const stream = client.request({ | ||
':path': `/${entry}` | ||
}); | ||
stream.once('data', common.mustCall(() => { | ||
stream.destroy(); | ||
|
||
if (++destroyed === filenames.length) { | ||
client.destroy(); | ||
server.close(); | ||
} | ||
})); | ||
} | ||
})); |