mirror of
https://github.com/denoland/deno.git
synced 2025-03-03 09:31:22 -05:00
fix(runtime/js/http): Correctly parse user response headers (#10076)
This commit is contained in:
parent
9d53dab4df
commit
a20504642d
2 changed files with 14 additions and 20 deletions
|
@ -13,7 +13,7 @@ unitTest({ perms: { net: true } }, async function httpServerBasic() {
|
|||
const httpConn = Deno.serveHttp(conn);
|
||||
for await (const { request, respondWith } of httpConn) {
|
||||
assertEquals(await request.text(), "");
|
||||
respondWith(new Response("Hello World"));
|
||||
respondWith(new Response("Hello World", { headers: { "foo": "bar" } }));
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -24,6 +24,7 @@ unitTest({ perms: { net: true } }, async function httpServerBasic() {
|
|||
});
|
||||
const text = await resp.text();
|
||||
assertEquals(text, "Hello World");
|
||||
assertEquals(resp.headers.get("foo"), "bar");
|
||||
await promise;
|
||||
});
|
||||
|
||||
|
|
|
@ -9,15 +9,6 @@
|
|||
const core = window.Deno.core;
|
||||
const { ReadableStream } = window.__bootstrap.streams;
|
||||
|
||||
function flatEntries(obj) {
|
||||
const entries = [];
|
||||
for (const key in obj) {
|
||||
entries.push(key);
|
||||
entries.push(obj[key]);
|
||||
}
|
||||
return entries;
|
||||
}
|
||||
|
||||
function serveHttp(conn) {
|
||||
const rid = Deno.core.jsonOpSync("op_http_start", conn.rid);
|
||||
return new HttpConn(rid);
|
||||
|
@ -104,12 +95,14 @@
|
|||
);
|
||||
}
|
||||
|
||||
function respond(responseSenderRid, resp, zeroCopyBuf) {
|
||||
return Deno.core.jsonOpSync("op_http_response", [
|
||||
responseSenderRid,
|
||||
resp.status ?? 200,
|
||||
flatEntries(resp.headers ?? {}),
|
||||
], zeroCopyBuf);
|
||||
/** IMPORTANT: Equivalent to `Array.from(headers).flat()` but more performant.
|
||||
* Please preserve. */
|
||||
function flattenHeaders(headers) {
|
||||
const array = [];
|
||||
for (const pair of headers) {
|
||||
array.push(pair[0], pair[1]);
|
||||
}
|
||||
return array;
|
||||
}
|
||||
|
||||
function createRespondWith(responseSenderRid, connRid) {
|
||||
|
@ -136,11 +129,11 @@
|
|||
zeroCopyBuf = null;
|
||||
}
|
||||
|
||||
const responseBodyRid = respond(
|
||||
const responseBodyRid = Deno.core.jsonOpSync("op_http_response", [
|
||||
responseSenderRid,
|
||||
resp,
|
||||
zeroCopyBuf,
|
||||
);
|
||||
resp.status ?? 200,
|
||||
flattenHeaders(resp.headers),
|
||||
], zeroCopyBuf);
|
||||
|
||||
// If `respond` returns a responseBodyRid, we should stream the body
|
||||
// to that resource.
|
||||
|
|
Loading…
Add table
Reference in a new issue