httpclient2.js 2.1 KB

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