diff options
author | themez <themezeng@gmail.com> | 2019-09-26 11:56:59 +0800 |
---|---|---|
committer | Weijia Wang <starkwang@126.com> | 2019-10-12 11:55:25 +0800 |
commit | 8915b15f8c367ef3ebb1299a57f482146825545b (patch) | |
tree | 35d8aafb898267e9436ca6cc851b2bb8324af01d /doc | |
parent | 075c7ebeb5234b148566c2aed6511357b775c2f6 (diff) | |
download | android-node-v8-8915b15f8c367ef3ebb1299a57f482146825545b.tar.gz android-node-v8-8915b15f8c367ef3ebb1299a57f482146825545b.tar.bz2 android-node-v8-8915b15f8c367ef3ebb1299a57f482146825545b.zip |
http: add reusedSocket property on client request
Set ClientRequest.reusedSocket property when reusing socket for request,
so user can handle retry base on wether the request is reusing a socket.
Refs: https://github.com/request/request/issues/3131
PR-URL: https://github.com/nodejs/node/pull/29715
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com>
Reviewed-By: Weijia Wang <starkwang@126.com>
Diffstat (limited to 'doc')
-rw-r--r-- | doc/api/http.md | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/doc/api/http.md b/doc/api/http.md index 351add59b5..2f1b37064b 100644 --- a/doc/api/http.md +++ b/doc/api/http.md @@ -676,6 +676,62 @@ Removes a header that's already defined into headers object. request.removeHeader('Content-Type'); ``` +### request.reusedSocket + +<!-- YAML +added: REPLACEME +--> + +* {boolean} Whether the request is send through a reused socket. + +When sending request through a keep-alive enabled agent, the underlying socket +might be reused. But if server closes connection at unfortunate time, client +may run into a 'ECONNRESET' error. + +```js +const http = require('http'); + +// Server has a 5 seconds keep-alive timeout by default +http + .createServer((req, res) => { + res.write('hello\n'); + res.end(); + }) + .listen(3000); + +setInterval(() => { + // Adapting a keep-alive agent + http.get('http://localhost:3000', { agent }, (res) => { + res.on('data', (data) => { + // Do nothing + }); + }); +}, 5000); // Sending request on 5s interval so it's easy to hit idle timeout +``` + +By marking a request whether it reused socket or not, we can do +automatic error retry base on it. + +```js +const http = require('http'); +const agent = new http.Agent({ keepAlive: true }); + +function retriableRequest() { + const req = http + .get('http://localhost:3000', { agent }, (res) => { + // ... + }) + .on('error', (err) => { + // Check if retry is needed + if (req.reusedSocket && err.code === 'ECONNRESET') { + retriableRequest(); + } + }); +} + +retriableRequest(); +``` + ### request.setHeader(name, value) <!-- YAML added: v1.6.0 |