From 54a6c30364e16fb2d0e7c34ee1f01b8ed3d6740f Mon Sep 17 00:00:00 2001 From: flakey5 <73616808+flakey5@users.noreply.github.com> Date: Wed, 21 Oct 2026 16:20:52 -0700 Subject: [PATCH] src, e2e-tests: remove www server fallback logic Closes #1051 Signed-off-by: flakey5 <73616808+flakey5@users.noreply.github.com> --- e2e-tests/fallback.test.ts | 105 ----------------------------- src/middleware/originMiddleware.ts | 67 ------------------ src/routes/index.ts | 22 +++--- wrangler.jsonc | 3 - 4 files changed, 10 insertions(+), 187 deletions(-) delete mode 100644 e2e-tests/fallback.test.ts delete mode 100644 src/middleware/originMiddleware.ts diff --git a/e2e-tests/fallback.test.ts b/e2e-tests/fallback.test.ts deleted file mode 100644 index b5cf0a62..00000000 --- a/e2e-tests/fallback.test.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { env, fetchMock, createExecutionContext } from 'cloudflare:test'; -import { test, beforeAll, afterEach, expect, vi } from 'vitest'; -import { populateR2WithDevBucket } from './util'; -import worker from '../src/worker'; -import type { Env } from '../src/env'; -import { CACHE_HEADERS } from '../src/constants/cache'; - -const mockedEnv: Env = { - ...env, - ENVIRONMENT: 'e2e-tests', - LOG_ERRORS: false, - S3_ENDPOINT: 'https://s3.mock', - S3_ACCESS_KEY_ID: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', - S3_ACCESS_KEY_SECRET: - 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', - ORIGIN_HOST: 'https://origin.mock', -}; - -const s3Url = new URL(mockedEnv.S3_ENDPOINT); -s3Url.host = `${mockedEnv.BUCKET_NAME}.${s3Url.host}`; - -beforeAll(async () => { - fetchMock.activate(); - fetchMock.disableNetConnect(); - - await populateR2WithDevBucket(); -}); - -afterEach(() => { - fetchMock.assertNoPendingInterceptors(); -}); - -test('grabs file from fallback server if r2 request fails', async () => { - vi.spyOn(env.R2_BUCKET, 'get').mockImplementation(() => { - throw new TypeError('This should be thrown.'); - }); - - let originCalled = false; - const originResponse = '{ "asd": true }'; - fetchMock - .get(mockedEnv.ORIGIN_HOST) - .intercept({ - path: '/dist/index.json', - }) - .reply(() => { - originCalled = true; - - return { - statusCode: 200, - data: originResponse, - }; - }); - - const ctx = createExecutionContext(); - - const res = await worker.fetch( - new Request('https://localhost/dist/index.json'), - mockedEnv, - ctx - ); - - expect(res.status).toBe(200); - expect(res.headers.get('cache-control')).toStrictEqual(CACHE_HEADERS.mutable); - expect(originCalled).toBeTruthy(); - expect(await res.text()).toStrictEqual(originResponse); -}); - -test('grabs directory from fallback server if r2 request fails', async () => { - fetchMock - .get(s3Url.origin) - .intercept({ - path: /.*/, - }) - .reply(500, '') - .times(1); - - let originCalled = false; - const originResponse = ''; - fetchMock - .get(mockedEnv.ORIGIN_HOST) - .intercept({ - path: '/dist/v20.0.0/', - }) - .reply(() => { - originCalled = true; - - return { - statusCode: 200, - data: originResponse, - }; - }); - - const ctx = createExecutionContext(); - - const res = await worker.fetch( - new Request('https://localhost/dist/v20.0.0/'), - mockedEnv, - ctx - ); - - expect(res.status).toBe(200); - expect(res.headers.get('cache-control')).toStrictEqual(CACHE_HEADERS.failure); - expect(originCalled).toBeTruthy(); - expect(await res.text()).toStrictEqual(originResponse); -}); diff --git a/src/middleware/originMiddleware.ts b/src/middleware/originMiddleware.ts deleted file mode 100644 index 725dda37..00000000 --- a/src/middleware/originMiddleware.ts +++ /dev/null @@ -1,67 +0,0 @@ -import * as Sentry from '@sentry/cloudflare'; -import { CACHE_HEADERS } from '../constants/cache'; -import type { Context } from '../context'; -import type { Request } from '../routes/request'; -import { isDirectoryPath } from '../utils/path'; -import { cacheControlFor } from '../utils/cache'; -import { getOriginalUrl } from '../utils/request'; -import type { Middleware } from './middleware'; - -/** - * Rewrites request to go to the DO/origin server. This is used as a failover - * for if we exhaust all of our retries to R2. - * - * This server has the exact same assets as R2. We should minimize the amount - * of requests that hit this middleware unless there's good reason to do so. - */ -export class OriginMiddleware implements Middleware { - async handle(request: Request, ctx: Context): Promise { - Sentry.addBreadcrumb({ - category: 'OriginMiddleware', - message: 'hit', - }); - - const originPathname = getOriginalUrl(request).pathname; - - const res = await fetch( - `${ctx.env.ORIGIN_HOST}${request.urlObj.pathname}`, - { - method: request.method, - headers: { - 'user-agent': 'release-cloudflare-worker', - 'if-match': request.headers.get('if-match') ?? '', - 'if-none-match': request.headers.get('if-none-match') ?? '', - 'if-modified-since': request.headers.get('if-modified-since') ?? '', - 'if-unmodified-since': - request.headers.get('if-unmodified-since') ?? '', - range: request.headers.get('range') ?? '', - }, - } - ); - - return new Response(res.body, { - status: res.status, - headers: { - etag: res.headers.get('etag') ?? '', - 'accept-ranges': res.headers.get('accept-ranges') ?? '', - 'access-control-allow-origin': - res.headers.get('access-control-allow-origin') ?? '', - expires: res.headers.get('expires') ?? '', - 'last-modified': res.headers.get('last-modified') ?? '', - 'content-encoding': res.headers.get('content-encoding') ?? '', - 'content-type': res.headers.get('content-type') ?? '', - 'content-language': res.headers.get('content-language') ?? '', - 'content-disposition': res.headers.get('content-disposition') ?? '', - 'content-length': res.headers.get('content-length') ?? '', - - // Don't cache this response on the client if it's a directory listing, - // since our listing response might end up differently from nginx's at - // some point - 'cache-control': isDirectoryPath(originPathname) - ? CACHE_HEADERS.failure - : cacheControlFor(originPathname, res.status), - 'cache-tag': 'release-worker,release-worker:origin', - }, - }); - } -} diff --git a/src/routes/index.ts b/src/routes/index.ts index 2bfb2ef5..244184ee 100644 --- a/src/routes/index.ts +++ b/src/routes/index.ts @@ -2,7 +2,6 @@ import latestVersions from '../constants/latestVersions.json' assert { type: 'js import { MethodNotAllowedMiddleware } from '../middleware/methodNotAllowedMiddleware'; import { NotFoundMiddleware } from '../middleware/notFoundMiddleware'; import { OptionsMiddleware } from '../middleware/optionsMiddleware'; -import { OriginMiddleware } from '../middleware/originMiddleware'; import { R2Middleware } from '../middleware/r2Middleware'; import { RedirectionMiddleware } from '../middleware/redirectionMiddleware'; import { SubtitutionMiddleware } from '../middleware/subtituteMiddleware'; @@ -11,7 +10,6 @@ import type { Router } from './router'; export function registerRoutes(router: Router): void { const r2Middleware = new R2Middleware(); - const originMiddleware = new OriginMiddleware(); const corepackRedirectMiddleware = new RedirectionMiddleware( 'https://github.com/nodejs/corepack#readme' @@ -19,8 +17,8 @@ export function registerRoutes(router: Router): void { router.options('*', new OptionsMiddleware()); - router.head('/metrics/?:filePath+', r2Middleware, originMiddleware); - router.get('/metrics/?:filePath+', r2Middleware, originMiddleware); + router.head('/metrics/?:filePath+', r2Middleware); + router.get('/metrics/?:filePath+', r2Middleware); router.all('/api/corepack.html', corepackRedirectMiddleware); router.all('/docs/latest/api/corepack.html', corepackRedirectMiddleware); @@ -50,17 +48,17 @@ export function registerRoutes(router: Router): void { router.head('/llms.txt', r2Middleware); router.get('/llms.txt', r2Middleware); - router.head('/dist/?:filePath+', r2Middleware, originMiddleware); - router.get('/dist/?:filePath+', r2Middleware, originMiddleware); + router.head('/dist/?:filePath+', r2Middleware); + router.get('/dist/?:filePath+', r2Middleware); - router.head('/download/?:filePath+', r2Middleware, originMiddleware); - router.get('/download/?:filePath+', r2Middleware, originMiddleware); + router.head('/download/?:filePath+', r2Middleware); + router.get('/download/?:filePath+', r2Middleware); - router.head('/api/?:filePath+', r2Middleware, originMiddleware); - router.get('/api/?:filePath+', r2Middleware, originMiddleware); + router.head('/api/?:filePath+', r2Middleware); + router.get('/api/?:filePath+', r2Middleware); - router.head('/docs/?:version?/:filePath+?', r2Middleware, originMiddleware); - router.get('/docs/?:version?/:filePath+?', r2Middleware, originMiddleware); + router.head('/docs/?:version?/:filePath+?', r2Middleware); + router.get('/docs/?:version?/:filePath+?', r2Middleware); router.post('/_throw', new ThrowMiddleware()); diff --git a/wrangler.jsonc b/wrangler.jsonc index f47bb9a0..34dff58b 100644 --- a/wrangler.jsonc +++ b/wrangler.jsonc @@ -14,7 +14,6 @@ "LOG_ERRORS": true, "S3_ENDPOINT": "https://07be8d2fbc940503ca1be344714cb0d1.r2.cloudflarestorage.com", "BUCKET_NAME": "dist-prod", - "ORIGIN_HOST": "https://origin.nodejs.org", }, "r2_buckets": [ { @@ -35,7 +34,6 @@ "LOG_ERRORS": false, "S3_ENDPOINT": "https://07be8d2fbc940503ca1be344714cb0d1.r2.cloudflarestorage.com", "BUCKET_NAME": "dist-prod", - "ORIGIN_HOST": "https://origin.nodejs.org", }, "workers_dev": true, "r2_buckets": [ @@ -89,7 +87,6 @@ "LOG_ERRORS": false, "S3_ENDPOINT": "https://07be8d2fbc940503ca1be344714cb0d1.r2.cloudflarestorage.com", "BUCKET_NAME": "dist-prod", - "ORIGIN_HOST": "https://origin.nodejs.org", "USE_KV": true, "KV_DIRECTORIES": [ "metrics/",