mirror of https://github.com/lukechilds/node.git
Browse Source
When using an Agent for HTTPS, `TLSSocket`s are reused and need to have the ability to `asyncReset` from JS. PR-URL: https://github.com/nodejs/node/pull/13092 Fixes: https://github.com/nodejs/node/issues/13045 Reviewed-By: Andreas Madsen <amwebdk@gmail.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Matteo Collina <matteo.collina@gmail.com>v6
Refael Ackermann
8 years ago
2 changed files with 54 additions and 0 deletions
@ -0,0 +1,53 @@ |
|||
'use strict'; |
|||
const common = require('../common'); |
|||
|
|||
// Refs: https://github.com/nodejs/node/issues/13045
|
|||
// An HTTP Agent reuses a TLSSocket, and makes a failed call to `asyncReset`.
|
|||
|
|||
const assert = require('assert'); |
|||
const https = require('https'); |
|||
const fs = require('fs'); |
|||
|
|||
const serverOptions = { |
|||
key: fs.readFileSync(`${common.fixturesDir}/keys/agent1-key.pem`), |
|||
cert: fs.readFileSync(`${common.fixturesDir}/keys/agent1-cert.pem`), |
|||
ca: fs.readFileSync(`${common.fixturesDir}/keys/ca1-cert.pem`) |
|||
}; |
|||
|
|||
const server = https.createServer(serverOptions, common.mustCall((req, res) => { |
|||
res.end('hello world\n'); |
|||
}, 2)); |
|||
|
|||
server.listen(0, common.mustCall(function() { |
|||
const port = this.address().port; |
|||
const clientOptions = { |
|||
agent: new https.Agent({ |
|||
keepAlive: true, |
|||
rejectUnauthorized: false |
|||
}), |
|||
port: port |
|||
}; |
|||
|
|||
const req = https.get(clientOptions, common.mustCall((res) => { |
|||
assert.strictEqual(res.statusCode, 200); |
|||
res.on('error', (err) => assert.fail(err)); |
|||
res.socket.on('error', (err) => assert.fail(err)); |
|||
res.resume(); |
|||
// drain the socket and wait for it to be free to reuse
|
|||
res.socket.once('free', () => { |
|||
// This is the pain point. Internally the Agent will call
|
|||
// `socket._handle.asyncReset()` and if the _handle does not implement
|
|||
// `asyncReset` this will throw TypeError
|
|||
const req2 = https.get(clientOptions, common.mustCall((res2) => { |
|||
assert.strictEqual(res.statusCode, 200); |
|||
res2.on('error', (err) => assert.fail(err)); |
|||
res2.socket.on('error', (err) => assert.fail(err)); |
|||
// this should be the end of the test
|
|||
res2.destroy(); |
|||
server.close(); |
|||
})); |
|||
req2.on('error', (err) => assert.fail(err)); |
|||
}); |
|||
})); |
|||
req.on('error', (err) => assert.fail(err)); |
|||
})); |
Loading…
Reference in new issue