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