summaryrefslogtreecommitdiff
path: root/doc
diff options
context:
space:
mode:
authorthemez <themezeng@gmail.com>2019-09-26 11:56:59 +0800
committerWeijia Wang <starkwang@126.com>2019-10-12 11:55:25 +0800
commit8915b15f8c367ef3ebb1299a57f482146825545b (patch)
tree35d8aafb898267e9436ca6cc851b2bb8324af01d /doc
parent075c7ebeb5234b148566c2aed6511357b775c2f6 (diff)
downloadandroid-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.md56
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