summaryrefslogtreecommitdiffstats
path: root/netwerk/test/browser/early_hint_main_html.sjs
blob: 8867aa8754ca5d55affa6657b09b230dc75a94e4 (plain)
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
"use strict";

function handleRequest(request, response) {
  Cu.importGlobalProperties(["URLSearchParams"]);

  // write to raw socket
  response.seizePower();

  let qs = new URLSearchParams(request.queryString);
  let imgs = [];
  let new_hint = true;
  let new_header = true;
  for (const [imgUrl, uuid] of qs.entries()) {
    if (new_hint) {
      // we need to write a new header
      new_hint = false;
      response.write("HTTP/1.1 103 Early Hint\r\n");
    }
    if (!imgUrl.length) {
      // next hint in new early hint response when empty string is passed
      new_header = true;
      if (uuid === "new_response") {
        new_hint = true;
        response.write("\r\n");
      } else if (uuid === "non_link_header") {
        response.write("Content-Length: 25\r\n");
      }
      response.write("\r\n");
    } else {
      // either append link in new header or in same header
      if (new_header) {
        new_header = false;
        response.write("Link: ");
      } else {
        response.write(", ");
      }
      // add query string to make request unique this has the drawback that
      // the preloaded image can't accept query strings on it's own / or has
      // to strip the appended "?uuid" from the query string before parsing
      imgs.push(`<img src="${imgUrl}?${uuid}" width="100px">`);
      response.write(`<${imgUrl}?${uuid}>; rel=preload; as=image`);
    }
  }
  if (!new_hint) {
    // add separator to main document
    response.write("\r\n\r\n");
  }

  let body = `<!DOCTYPE html>
<html>
<body>
${imgs.join("\n")}
</body>
</html>`;

  // main document response
  response.write("HTTP/1.1 200 OK\r\n");
  response.write("Content-Type: text/html;charset=utf-8\r\n");
  response.write("Cache-Control: no-cache\r\n");
  response.write(`Content-Length: ${body.length}\r\n`);
  response.write("\r\n");
  response.write(body);
  response.finish();
}