diff options
author | Anatoli Papirovski <apapirovski@mac.com> | 2017-08-30 10:12:24 -0400 |
---|---|---|
committer | James M Snell <jasnell@gmail.com> | 2017-08-30 12:00:49 -0700 |
commit | ad3d2ce68a92fd160f72ed5c0dba0e18a90e906d (patch) | |
tree | 2372bc85bb2acb7e8e407eb54774141c1a76deeb /test/parallel/test-http2-compat-expect-continue-check.js | |
parent | 0f7c06eb2d885d59dc87b47b8c524eed60a89a0a (diff) | |
download | android-node-v8-ad3d2ce68a92fd160f72ed5c0dba0e18a90e906d.tar.gz android-node-v8-ad3d2ce68a92fd160f72ed5c0dba0e18a90e906d.tar.bz2 android-node-v8-ad3d2ce68a92fd160f72ed5c0dba0e18a90e906d.zip |
http2: handle 100-continue flow & writeContinue
Adds an implementation for writeContinue based on the h2 spec & the
existing http implementation. ClientHttp2Stream now also emits
a continue event when it receives headers with :status 100.
Includes two test cases for default server continue behaviour and
for the exposed checkContinue listener.
PR-URL: https://github.com/nodejs/node/pull/15039
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Diffstat (limited to 'test/parallel/test-http2-compat-expect-continue-check.js')
-rw-r--r-- | test/parallel/test-http2-compat-expect-continue-check.js | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/test/parallel/test-http2-compat-expect-continue-check.js b/test/parallel/test-http2-compat-expect-continue-check.js new file mode 100644 index 0000000000..a956697b5c --- /dev/null +++ b/test/parallel/test-http2-compat-expect-continue-check.js @@ -0,0 +1,81 @@ +// Flags: --expose-http2 +'use strict'; + +const common = require('../common'); +if (!common.hasCrypto) + common.skip('missing crypto'); +const assert = require('assert'); +const http2 = require('http2'); + +const testResBody = 'other stuff!\n'; + +// Checks the full 100-continue flow from client sending 'expect: 100-continue' +// through server receiving it, triggering 'checkContinue' custom handler, +// writing the rest of the request to finally the client receiving to. + +function handler(req, res) { + console.error('Server sent full response'); + + res.writeHead(200, { + 'content-type': 'text/plain', + 'abcd': '1' + }); + res.end(testResBody); +} + +const server = http2.createServer( + common.mustNotCall('Full request received before 100 Continue') +); + +server.on('checkContinue', common.mustCall((req, res) => { + console.error('Server received Expect: 100-continue'); + + res.writeContinue(); + + // timeout so that we allow the client to receive continue first + setTimeout( + common.mustCall(() => handler(req, res)), + common.platformTimeout(100) + ); +})); + +server.listen(0); + +server.on('listening', common.mustCall(() => { + let body = ''; + + const port = server.address().port; + const client = http2.connect(`http://localhost:${port}`); + const req = client.request({ + ':method': 'POST', + ':path': '/world', + expect: '100-continue' + }); + console.error('Client sent request'); + + let gotContinue = false; + req.on('continue', common.mustCall(() => { + console.error('Client received 100-continue'); + gotContinue = true; + })); + + req.on('response', common.mustCall((headers) => { + console.error('Client received response headers'); + + assert.strictEqual(gotContinue, true); + assert.strictEqual(headers[':status'], 200); + assert.strictEqual(headers['abcd'], '1'); + })); + + req.setEncoding('utf-8'); + req.on('data', common.mustCall((chunk) => { body += chunk; })); + + req.on('end', common.mustCall(() => { + console.error('Client received full response'); + + assert.strictEqual(body, testResBody); + + client.destroy(); + server.close(); + })); +})); |