<!doctype html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Request Headers</title>
    <meta name="help" href="https://fetch.spec.whatwg.org/#request">
    <meta name="author" title="Canon Research France" href="https://www.crf.canon.fr">
    <script src="/resources/testharness.js"></script>
    <script src="/resources/testharnessreport.js"></script>
  </head>
  <body>
    <script>
      var validRequestHeaders = [
        ["Content-Type", "OK"],
        ["Potato", "OK"],
        ["proxy", "OK"],
        ["proxya", "OK"],
        ["sec", "OK"],
        ["secb", "OK"],
      ];
      var invalidRequestHeaders = [
        ["Accept-Charset", "KO"],
        ["accept-charset", "KO"],
        ["ACCEPT-ENCODING", "KO"],
        ["Accept-Encoding", "KO"],
        ["Access-Control-Request-Headers", "KO"],
        ["Access-Control-Request-Method", "KO"],
        ["Connection", "KO"],
        ["Content-Length", "KO"],
        ["Cookie", "KO"],
        ["Cookie2", "KO"],
        ["Date", "KO"],
        ["DNT", "KO"],
        ["Expect", "KO"],
        ["Host", "KO"],
        ["Keep-Alive", "KO"],
        ["Origin", "KO"],
        ["Referer", "KO"],
        ["TE", "KO"],
        ["Trailer", "KO"],
        ["Transfer-Encoding", "KO"],
        ["Upgrade", "KO"],
        ["Via", "KO"],
        ["Proxy-", "KO"],
        ["proxy-a", "KO"],
        ["Sec-", "KO"],
        ["sec-b", "KO"],
      ];

      var validRequestNoCorsHeaders = [
        ["Accept", "OK"],
        ["Accept-Language", "OK"],
        ["content-language", "OK"],
        ["content-type", "application/x-www-form-urlencoded"],
        ["content-type", "application/x-www-form-urlencoded;charset=UTF-8"],
        ["content-type", "multipart/form-data"],
        ["content-type", "multipart/form-data;charset=UTF-8"],
        ["content-TYPE", "text/plain"],
        ["CONTENT-type", "text/plain;charset=UTF-8"],
      ];
      var invalidRequestNoCorsHeaders = [
        ["Content-Type", "KO"],
        ["Potato", "KO"],
        ["proxy", "KO"],
        ["proxya", "KO"],
        ["sec", "KO"],
        ["secb", "KO"],
      ];

      validRequestHeaders.forEach(function(header) {
        test(function() {
          var request = new Request("");
          request.headers.set(header[0], header[1]);
          assert_equals(request.headers.get(header[0]), header[1]);
        }, "Adding valid request header \"" + header[0] + ": " + header[1] + "\"");
      });
      invalidRequestHeaders.forEach(function(header) {
        test(function() {
          var request = new Request("");
          request.headers.set(header[0], header[1]);
          assert_equals(request.headers.get(header[0]), null);
        }, "Adding invalid request header \"" + header[0] + ": " + header[1] + "\"");
      });

      validRequestNoCorsHeaders.forEach(function(header) {
        test(function() {
          var requestNoCors = new Request("", {"mode": "no-cors"});
          requestNoCors.headers.set(header[0], header[1]);
          assert_equals(requestNoCors.headers.get(header[0]), header[1]);
        }, "Adding valid no-cors request header \"" + header[0] + ": " + header[1] + "\"");
      });
      invalidRequestNoCorsHeaders.forEach(function(header) {
        test(function() {
          var requestNoCors = new Request("", {"mode": "no-cors"});
          requestNoCors.headers.set(header[0], header[1]);
          assert_equals(requestNoCors.headers.get(header[0]), null);
        }, "Adding invalid no-cors request header \"" + header[0] + ": " + header[1] + "\"");
      });

      test(function() {
        var headers = new Headers([["Cookie2", "potato"]]);
        var request = new Request("", {"headers": headers});
        assert_equals(request.headers.get("Cookie2"), null);
      }, "Check that request constructor is filtering headers provided as init parameter");

      test(function() {
        var headers = new Headers([["Content-Type", "potato"]]);
        var request = new Request("", {"headers": headers, "mode": "no-cors"});
        assert_equals(request.headers.get("Content-Type"), null);
      }, "Check that no-cors request constructor is filtering headers provided as init parameter");

      test(function() {
        var headers = new Headers([["Content-Type", "potato"]]);
        var initialRequest = new Request("", {"headers": headers});
        var request = new Request(initialRequest, {"mode": "no-cors"});
        assert_equals(request.headers.get("Content-Type"), null);
      }, "Check that no-cors request constructor is filtering headers provided as part of request parameter");

      test(function() {
        var initialHeaders = new Headers([["Content-Type", "potato"]]);
        var initialRequest = new Request("", {"headers" : initialHeaders});
        var request = new Request(initialRequest);
        assert_equals(request.headers.get("Content-Type"), "potato");
      }, "Request should get its content-type from the init request");

      test(function() {
        var initialHeaders = new Headers([["Content-Type", "potato"]]);
        var initialRequest = new Request("", {"headers" : initialHeaders});
        var headers = new Headers([]);
        var request = new Request(initialRequest, {"headers" : headers});
        assert_false(request.headers.has("Content-Type"));
      }, "Request should not get its content-type from the init request if init headers are provided");

      test(function() {
        var initialHeaders = new Headers([["Content-Type-Extra", "potato"]]);
        var initialRequest = new Request("", {"headers" : initialHeaders, "body" : "this is my plate", "method" : "POST"});
        var request = new Request(initialRequest);
        assert_equals(request.headers.get("Content-Type"), "text/plain;charset=UTF-8");
      }, "Request should get its content-type from the body if none is provided");

      test(function() {
        var initialHeaders = new Headers([["Content-Type", "potato"]]);
        var initialRequest = new Request("", {"headers" : initialHeaders, "body" : "this is my plate", "method" : "POST"});
        var request = new Request(initialRequest);
        assert_equals(request.headers.get("Content-Type"), "potato");
      }, "Request should get its content-type from init headers if one is provided");

      test(function() {
        var array = [["hello", "worldAHH"]];
        var object = {"hello": 'worldOOH'};
        var headers = new Headers(array);

        assert_equals(headers.get("hello"), "worldAHH");

        var request1 = new Request("", {"headers": headers});
        var request2 = new Request("", {"headers": array});
        var request3 = new Request("", {"headers": object});

        assert_equals(request1.headers.get("hello"), "worldAHH");
        assert_equals(request2.headers.get("hello"), "worldAHH");
        assert_equals(request3.headers.get("hello"), "worldOOH");
      }, "Testing request header creations with various objects");

      promise_test(function(test) {
        var request = new Request("", {"headers" : [["Content-Type", ""]], "body" : "this is my plate", "method" : "POST"});
        return request.blob().then(function(blob) {
          assert_equals(blob.type, "", "Blob type should be the empty string");
        });
      }, "Testing empty Request Content-Type header");

      test(function() {
        const request1 = new Request("");
        assert_equals(request1.headers, request1.headers);

        const request2 = new Request("", {"headers": {"X-Foo": "bar"}});
        assert_equals(request2.headers, request2.headers);
        const headers = request2.headers;
        request2.headers.set("X-Foo", "quux");
        assert_equals(headers, request2.headers);
        headers.set("X-Other-Header", "baz");
        assert_equals(headers, request2.headers);
      }, "Test that Request.headers has the [SameObject] extended attribute");

    </script>
  </body>
</html>
