diff options
author | Fedor Indutny <fedor@indutny.com> | 2016-06-03 23:59:04 -0400 |
---|---|---|
committer | Fedor Indutny <fedor@indutny.com> | 2016-06-06 13:34:11 -0400 |
commit | 1004ece889b42e13e7b0a3befa3b49ae3c23bf70 (patch) | |
tree | 278346d63478aaa2c5ed6794f89e5e548797a098 /test | |
parent | 0ed4d8c535945865d48d50c023aba46f6286f616 (diff) | |
download | android-node-v8-1004ece889b42e13e7b0a3befa3b49ae3c23bf70.tar.gz android-node-v8-1004ece889b42e13e7b0a3befa3b49ae3c23bf70.tar.bz2 android-node-v8-1004ece889b42e13e7b0a3befa3b49ae3c23bf70.zip |
http: wait for both prefinish/end to keepalive
When `free`ing the socket to be reused in keep-alive Agent wait for
both `prefinish` and `end` events. Otherwise the next request may be
written before the previous one has finished sending the body, leading
to a parser errors.
PR-URL: https://github.com/nodejs/node/pull/7149
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Diffstat (limited to 'test')
-rw-r--r-- | test/parallel/test-http-client-keep-alive-release-before-finish.js | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/test/parallel/test-http-client-keep-alive-release-before-finish.js b/test/parallel/test-http-client-keep-alive-release-before-finish.js new file mode 100644 index 0000000000..374bacba3e --- /dev/null +++ b/test/parallel/test-http-client-keep-alive-release-before-finish.js @@ -0,0 +1,38 @@ +'use strict'; +const common = require('../common'); +const http = require('http'); + +const server = http.createServer((req, res) => { + res.end(); +}).listen(common.PORT, common.mustCall(() => { + const agent = new http.Agent({ + maxSockets: 1, + keepAlive: true + }); + + const post = http.request({ + agent: agent, + method: 'POST', + port: common.PORT, + }, common.mustCall((res) => { + res.resume(); + })); + + /* What happens here is that the server `end`s the response before we send + * `something`, and the client thought that this is a green light for sending + * next GET request + */ + post.write(Buffer.alloc(16 * 1024, 'X')); + setTimeout(() => { + post.end('something'); + }, 100); + + http.request({ + agent: agent, + method: 'GET', + port: common.PORT, + }, common.mustCall((res) => { + server.close(); + res.connection.end(); + })).end(); +})); |