<!doctype html>
<meta charset=utf8>
<meta name=timeout content=long>
<title>Header value test</title>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<div id=log></div>
<script>
// Invalid values
[0, 0x0A, 0x0D].forEach(val => {
  val = "x" + String.fromCharCode(val) + "x"
  test(() => {
    let xhr = new XMLHttpRequest()
    xhr.open("POST", "/")
    assert_throws("SyntaxError", () => xhr.setRequestHeader("value-test", val))
  }, "XMLHttpRequest with value " + encodeURI(val) + " needs to throw")

  promise_test(t => promise_rejects(t, new TypeError(), fetch("/", { headers: {"value-test": val} })), "fetch() with value " + encodeURI(val) + " needs to throw")
})

// Valid values
let headerValues =[]
for(let i = 0; i < 0x100; i++) {
  if(i === 0 || i === 0x0A || i === 0x0D) {
    continue
  }
  headerValues.push("x" + String.fromCharCode(i) + "x")
}
var url = "../resources/inspect-headers.py?headers="
headerValues.forEach((_, i) => {
  url += "val" + i + "|"
})

async_test((t) => {
  let xhr = new XMLHttpRequest()
  xhr.open("POST", url)
  headerValues.forEach((val, i) => {
    xhr.setRequestHeader("val" + i, val)
  })
  xhr.onload = t.step_func_done(() => {
    headerValues.forEach((val, i) => {
      assert_equals(xhr.getResponseHeader("x-request-val" + i), val)
    })
  })
  xhr.send()
}, "XMLHttpRequest with all valid values")

promise_test((t) => {
  const headers = new Headers
  headerValues.forEach((val, i) => {
    headers.append("val" + i, val)
  })
  return fetch(url, { headers }).then((res) => {
    headerValues.forEach((val, i) => {
      assert_equals(res.headers.get("x-request-val" + i), val)
    })
  })
}, "fetch() with all valid values")
</script>
