aboutsummaryrefslogtreecommitdiff
path: root/test/js/web/fetch/fetch_headers.test.js
blob: cd2786c0899de0c08db9731166605aeb1ef0cb9c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
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);
  });

  describe("toJSON()", () => {
    it("should provide lowercase header names", () => {
      const headers1 = new Headers({ "X-Test": "yep", "Content-Type": "application/json" });
      expect(headers1.toJSON()).toEqual({ "x-test": "yep", "content-type": "application/json" });

      const headers2 = new Headers();
      headers2.append("X-Test", "yep");
      headers2.append("Content-Type", "application/json");
      expect(headers2.toJSON()).toEqual({ "x-test": "yep", "content-type": "application/json" });
    });
  });
});

async function fetchContent(headers) {
  const res = await fetch(url, { headers: headers }, { verbose: true });
  return await res.text();
}