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