1 | 'use strict';
|
2 |
|
3 | var util = require('util');
|
4 | var debug = require('debug')('urllib');
|
5 | var ms = require('humanize-ms');
|
6 | var HttpClient = require('./httpclient');
|
7 |
|
8 | var _Promise;
|
9 |
|
10 | module.exports = HttpClient2;
|
11 |
|
12 | function HttpClient2(options) {
|
13 | HttpClient.call(this, options);
|
14 | }
|
15 |
|
16 | util.inherits(HttpClient2, HttpClient);
|
17 |
|
18 | HttpClient2.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 |
|
55 | HttpClient2.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 |
|
62 | callback = null;
|
63 | cb(null, res);
|
64 | })
|
65 | .catch(function(err) {
|
66 | if (!callback) {
|
67 |
|
68 | return;
|
69 | }
|
70 | callback(err);
|
71 | });
|
72 | };
|
73 | };
|
74 |
|
75 | function sleep(ms) {
|
76 | if (!_Promise) {
|
77 | _Promise = require('any-promise');
|
78 | }
|
79 |
|
80 | return new _Promise(function(resolve) {
|
81 | setTimeout(resolve, ms);
|
82 | });
|
83 | }
|