| 'use strict'; |
| |
| const common = require('../common'); |
| if (!common.hasCrypto) |
| common.skip('missing crypto'); |
| const assert = require('assert'); |
| const http2 = require('http2'); |
| const Countdown = require('../common/countdown'); |
| |
| const { |
| NGHTTP2_CANCEL, |
| NGHTTP2_NO_ERROR, |
| NGHTTP2_PROTOCOL_ERROR, |
| NGHTTP2_REFUSED_STREAM, |
| NGHTTP2_INTERNAL_ERROR |
| } = http2.constants; |
| |
| const tests = [ |
| [NGHTTP2_NO_ERROR, false], |
| [NGHTTP2_NO_ERROR, false], |
| [NGHTTP2_PROTOCOL_ERROR, true, 'NGHTTP2_PROTOCOL_ERROR'], |
| [NGHTTP2_CANCEL, false], |
| [NGHTTP2_REFUSED_STREAM, true, 'NGHTTP2_REFUSED_STREAM'], |
| [NGHTTP2_INTERNAL_ERROR, true, 'NGHTTP2_INTERNAL_ERROR'], |
| ]; |
| |
| const server = http2.createServer(); |
| server.on('stream', (stream, headers) => { |
| const test = tests.find((t) => t[0] === Number(headers.rstcode)); |
| if (test[1]) { |
| stream.on('error', common.expectsError({ |
| name: 'Error', |
| code: 'ERR_HTTP2_STREAM_ERROR', |
| message: `Stream closed with error code ${test[2]}` |
| })); |
| } |
| stream.close(headers.rstcode | 0); |
| }); |
| |
| server.listen(0, common.mustCall(() => { |
| const client = http2.connect(`http://localhost:${server.address().port}`); |
| |
| const countdown = new Countdown(tests.length, () => { |
| client.close(); |
| server.close(); |
| }); |
| |
| tests.forEach((test) => { |
| const req = client.request({ |
| ':method': 'POST', |
| 'rstcode': test[0] |
| }); |
| req.on('close', common.mustCall(() => { |
| assert.strictEqual(req.rstCode, test[0]); |
| countdown.dec(); |
| })); |
| req.on('aborted', common.mustCall()); |
| if (test[1]) |
| req.on('error', common.mustCall()); |
| else |
| req.on('error', common.mustNotCall()); |
| }); |
| })); |