From 454d17c9902cc2e21dc46be8594cc4830e1e66fd Mon Sep 17 00:00:00 2001 From: secustor Date: Tue, 12 Dec 2023 11:45:57 +0100 Subject: [PATCH] refactor(backend-common/GithubUrlReader): only call fetch inside fetchResponse Signed-off-by: secustor --- .changeset/eight-rice-cross.md | 5 ++ .../src/reading/GithubUrlReader.ts | 55 ++++++++----------- 2 files changed, 28 insertions(+), 32 deletions(-) create mode 100644 .changeset/eight-rice-cross.md diff --git a/.changeset/eight-rice-cross.md b/.changeset/eight-rice-cross.md new file mode 100644 index 0000000000..e40f731a4e --- /dev/null +++ b/.changeset/eight-rice-cross.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-common': patch +--- + +Do not call fetch directly but rather use fetchResponse facility diff --git a/packages/backend-common/src/reading/GithubUrlReader.ts b/packages/backend-common/src/reading/GithubUrlReader.ts index 764431386d..175815cabf 100644 --- a/packages/backend-common/src/reading/GithubUrlReader.ts +++ b/packages/backend-common/src/reading/GithubUrlReader.ts @@ -107,7 +107,7 @@ export class GithubUrlReader implements UrlReader { let response: Response; try { - response = await fetch(ghUrl, { + response = await this.fetchResponse(ghUrl, { headers: { ...credentials?.headers, ...(options?.etag && { 'If-None-Match': options.etag }), @@ -125,38 +125,13 @@ export class GithubUrlReader implements UrlReader { signal: options?.signal as any, }); } catch (e) { - throw new Error(`Unable to read ${url}, ${e}`); + throw e; } - if (response.status === 304) { - throw new NotModifiedError(); - } - - if (response.ok) { - return ReadUrlResponseFactory.fromNodeJSReadable(response.body, { - etag: response.headers.get('ETag') ?? undefined, - lastModifiedAt: parseLastModified( - response.headers.get('Last-Modified'), - ), - }); - } - - let message = `${url} could not be read as ${ghUrl}, ${response.status} ${response.statusText}`; - if (response.status === 404) { - throw new NotFoundError(message); - } - - // GitHub returns a 403 response with a couple of headers indicating rate - // limit status. See more in the GitHub docs: - // https://docs.github.com/en/rest/overview/resources-in-the-rest-api#rate-limiting - if ( - response.status === 403 && - response.headers.get('X-RateLimit-Remaining') === '0' - ) { - message += ' (rate limit exceeded)'; - } - - throw new Error(message); + return ReadUrlResponseFactory.fromNodeJSReadable(response.body, { + etag: response.headers.get('ETag') ?? undefined, + lastModifiedAt: parseLastModified(response.headers.get('Last-Modified')), + }); } async readTree( @@ -350,10 +325,26 @@ export class GithubUrlReader implements UrlReader { const response = await fetch(urlAsString, init); if (!response.ok) { - const message = `Request failed for ${urlAsString}, ${response.status} ${response.statusText}`; + let message = `Request failed for ${urlAsString}, ${response.status} ${response.statusText}`; + + if (response.status === 304) { + throw new NotModifiedError(); + } + if (response.status === 404) { throw new NotFoundError(message); } + + // GitHub returns a 403 response with a couple of headers indicating rate + // limit status. See more in the GitHub docs: + // https://docs.github.com/en/rest/overview/resources-in-the-rest-api#rate-limiting + if ( + response.status === 403 && + response.headers.get('X-RateLimit-Remaining') === '0' + ) { + message += ' (rate limit exceeded)'; + } + throw new Error(message); }