| <!DOCTYPE html> | 
 | <meta charset=utf-8> | 
 | <title>Whitespace and null in header values</title> | 
 | <script src=/resources/testharness.js></script> | 
 | <script src=/resources/testharnessreport.js></script> | 
 | <div id=log></div> | 
 | <script> | 
 | function error(val) { | 
 |   test(() => { | 
 |     const client = new XMLHttpRequest(); | 
 |     client.open("GET", "resources/parse-headers.py?my-custom-header="+encodeURIComponent(val), false); | 
 |     assert_throws_dom("NetworkError", () => client.send()); | 
 |   }, "Header value: " + val.replace("\0", "\\0")); | 
 | } | 
 |  | 
 | function matchHeaderValue(val) { | 
 |     test(function () { | 
 |         var client = new XMLHttpRequest(); | 
 |         var trimmed = val.trim(); | 
 |         client.open("GET", "resources/parse-headers.py?my-custom-header="+encodeURIComponent(val), false); | 
 |         client.send(); | 
 |         var r = client.getResponseHeader("My-Custom-Header"); | 
 |  | 
 |         assert_equals(r, trimmed); | 
 |     }, "Header value: " + val.replace(/\t/g, "[tab]").replace(/ /g, "_")); | 
 | } | 
 |  | 
 | error("hello world\0"); | 
 | error("\0hello world"); | 
 | error("hello\0world"); | 
 | matchHeaderValue("  hello world"); | 
 | matchHeaderValue("hello world  "); | 
 | matchHeaderValue("  hello world  "); | 
 | matchHeaderValue("\thello world"); | 
 | matchHeaderValue("hello world\t"); | 
 | matchHeaderValue("\thello world\t"); | 
 | matchHeaderValue("hello      world"); | 
 | matchHeaderValue("hello\tworld"); | 
 | error("\0"); | 
 | matchHeaderValue("   "); | 
 | matchHeaderValue("\t"); | 
 | matchHeaderValue(""); | 
 | </script> |