@@ -5,11 +5,12 @@ var util = require('util')
55var requestSync = require ( 'sync-request' )
66var isNumber = require ( 'lodash.isnumber' )
77var debug = require ( '../../utils/debug' ) ( 'api' )
8- var format = require ( 'util' ) . format
98var assign = require ( 'lodash.assign' )
109var HttpsProxyAgent = require ( 'https-proxy-agent' )
1110var stringify = require ( 'json-stringify-safe' )
1211var BufferStream = require ( './bufferStream' )
12+ var httpRetry = require ( './httpRetry' )
13+ var CompositeError = require ( '../../utils/compositeError' )
1314
1415var bl = require ( 'bl' )
1516var libPackage = require ( '../../../package' )
@@ -34,6 +35,7 @@ function CollectorApi (options) {
3435 this . serviceName = options . serviceName
3536 this . baseRetryInterval = 1000 * 60 * 30 // 30 minutes
3637 this . serviceKey = null
38+ this . getServiceMaxRetries = Infinity
3739
3840 if ( options . proxy ) {
3941 this . proxyAgent = new HttpsProxyAgent ( options . proxy )
@@ -270,7 +272,8 @@ CollectorApi.prototype.getService = function (cb) {
270272 cpus : self . system . cpus
271273 }
272274 } )
273- var req = https . request ( {
275+
276+ var reqOpts = {
274277 hostname : opts . hostname ,
275278 port : opts . port ,
276279 path : opts . path ,
@@ -283,51 +286,41 @@ CollectorApi.prototype.getService = function (cb) {
283286 'X-Reporter-Language' : this . collectorLanguage ,
284287 'Content-Length' : Buffer . byteLength ( payload )
285288 }
286- } , function ( res ) {
287- res . setEncoding ( 'utf8' )
288- res . pipe ( bl ( function ( err , resBuffer ) {
289- var response
290-
291- var retryInterval = self . baseRetryInterval
289+ }
292290
293- if ( err ) {
294- debug . error ( 'getService' , err )
295- return setTimeout ( function ( ) {
296- debug . warn ( 'getService' , format ( 'Retrying with %d ms' , retryInterval ) )
297- self . getService ( )
298- } , retryInterval )
291+ httpRetry ( {
292+ client : https ,
293+ reqOpts : reqOpts ,
294+ payload : payload ,
295+ errorFilter : function shouldContinueRetrying ( err ) {
296+ if ( err . statusCode === 401 ) {
297+ return false
299298 }
300-
301- var resText = resBuffer . toString ( 'utf8' )
302-
303- if ( res . statusCode === 401 ) {
304- debug . error ( 'getService' , 'Api key rejected' )
305- return
299+ return true
300+ } ,
301+ maxRetries : this . getServiceMaxRetries
302+ } ,
303+ function done ( err , result ) {
304+ if ( err ) {
305+ if ( err . statusCode === 401 ) {
306+ debug . error ( 'getService' , 'API key rejected' )
306307 }
307- if ( res . statusCode > 399 ) {
308- debug . error ( 'getService' , 'Service responded with ' + res . statusCode )
309- return setTimeout ( function ( ) {
310- debug . warn ( 'getService' , format ( 'Retrying with %d ms' , retryInterval ) )
311- self . getService ( cb )
312- } , retryInterval )
308+ return cb ( new CompositeError ( 'Could not get service key' , err ) )
309+ }
310+ var response
311+ result . pipe ( bl ( function ( err , data ) {
312+ if ( err ) {
313+ cb ( err )
313314 }
314-
315315 try {
316- response = JSON . parse ( resText )
317- } catch ( ex ) {
318- return
316+ response = JSON . parse ( data . toString ( 'utf8' ) )
317+ } catch ( err ) {
318+ return cb ( err )
319319 }
320-
321320 self . serviceKey = response . key
322321 cb ( null , response . key )
323322 } ) )
324323 } )
325-
326- req . on ( 'error' , function ( error ) {
327- debug . error ( 'getService' , error )
328- } )
329- req . write ( payload )
330- req . end ( )
331324}
332325
333326function logServiceKeyError ( method ) {
0 commit comments