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> {