| '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); | |
|   }); | |
| }
 |