|
2 | 2 |
|
3 | 3 | const common = require('../common');
|
4 | 4 | const assert = require('assert');
|
5 |
| -const { HTTPParser } = process.binding('http_parser'); |
| 5 | +const { request } = require('http'); |
| 6 | +const { Duplex } = require('stream'); |
6 | 7 |
|
7 |
| -let second = false; |
8 |
| -const parser = new HTTPParser(HTTPParser.RESPONSE, false); |
| 8 | +let socket; |
9 | 9 |
|
10 |
| -parser.initialize(HTTPParser.RESPONSE, {}, 0, 0); |
| 10 | +function createConnection(...args) { |
| 11 | + socket = new Duplex({ |
| 12 | + read() {}, |
| 13 | + write(chunk, encoding, callback) { |
| 14 | + if (chunk.toString().includes('\r\n\r\n')) { |
| 15 | + this.push('HTTP/1.1 100 Continue\r\n\r\n'); |
| 16 | + } |
11 | 17 |
|
12 |
| -parser[HTTPParser.kOnHeadersComplete] = common.mustCall( |
13 |
| - function(_versionMajor, _versionMinor, _headers, _method, _url, statusCode) { |
14 |
| - if (!second) { |
15 |
| - second = true; |
16 |
| - |
17 |
| - assert.strictEqual(statusCode, 100); |
18 |
| - parser.execute(Buffer.from('HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n')); |
19 |
| - } else { |
20 |
| - assert.strictEqual(statusCode, 200); |
| 18 | + callback(); |
21 | 19 | }
|
22 |
| - }, |
23 |
| - 2 |
24 |
| -); |
| 20 | + }); |
| 21 | + |
| 22 | + return socket; |
| 23 | +} |
| 24 | + |
| 25 | +const req = request('http://localhost:8080', { createConnection }); |
| 26 | + |
| 27 | +req.on('information', common.mustCall(({ statusCode }) => { |
| 28 | + assert.strictEqual(statusCode, 100); |
| 29 | + socket.push('HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n'); |
| 30 | + socket.push(null); |
| 31 | +})); |
| 32 | + |
| 33 | +req.on('response', common.mustCall(({ statusCode }) => { |
| 34 | + assert.strictEqual(statusCode, 200); |
| 35 | +})); |
25 | 36 |
|
26 |
| -parser.execute(Buffer.from('HTTP/1.1 100 Continue\r\n\r\n')); |
| 37 | +req.end(); |
0 commit comments