diff --git a/.changeset/odd-places-make.md b/.changeset/odd-places-make.md new file mode 100644 index 0000000..9d1c9a2 --- /dev/null +++ b/.changeset/odd-places-make.md @@ -0,0 +1,5 @@ +--- +"@redirection.io/vercel-middleware": patch +--- + +fix: forward rio headers to next middleware diff --git a/.changeset/tame-otters-repeat.md b/.changeset/tame-otters-repeat.md new file mode 100644 index 0000000..e770ee6 --- /dev/null +++ b/.changeset/tame-otters-repeat.md @@ -0,0 +1,5 @@ +--- +"@redirection.io/vercel-middleware": patch +--- + +fix: pass original backend headers to the body filter before they are mutated diff --git a/.zed/settings.json b/.zed/settings.json index 1ab7810..7806159 100644 --- a/.zed/settings.json +++ b/.zed/settings.json @@ -13,4 +13,12 @@ "allowed": false, }, "language_servers": ["!eslint", "!biome", "..."], + "languages": { + "TypeScript": { + "language_servers": ["vstls", "!typescript-language-server", "!eslint", "!biome", "..."], + }, + "TSX": { + "language_servers": ["vstls", "!typescript-language-server", "!eslint", "!biome", "..."], + }, + }, } diff --git a/packages/vercel-middleware/package.json b/packages/vercel-middleware/package.json index 96c52ea..1152853 100644 --- a/packages/vercel-middleware/package.json +++ b/packages/vercel-middleware/package.json @@ -50,7 +50,7 @@ } }, "dependencies": { - "@redirection.io/redirectionio": "^3.0.0", + "@redirection.io/redirectionio": "^3.3.0", "@vercel/edge": "^1.1.2", "@vercel/functions": "^1.4.1" }, diff --git a/packages/vercel-middleware/src/env.ts b/packages/vercel-middleware/src/env.ts index 6f355ff..c773fd9 100644 --- a/packages/vercel-middleware/src/env.ts +++ b/packages/vercel-middleware/src/env.ts @@ -1,7 +1,7 @@ export const getEnv = () => { const REDIRECTIONIO_TOKEN = process.env.REDIRECTIONIO_TOKEN || ""; const REDIRECTIONIO_INSTANCE_NAME = process.env.REDIRECTIONIO_INSTANCE_NAME || "redirection-io-vercel-middleware"; - const REDIRECTIONIO_VERSION = "redirection-io-vercel-middleware/0.3.12"; + const REDIRECTIONIO_VERSION = `redirection-io-vercel-middleware/0.5.2`; const REDIRECTIONIO_ADD_HEADER_RULE_IDS = process.env.REDIRECTIONIO_ADD_HEADER_RULE_IDS ? process.env.REDIRECTIONIO_ADD_HEADER_RULE_IDS === "true" : false; diff --git a/packages/vercel-middleware/src/middleware.ts b/packages/vercel-middleware/src/middleware.ts index 45f89f8..dea5742 100644 --- a/packages/vercel-middleware/src/middleware.ts +++ b/packages/vercel-middleware/src/middleware.ts @@ -148,7 +148,7 @@ async function handler( const ip = ipAddress(request); const redirectionIORequest = createRedirectionIORequest({ url: new URL(request.url), - headers: Object.fromEntries(Object.entries(request.headers)) as Record, + headers: Object.fromEntries(request.headers.entries()) as Record, method: request.method, ip, }); @@ -163,10 +163,16 @@ async function handler( const proxyResponseTime = Date.now(); - response.headers.set(REDIRECTIONIO_PROXY_RESPONSE_TIME_HEADER, proxyResponseTime.toString()); - response.headers.set(REDIRECTIONIO_START_TIME_HEADER, startTimestamp.toString()); - response.headers.set(REDIRECTIONIO_MATCH_TIME_TIME_HEADER, actionMatchTime.toString()); - response.headers.set(REDIRECTIONIO_ACTION_HEADER, action.serialize()); + const forwardHeaders = new Headers({ + [REDIRECTIONIO_PROXY_RESPONSE_TIME_HEADER]: proxyResponseTime.toString(), + [REDIRECTIONIO_START_TIME_HEADER]: startTimestamp.toString(), + [REDIRECTIONIO_MATCH_TIME_TIME_HEADER]: actionMatchTime.toString(), + [REDIRECTIONIO_ACTION_HEADER]: action.serialize(), + }); + + if (response.headers.get("x-middleware-next") === "1") { + return next({ request: { headers: forwardHeaders } }); + } const url = new URL(request.url); const location = response.headers.get("Location"); @@ -316,7 +322,7 @@ async function proxy( try { const statusCodeBeforeResponse = action.get_status_code(0); - let response; + let response: Response; if (statusCodeBeforeResponse === 0) { response = await fetchResponse(request, true); @@ -354,6 +360,8 @@ async function proxy( } }); + const bodyFilter = action.create_body_filter(backendStatusCode, headerMap); + const newHeaderMap = action.filter_headers(headerMap, backendStatusCode, REDIRECTIONIO_ADD_HEADER_RULE_IDS); const newHeaders = new Headers(); @@ -371,9 +379,6 @@ async function proxy( headers: newHeaders, }); - newHeaderMap.remove_header("content-encoding"); - const bodyFilter = action.create_body_filter(backendStatusCode, newHeaderMap); - // Skip body filtering if (bodyFilter.is_null()) { return [response, response.status]; diff --git a/yarn.lock b/yarn.lock index 09112a0..374e3c7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1268,10 +1268,10 @@ __metadata: languageName: node linkType: hard -"@redirection.io/redirectionio@npm:^3.0.0": - version: 3.0.0 - resolution: "@redirection.io/redirectionio@npm:3.0.0" - checksum: 10c0/8b4e39c5f04fa73c716d1529df8d27aae0f85eb33027f133c9451892509dfb3743e6af8eb50747b4f14ebf6650485907f82a5722b3b7c4f77f1621f89550fd0f +"@redirection.io/redirectionio@npm:^3.3.0": + version: 3.3.0 + resolution: "@redirection.io/redirectionio@npm:3.3.0" + checksum: 10c0/4d717759b11110b366c033a8eff8b5036e0823f296fe0f80ef63ee9a9d0ac7612d97db33bb2d79d12d488420c06fb9288ac93c7383a468300b0f8272e063213a languageName: node linkType: hard @@ -1279,7 +1279,7 @@ __metadata: version: 0.0.0-use.local resolution: "@redirection.io/vercel-middleware@workspace:packages/vercel-middleware" dependencies: - "@redirection.io/redirectionio": "npm:^3.0.0" + "@redirection.io/redirectionio": "npm:^3.3.0" "@types/node": "npm:^25.2.2" "@vercel/edge": "npm:^1.1.2" "@vercel/functions": "npm:^1.4.1"