fix(runtime/js/http): Correctly parse user response headers (#10076)

This commit is contained in:
Nayeem Rahman 2021-04-12 15:24:45 +01:00 committed by GitHub
parent 9d53dab4df
commit a20504642d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 14 additions and 20 deletions

View file

@ -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;
});

View file

@ -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.