UNPKG

2.17 kBJavaScriptView Raw
1'use strict';
2
3var util = require('util');
4var debug = require('debug')('urllib');
5var ms = require('humanize-ms');
6var HttpClient = require('./httpclient');
7
8var _Promise;
9
10module.exports = HttpClient2;
11
12function HttpClient2(options) {
13 HttpClient.call(this, options);
14}
15
16util.inherits(HttpClient2, HttpClient);
17
18HttpClient2.prototype.request = HttpClient2.prototype.curl = function request(url, args) {
19 var self = this;
20 args = args || {};
21 args.retry = args.retry || 0;
22 if (args.retryDelay) {
23 args.retryDelay = ms(args.retryDelay);
24 }
25 args.isRetry = args.isRetry || function(res) {
26 return res.status >= 500;
27 };
28 return HttpClient.prototype.request.call(self, url, args)
29 .then(function(res) {
30 if (args.retry > 0 && typeof args.isRetry === 'function' && args.isRetry(res)) {
31 args.retry--;
32 debug('retry request %s, remain %s', url, args.retry);
33 if (args.retryDelay) {
34 debug('retry after %sms', args.retryDelay);
35 return sleep(args.retryDelay).then(function() { return self.request(url, args); });
36 }
37 return self.request(url, args);
38 }
39 return res;
40 })
41 .catch(function(err) {
42 if (args.retry > 0) {
43 args.retry--;
44 debug('retry request %s, remain %s, err %s', url, args.retry, err);
45 if (args.retryDelay) {
46 debug('retry after %sms', args.retryDelay);
47 return sleep(args.retryDelay).then(function() { return self.request(url, args); });
48 }
49 return self.request(url, args);
50 }
51 throw err;
52 });
53};
54
55HttpClient2.prototype.requestThunk = function requestThunk(url, args) {
56 var self = this;
57 return function(callback) {
58 self.request(url, args)
59 .then(function(res) {
60 var cb = callback;
61 // make sure cb(null, res) throw error won't emit catch callback below
62 callback = null;
63 cb(null, res);
64 })
65 .catch(function(err) {
66 if (!callback) {
67 // TODO: how to handle this error?
68 return;
69 }
70 callback(err);
71 });
72 };
73};
74
75function sleep(ms) {
76 if (!_Promise) {
77 _Promise = require('any-promise');
78 }
79
80 return new _Promise(function(resolve) {
81 setTimeout(resolve, ms);
82 });
83}