diff --git a/lib/util/http/index.ts b/lib/util/http/index.ts index bff118fdd9040db7c7236d9d12611e277b56f74d..f685aa47f06c2299034060135aba8171f738cb54 100644 --- a/lib/util/http/index.ts +++ b/lib/util/http/index.ts @@ -1,6 +1,5 @@ import crypto from 'crypto'; import URL from 'url'; -import { GotPromise } from 'got'; import * as runCache from '../cache/run'; import { clone } from '../clone'; import got from '../got'; @@ -34,10 +33,7 @@ export interface HttpResponse<T = string> { headers: any; } -async function cloneResponse<T>( - promisedResponse: GotPromise<any> -): Promise<HttpResponse<T>> { - const response = await promisedResponse; +function cloneResponse<T>(response: any): HttpResponse<T> { // clone body and headers so that the cached result doesn't get accidentally mutated return { body: clone<T>(response.body), @@ -48,7 +44,7 @@ async function cloneResponse<T>( export class Http<GetOptions = HttpOptions, PostOptions = HttpPostOptions> { constructor(private hostType: string, private options?: HttpOptions) {} - protected request<T>( + protected async request<T>( requestUrl: string | URL, httpOptions?: InternalHttpOptions ): Promise<HttpResponse<T> | null> { @@ -94,24 +90,24 @@ export class Http<GetOptions = HttpOptions, PostOptions = HttpPostOptions> { options = applyAuthorization(options); // Cache GET requests unless useCache=false - let promisedRes: GotPromise<any>; - if (options.method === 'get') { - const cacheKey = crypto - .createHash('md5') - .update('got-' + JSON.stringify({ url, headers: options.headers })) - .digest('hex'); - if (options.useCache !== false) { - // check cache unless bypassing it - promisedRes = runCache.get(cacheKey); - } - if (promisedRes === undefined) { - // cache miss OR cache bypass - promisedRes = got(url, options); + const cacheKey = crypto + .createHash('md5') + .update('got-' + JSON.stringify({ url, headers: options.headers })) + .digest('hex'); + if (options.method === 'get' && options.useCache !== false) { + // return from cache if present + const cachedRes = runCache.get(cacheKey); + // istanbul ignore if + if (cachedRes) { + return cloneResponse<T>(await cachedRes); } - runCache.set(cacheKey, promisedRes); // always set - return cloneResponse<T>(promisedRes); } - return cloneResponse<T>(got(url, options)); + const promisedRes = got(url, options); + if (options.method === 'get') { + runCache.set(cacheKey, promisedRes); // always set if it's a get + } + const res = await promisedRes; + return cloneResponse<T>(res); } get(url: string, options: HttpOptions = {}): Promise<HttpResponse> {