From 27240795d51ede5daa1e20194da80f1634aa0591 Mon Sep 17 00:00:00 2001 From: Timo Stamm Date: Fri, 3 Jun 2022 21:12:40 +0200 Subject: [PATCH] Guard access of response.type to support Cloudflare Workers This is #321, but applied to the grpcweb-transport as well. All tests pass locally. --- CHANGELOG.md | 6 +++++- packages/grpcweb-transport/src/grpc-web-format.ts | 10 +++++++++- packages/twirp-transport/src/twirp-transport.ts | 8 +++++++- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4f5e02a0..8b044ec2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,10 @@ ### unreleased changes -none + +Bug fixes: + +- Guard access of response.type to support Cloudflare Workers, see #321 + Thanks to @mikeylemmon for the fix! ### v2.6.0 diff --git a/packages/grpcweb-transport/src/grpc-web-format.ts b/packages/grpcweb-transport/src/grpc-web-format.ts index d9db719c..bda6f55b 100644 --- a/packages/grpcweb-transport/src/grpc-web-format.ts +++ b/packages/grpcweb-transport/src/grpc-web-format.ts @@ -86,13 +86,21 @@ export function readGrpcWebResponseHeader(headers: HttpHeaders, httpStatus: numb export function readGrpcWebResponseHeader(headersOrFetchResponse: HttpHeaders | Response, httpStatus?: number, httpStatusText?: string): [GrpcStatusCode, string | undefined, RpcMetadata] { if (arguments.length === 1) { let fetchResponse = headersOrFetchResponse as Response; - switch (fetchResponse.type) { + + // Cloudflare Workers throw when the type property of a fetch response + // is accessed, so wrap access with try/catch. See: + // * https://developers.cloudflare.com/workers/runtime-apis/response/#properties + // * https://github.com/cloudflare/miniflare/blob/72f046e/packages/core/src/standards/http.ts#L646 + let responseType + try { responseType = fetchResponse.type } catch {} + switch (responseType) { case "error": case "opaque": case "opaqueredirect": // see https://developer.mozilla.org/en-US/docs/Web/API/Response/type throw new RpcError(`fetch response type ${fetchResponse.type}`, GrpcStatusCode[GrpcStatusCode.UNKNOWN]); } + return readGrpcWebResponseHeader( fetchHeadersToHttp(fetchResponse.headers), fetchResponse.status, diff --git a/packages/twirp-transport/src/twirp-transport.ts b/packages/twirp-transport/src/twirp-transport.ts index bb3376b3..c3e0ee15 100644 --- a/packages/twirp-transport/src/twirp-transport.ts +++ b/packages/twirp-transport/src/twirp-transport.ts @@ -58,7 +58,13 @@ export class TwirpFetchTransport implements RpcTransport { defHeader.resolve(parseMetadataFromResponseHeaders(fetchResponse.headers)); - switch (fetchResponse.type) { + // Cloudflare Workers throw when the type property of a fetch response + // is accessed, so wrap access with try/catch. See: + // * https://developers.cloudflare.com/workers/runtime-apis/response/#properties + // * https://github.com/cloudflare/miniflare/blob/72f046e/packages/core/src/standards/http.ts#L646 + let responseType + try { responseType = fetchResponse.type } catch {} + switch (responseType) { case "error": case "opaque": case "opaqueredirect":