// META: global=window,worker
// META: title=Request Headers

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");
