You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					84 lines
				
				2.1 KiB
			
		
		
			
		
	
	
					84 lines
				
				2.1 KiB
			| 
											3 years ago
										 | 'use strict'; | ||
|  | 
 | ||
|  | var util = require('util'); | ||
|  | var debug = require('debug')('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); | ||
|  |   }); | ||
|  | } |