From cd1a4630f8524ac7fbd7595bef2e1692afa904f1 Mon Sep 17 00:00:00 2001 From: Yichang Liu Date: Tue, 17 Jul 2018 04:41:40 +0800 Subject: [PATCH] fix: add url for cached response (#1355) --- packages/apollo-datasource-rest/src/HTTPCache.ts | 8 +++++++- .../src/types/http-cache-semantics/index.d.ts | 1 + packages/apollo-server-env/src/fetch.d.ts | 7 ++++++- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/packages/apollo-datasource-rest/src/HTTPCache.ts b/packages/apollo-datasource-rest/src/HTTPCache.ts index bccd341f..a254ce2c 100644 --- a/packages/apollo-datasource-rest/src/HTTPCache.ts +++ b/packages/apollo-datasource-rest/src/HTTPCache.ts @@ -37,7 +37,11 @@ export class HTTPCache { if (policy.satisfiesWithoutRevalidation(policyRequestFrom(request))) { const headers = policy.responseHeaders(); - return new Response(body, { status: policy._status, headers }); + return new Response(body, { + url: policy._url, + status: policy._status, + headers, + }); } else { const revalidationHeaders = policy.revalidationHeaders( policyRequestFrom(request), @@ -57,6 +61,7 @@ export class HTTPCache { modified ? revalidationResponse : new Response(body, { + url: revalidatedPolicy._url, status: revalidatedPolicy._status, headers: revalidatedPolicy.responseHeaders(), }), @@ -91,6 +96,7 @@ export class HTTPCache { // To avoid https://github.com/bitinn/node-fetch/issues/151, we don't use // response.clone() but create a new response from the consumed body return new Response(body, { + url: response.url, status: response.status, statusText: response.statusText, headers: policy.responseHeaders(), diff --git a/packages/apollo-datasource-rest/src/types/http-cache-semantics/index.d.ts b/packages/apollo-datasource-rest/src/types/http-cache-semantics/index.d.ts index 0d5164c2..a6815ca4 100644 --- a/packages/apollo-datasource-rest/src/types/http-cache-semantics/index.d.ts +++ b/packages/apollo-datasource-rest/src/types/http-cache-semantics/index.d.ts @@ -31,6 +31,7 @@ declare module 'http-cache-semantics' { static fromObject(object: object): CachePolicy; toObject(): object; + _url: string; _status: number; } diff --git a/packages/apollo-server-env/src/fetch.d.ts b/packages/apollo-server-env/src/fetch.d.ts index d40edd9b..a4b6c9c2 100644 --- a/packages/apollo-server-env/src/fetch.d.ts +++ b/packages/apollo-server-env/src/fetch.d.ts @@ -78,7 +78,8 @@ export type ReferrerPolicy = | 'unsafe-url'; export declare class Response extends Body { - constructor(body?: BodyInit, init?: ResponseInit); + // node-fetch accepts options as the second argument instead of a pure ResponseInit + constructor(body?: BodyInit, options?: ResponseOptions); static error(): Response; static redirect(url: string, status?: number): Response; @@ -98,4 +99,8 @@ export interface ResponseInit { statusText?: string; } +export interface ResponseOptions extends ResponseInit { + url?: string; +} + export type BodyInit = ArrayBuffer | ArrayBufferView | string;