@@ -21,7 +21,7 @@ import path = require('path');
2121
2222import { AppErrorCodes , FirebaseAppError } from '../utils/error' ;
2323import { HttpClient , HttpRequestConfig } from '../utils/api-request' ;
24-
24+ import { Agent } from 'http' ;
2525
2626const GOOGLE_TOKEN_AUDIENCE = 'https://accounts.google.com/o/oauth2/token' ;
2727const GOOGLE_AUTH_TOKEN_HOST = 'accounts.google.com' ;
@@ -216,13 +216,16 @@ function requestAccessToken(client: HttpClient, request: HttpRequestConfig): Pro
216216 * Implementation of Credential that uses a service account certificate.
217217 */
218218export class CertCredential implements Credential {
219+
219220 private readonly certificate : Certificate ;
220221 private readonly httpClient : HttpClient ;
222+ private readonly httpAgent : Agent ;
221223
222- constructor ( serviceAccountPathOrObject : string | object ) {
224+ constructor ( serviceAccountPathOrObject : string | object , httpAgent ?: Agent ) {
223225 this . certificate = ( typeof serviceAccountPathOrObject === 'string' ) ?
224226 Certificate . fromPath ( serviceAccountPathOrObject ) : new Certificate ( serviceAccountPathOrObject ) ;
225227 this . httpClient = new HttpClient ( ) ;
228+ this . httpAgent = httpAgent ;
226229 }
227230
228231 public getAccessToken ( ) : Promise < GoogleOAuthAccessToken > {
@@ -236,6 +239,7 @@ export class CertCredential implements Credential {
236239 'Content-Type' : 'application/x-www-form-urlencoded' ,
237240 } ,
238241 data : postData ,
242+ httpAgent : this . httpAgent ,
239243 } ;
240244 return requestAccessToken ( this . httpClient , request ) ;
241245 }
@@ -278,13 +282,16 @@ export interface Credential {
278282 * Implementation of Credential that gets access tokens from refresh tokens.
279283 */
280284export class RefreshTokenCredential implements Credential {
285+
281286 private readonly refreshToken : RefreshToken ;
282287 private readonly httpClient : HttpClient ;
288+ private readonly httpAgent : Agent ;
283289
284- constructor ( refreshTokenPathOrObject : string | object ) {
290+ constructor ( refreshTokenPathOrObject : string | object , httpAgent ?: Agent ) {
285291 this . refreshToken = ( typeof refreshTokenPathOrObject === 'string' ) ?
286292 RefreshToken . fromPath ( refreshTokenPathOrObject ) : new RefreshToken ( refreshTokenPathOrObject ) ;
287293 this . httpClient = new HttpClient ( ) ;
294+ this . httpAgent = httpAgent ;
288295 }
289296
290297 public getAccessToken ( ) : Promise < GoogleOAuthAccessToken > {
@@ -300,6 +307,7 @@ export class RefreshTokenCredential implements Credential {
300307 'Content-Type' : 'application/x-www-form-urlencoded' ,
301308 } ,
302309 data : postData ,
310+ httpAgent : this . httpAgent ,
303311 } ;
304312 return requestAccessToken ( this . httpClient , request ) ;
305313 }
@@ -318,11 +326,17 @@ export class RefreshTokenCredential implements Credential {
318326export class MetadataServiceCredential implements Credential {
319327
320328 private readonly httpClient = new HttpClient ( ) ;
329+ private readonly httpAgent : Agent ;
330+
331+ constructor ( httpAgent ?: Agent ) {
332+ this . httpAgent = httpAgent ;
333+ }
321334
322335 public getAccessToken ( ) : Promise < GoogleOAuthAccessToken > {
323336 const request : HttpRequestConfig = {
324337 method : 'GET' ,
325338 url : `http://${ GOOGLE_METADATA_SERVICE_HOST } ${ GOOGLE_METADATA_SERVICE_PATH } ` ,
339+ httpAgent : this . httpAgent ,
326340 } ;
327341 return requestAccessToken ( this . httpClient , request ) ;
328342 }
@@ -340,21 +354,21 @@ export class MetadataServiceCredential implements Credential {
340354export class ApplicationDefaultCredential implements Credential {
341355 private credential_ : Credential ;
342356
343- constructor ( ) {
357+ constructor ( httpAgent ?: Agent ) {
344358 if ( process . env . GOOGLE_APPLICATION_CREDENTIALS ) {
345359 const serviceAccount = Certificate . fromPath ( process . env . GOOGLE_APPLICATION_CREDENTIALS ) ;
346- this . credential_ = new CertCredential ( serviceAccount ) ;
360+ this . credential_ = new CertCredential ( serviceAccount , httpAgent ) ;
347361 return ;
348362 }
349363
350364 // It is OK to not have this file. If it is present, it must be valid.
351365 const refreshToken = RefreshToken . fromPath ( GCLOUD_CREDENTIAL_PATH ) ;
352366 if ( refreshToken ) {
353- this . credential_ = new RefreshTokenCredential ( refreshToken ) ;
367+ this . credential_ = new RefreshTokenCredential ( refreshToken , httpAgent ) ;
354368 return ;
355369 }
356370
357- this . credential_ = new MetadataServiceCredential ( ) ;
371+ this . credential_ = new MetadataServiceCredential ( httpAgent ) ;
358372 }
359373
360374 public getAccessToken ( ) : Promise < GoogleOAuthAccessToken > {
0 commit comments