Skip to content

Commit 8babac6

Browse files
authored
preserveSearch in /hive-testing/ rewrite (#1873)
1 parent f34697d commit 8babac6

File tree

5 files changed

+276
-2
lines changed

5 files changed

+276
-2
lines changed

packages/website-router/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@
44
"main": "index.ts",
55
"scripts": {
66
"dev": "wrangler dev",
7+
"test": "node --import @oxc-node/core/register --test \"src/**/*.test.ts\"",
78
"typecheck": "tsc --noEmit"
89
},
910
"dependencies": {
1011
"toucan-js": "3.4.0"
1112
},
1213
"devDependencies": {
1314
"@cloudflare/workers-types": "4.20250321.0",
15+
"@oxc-node/core": "^0.0.35",
1416
"@types/node": "20.17.12",
1517
"typescript": "5.7.3",
1618
"wrangler": "3.78.7"

packages/website-router/src/config.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
export type RewriteRecord = {
22
rewrite: string;
3+
preserveSearch?: boolean;
34
crisp?: { segments: string[] };
45
sitemap?: boolean;
56
banner?: string;
@@ -102,6 +103,7 @@ export const jsonConfig = {
102103
},
103104
'/graphql/hive-testing': {
104105
rewrite: 'hive-platform-docs.theguild.workers.dev',
106+
preserveSearch: true,
105107
crisp: { segments: ['hive-website'] },
106108
sitemap: false,
107109
},
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/// <reference types="node" />
2+
3+
import { equal } from 'node:assert/strict';
4+
import { test } from 'node:test';
5+
import { buildUpstreamUrl } from './routing';
6+
7+
test('preserveSearch keeps the original query string', () => {
8+
const upstreamUrl = buildUpstreamUrl({
9+
request: new Request(
10+
'https://the-guild.dev/graphql/hive-testing/_serverFn/test?payload=%7B%22foo%22%3A1%7D',
11+
),
12+
record: {
13+
preserveSearch: true,
14+
rewrite: 'hive-platform-docs.theguild.workers.dev',
15+
},
16+
upstreamPath: '/_serverFn/test',
17+
});
18+
19+
equal(
20+
upstreamUrl.toString(),
21+
'https://hive-platform-docs.theguild.workers.dev/_serverFn/test?payload=%7B%22foo%22%3A1%7D',
22+
);
23+
});
24+
25+
test('default rewrite behavior still drops search params', () => {
26+
const upstreamUrl = buildUpstreamUrl({
27+
request: new Request(
28+
'https://the-guild.dev/graphql/hive-testing/_serverFn/test?payload=%7B%22foo%22%3A1%7D',
29+
),
30+
record: {
31+
rewrite: 'hive-platform-docs.theguild.workers.dev',
32+
},
33+
upstreamPath: '/_serverFn/test',
34+
});
35+
36+
equal(upstreamUrl.toString(), 'https://hive-platform-docs.theguild.workers.dev/_serverFn/test');
37+
});

packages/website-router/src/routing.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,20 @@ export function redirect(sentry: Toucan, from: string, url: string, code = 301)
102102

103103
export type ManipulateResponseFn = (record: RewriteRecord, response: Response) => Promise<Response>;
104104

105+
export function buildUpstreamUrl(options: {
106+
request: Request;
107+
record: RewriteRecord;
108+
upstreamPath: string;
109+
}) {
110+
const upstreamUrl = new URL(`https://${options.record.rewrite}${options.upstreamPath || ''}`);
111+
112+
if (options.record.preserveSearch) {
113+
upstreamUrl.search = new URL(options.request.url).search;
114+
}
115+
116+
return upstreamUrl;
117+
}
118+
105119
export async function handleRewrite(options: {
106120
request: Request;
107121
cacheStorageId: number;
@@ -114,7 +128,7 @@ export async function handleRewrite(options: {
114128
match: string | null;
115129
publicDomain: string;
116130
}): Promise<Response> {
117-
const url = `https://${options.record.rewrite}${options.upstreamPath || ''}`;
131+
const url = buildUpstreamUrl(options).toString();
118132
const cacheKey = new Request(url, options.request);
119133
const cache = await caches.open(String(options.cacheStorageId));
120134
let response = await cache.match(cacheKey);

0 commit comments

Comments
 (0)