mirror of
https://github.com/oven-sh/bun
synced 2026-02-12 11:59:00 +00:00
* initial test case * fix segfault from JSObjectMakeDeferredPromise * pass exceptions through from FetchHeader.createFromJS * not resolved, but getting close * implement review suggestions * fix exception check, tests * Change how header filtering is accomplished Previously the FetchHeaders implementation relied on converting names and values to IDLByteString to catch non-ASCII data, though not always reliably. This resulted in message-less TypeErrors when headers contained invalid characters. This commit shifts everything to IDLDOMString for the conversion and relies on the actual error checking in FetchHeaders.canWriteHeader, resulting in nicer error messages. To ensure that all headers are written as ASCII/UTF8 rather than UTF16, the copyTo bindings function checks the encoding and converts if necessary. * wrapping up FetchHeader fixes * since utf8 allocates only do so when needed * Update src/bun.js/bindings/bindings.cpp Co-authored-by: Jarred Sumner <jarred@jarredsumner.com> * WebCore__FetchHeaders__has should return on exception path * strip out log calls from test --------- Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
59 lines
1.7 KiB
JavaScript
59 lines
1.7 KiB
JavaScript
import { describe, it, expect, beforeAll, afterAll } from "bun:test";
|
|
const port = 3009;
|
|
const url = `http://localhost:${port}`;
|
|
let server;
|
|
|
|
describe("Headers", async () => {
|
|
// Start up a single server and reuse it between tests
|
|
beforeAll(() => {
|
|
server = Bun.serve({
|
|
fetch(req) {
|
|
const hdr = req.headers.get("x-test");
|
|
return new Response(hdr);
|
|
},
|
|
port: port,
|
|
});
|
|
});
|
|
afterAll(() => {
|
|
server.stop();
|
|
});
|
|
|
|
it("Headers should work", async () => {
|
|
expect(await fetchContent({"x-test": "header 1"})).toBe("header 1");
|
|
});
|
|
|
|
it("Header names must be valid", async () => {
|
|
expect(() => fetch(url, {headers: {"a\tb:c": "foo" }})).toThrow("Invalid header name: 'a\tb:c'");
|
|
expect(() => fetch(url, {headers: {"❤️": "foo" }})).toThrow("Invalid header name: '❤️'");
|
|
});
|
|
|
|
it("Header values must be valid", async () => {
|
|
expect(() => fetch(url, {headers: {"x-test": "\0" }})).toThrow("Header 'x-test' has invalid value: '\0'");
|
|
expect(() => fetch(url, {headers: {"x-test": "❤️" }})).toThrow("Header 'x-test' has invalid value: '❤️'");
|
|
});
|
|
|
|
it("repro 1602", async () => {
|
|
const origString = "😂1234".slice(3);
|
|
|
|
var encoder = new TextEncoder();
|
|
var decoder = new TextDecoder();
|
|
const roundTripString = decoder.decode(encoder.encode(origString));
|
|
|
|
expect(roundTripString).toBe(origString);
|
|
|
|
// This one will pass
|
|
expect(await fetchContent({"x-test": roundTripString})).toBe(roundTripString);
|
|
// This would hang
|
|
expect(await fetchContent({"x-test": origString})).toBe(origString);
|
|
});
|
|
});
|
|
|
|
async function fetchContent(headers) {
|
|
const res = await fetch(
|
|
url,
|
|
{ headers: headers },
|
|
{ verbose: true }
|
|
);
|
|
return await res.text();
|
|
}
|