Skip to content

Commit 9cf8b9b

Browse files
committed
fix: overhaul headers proxy
1 parent 5568611 commit 9cf8b9b

1 file changed

Lines changed: 55 additions & 89 deletions

File tree

Lines changed: 55 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -1,112 +1,78 @@
11
import {
2-
H3Event,
3-
appendResponseHeader,
4-
getRequestIP,
5-
getResponseHeader,
6-
getResponseHeaders,
7-
getResponseStatus,
8-
getResponseStatusText,
9-
getWebRequest,
10-
removeResponseHeader,
11-
setResponseHeader,
12-
setResponseStatus
2+
H3Event,
3+
appendResponseHeader,
4+
getRequestIP,
5+
getResponseStatus,
6+
getResponseStatusText,
7+
getWebRequest,
8+
setResponseHeader,
9+
setResponseStatus
1310
} from "vinxi/http";
1411
import type { FetchEvent, ResponseStub } from "./types";
1512

1613
const fetchEventContext = "solidFetchEvent";
1714

1815
export function createFetchEvent(event: H3Event): FetchEvent {
19-
return {
20-
request: getWebRequest(event),
21-
response: createResponseStub(event),
22-
clientAddress: getRequestIP(event),
23-
locals: {},
24-
nativeEvent: event
25-
};
16+
return {
17+
request: getWebRequest(event),
18+
response: createResponseStub(event),
19+
clientAddress: getRequestIP(event),
20+
locals: {},
21+
nativeEvent: event
22+
};
2623
}
2724

2825
export function cloneEvent<T extends FetchEvent>(fetchEvent: T): T {
29-
return {
30-
...fetchEvent
31-
};
26+
return {
27+
...fetchEvent
28+
};
3229
}
3330

3431
export function getFetchEvent(h3Event: H3Event): FetchEvent {
35-
if (!h3Event.context[fetchEventContext]) {
36-
const fetchEvent = createFetchEvent(h3Event);
37-
h3Event.context[fetchEventContext] = fetchEvent;
38-
}
32+
if (!h3Event.context[fetchEventContext]) {
33+
const fetchEvent = createFetchEvent(h3Event);
34+
h3Event.context[fetchEventContext] = fetchEvent;
35+
}
3936

40-
return h3Event.context[fetchEventContext];
37+
return h3Event.context[fetchEventContext];
4138
}
4239

4340
export function mergeResponseHeaders(h3Event: H3Event, headers: Headers) {
44-
for (const [key, value] of headers.entries()) {
45-
appendResponseHeader(h3Event, key, value);
46-
}
41+
for (const [key, value] of headers.entries()) {
42+
appendResponseHeader(h3Event, key, value);
43+
}
4744
}
45+
function createHeadersProxy(event: H3Event) {
46+
const headers = new Headers();
4847

49-
class HeaderProxy {
50-
constructor(private event: H3Event) {}
51-
get(key: string) {
52-
const h = getResponseHeader(this.event, key);
53-
return Array.isArray(h) ? h.join(", ") : (h as string) || null;
54-
}
55-
has(key: string) {
56-
return this.get(key) !== undefined;
57-
}
58-
set(key: string, value: string) {
59-
return setResponseHeader(this.event, key, value);
60-
}
61-
delete(key: string) {
62-
return removeResponseHeader(this.event, key);
63-
}
64-
append(key: string, value: string) {
65-
appendResponseHeader(this.event, key, value);
66-
}
67-
getSetCookie() {
68-
const cookies = getResponseHeader(this.event, "Set-Cookie");
69-
return Array.isArray(cookies) ? cookies : [cookies as string];
70-
}
71-
forEach(fn: (value: string, key: string, object: Headers) => void) {
72-
return Object.entries(getResponseHeaders(this.event)).forEach(([key, value]) =>
73-
fn(Array.isArray(value) ? value.join(", ") : (value as string), key, this)
74-
);
75-
}
76-
entries() {
77-
return Object.entries(getResponseHeaders(this.event))
78-
.map(
79-
([key, value]) => [key, Array.isArray(value) ? value.join(", ") : value] as [string, string]
80-
)
81-
[Symbol.iterator]();
82-
}
83-
keys() {
84-
return Object.keys(getResponseHeaders(this.event))[Symbol.iterator]();
85-
}
86-
values() {
87-
return Object.values(getResponseHeaders(this.event))
88-
.map(value => (Array.isArray(value) ? value.join(", ") : (value as string)))
89-
[Symbol.iterator]();
90-
}
91-
[Symbol.iterator]() {
92-
return this.entries()[Symbol.iterator]();
93-
}
48+
const origSet = headers.set.bind(headers);
49+
headers.set = (name, value) => {
50+
origSet(name, value);
51+
setResponseHeader(event, name, value);
52+
};
53+
const origAppend = headers.append.bind(headers);
54+
headers.append = (name, value) => {
55+
origAppend(name, value);
56+
appendResponseHeader(event, name, value);
57+
};
58+
59+
return headers;
9460
}
9561

9662
function createResponseStub(event: H3Event): ResponseStub {
97-
return {
98-
get status() {
99-
return getResponseStatus(event);
100-
},
101-
set status(v) {
102-
setResponseStatus(event, v);
103-
},
104-
get statusText() {
105-
return getResponseStatusText(event);
106-
},
107-
set statusText(v) {
108-
setResponseStatus(event, getResponseStatus(event), v);
109-
},
110-
headers: new HeaderProxy(event)
111-
};
63+
return {
64+
get status() {
65+
return getResponseStatus(event);
66+
},
67+
set status(v) {
68+
setResponseStatus(event, v);
69+
},
70+
get statusText() {
71+
return getResponseStatusText(event);
72+
},
73+
set statusText(v) {
74+
setResponseStatus(event, getResponseStatus(event), v);
75+
},
76+
headers: createHeadersProxy(event)
77+
};
11278
}

0 commit comments

Comments
 (0)