Skip to content
This repository was archived by the owner on Jan 17, 2025. It is now read-only.

Commit 9261394

Browse files
committed
support referer header
1 parent 6aa11ec commit 9261394

File tree

3 files changed

+62
-32
lines changed

3 files changed

+62
-32
lines changed

src/main.ts

Lines changed: 1 addition & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { asAbsolutePath } from "./as-absolute-path"
55
import type { AssetFile } from "./asset-files"
66
import { collectAssetFiles, serveAsset } from "./asset-files"
77
import "./browser-globals"
8+
import { serveRemixResponse } from "./serve-remix-response"
89

910
const defaultMode = app.isPackaged ? "production" : process.env.NODE_ENV
1011

@@ -96,38 +97,6 @@ async function handleRequest(
9697
)
9798
}
9899

99-
async function serveRemixResponse(
100-
request: Electron.ProtocolRequest,
101-
handleRequest: RequestHandler,
102-
context: unknown,
103-
): Promise<Electron.ProtocolResponse> {
104-
const init: RequestInit = {
105-
method: request.method,
106-
headers: request.headers,
107-
referrer: request.referrer,
108-
}
109-
110-
if (request.uploadData) {
111-
// concat might not be correct but 🤷
112-
init.body = Buffer.concat(request.uploadData.map((data) => data.bytes))
113-
}
114-
115-
const remixRequest = new Request(request.url, init)
116-
const response = await handleRequest(remixRequest, context)
117-
118-
const headers: Record<string, string[]> = {}
119-
for (const [key, value] of response.headers) {
120-
const values = (headers[key] ??= [])
121-
values.push(value)
122-
}
123-
124-
return {
125-
data: Buffer.from(await response.arrayBuffer()),
126-
headers,
127-
statusCode: response.status,
128-
}
129-
}
130-
131100
function purgeRequireCache(prefix: string) {
132101
for (const key in require.cache) {
133102
if (key.startsWith(prefix)) {

src/serve-remix-response.test.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { describe, expect, it } from "vitest"
2+
import "./browser-globals"
3+
import { serveRemixResponse } from "./serve-remix-response"
4+
5+
describe("serveRemixResponse", () => {
6+
it("sets referer", async () => {
7+
const handler = (request: Request) => {
8+
expect(request.headers.get("Referer")).toEqual("http://localhost/def")
9+
10+
// node-fetch 2 doesn't seem to support this property at all,
11+
// so neither will i
12+
// expect(request.referrer).toEqual("http://localhost/def")
13+
14+
return Promise.resolve(new Response())
15+
}
16+
17+
const mockRequest: Electron.ProtocolRequest = {
18+
method: "POST",
19+
url: "http://localhost/abc",
20+
headers: {},
21+
referrer: "http://localhost/def",
22+
}
23+
24+
await serveRemixResponse(mockRequest, handler, {})
25+
})
26+
})

src/serve-remix-response.ts

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import type { RequestHandler } from "@remix-run/server-runtime"
2+
import "./browser-globals"
3+
4+
export async function serveRemixResponse(
5+
request: Electron.ProtocolRequest,
6+
handleRequest: RequestHandler,
7+
context: unknown,
8+
): Promise<Electron.ProtocolResponse> {
9+
const body = request.uploadData
10+
? Buffer.concat(request.uploadData.map((data) => data.bytes))
11+
: undefined
12+
13+
const remixHeaders = new Headers(request.headers)
14+
remixHeaders.append("Referer", request.referrer)
15+
16+
const remixRequest = new Request(request.url, {
17+
method: request.method,
18+
headers: remixHeaders,
19+
body,
20+
})
21+
22+
const response = await handleRequest(remixRequest, context)
23+
24+
const headers: Record<string, string[]> = {}
25+
for (const [key, value] of response.headers) {
26+
const values = (headers[key] ??= [])
27+
values.push(value)
28+
}
29+
30+
return {
31+
data: Buffer.from(await response.arrayBuffer()),
32+
headers,
33+
statusCode: response.status,
34+
}
35+
}

0 commit comments

Comments
 (0)