Bug 1697421 - Make XMLHttpRequest/fetch to support multiple content-length and content-type headers. r=necko-reviewers,valentin
☠☠ backed out by 14186f45ec78 ☠ ☠
authorsunil mayya <smayya@mozilla.com>
Thu, 15 Sep 2022 15:19:12 +0000
changeset 635656 fe6151585dec8c4001c5429505de9c04816b4112
parent 635655 95b4b56ff41b67a7579c2c291f6d46d62a770d5a
child 635657 cda8626f9cccf68470e4728f19bb071b99111cbc
push id169878
push uservalentin.gosu@gmail.com
push dateThu, 15 Sep 2022 15:21:48 +0000
treeherderautoland@65d4f5822383 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersnecko-reviewers, valentin
bugs1697421
milestone106.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1697421 - Make XMLHttpRequest/fetch to support multiple content-length and content-type headers. r=necko-reviewers,valentin Differential Revision: https://phabricator.services.mozilla.com/D154864
dom/fetch/InternalHeaders.cpp
dom/xhr/XMLHttpRequestMainThread.cpp
dom/xhr/XMLHttpRequestMainThread.h
testing/web-platform/meta/fetch/api/basic/header-value-combining.any.js.ini
testing/web-platform/meta/fetch/content-length/api-and-duplicate-headers.any.js.ini
testing/web-platform/meta/service-workers/service-worker/navigation-sets-cookie.https.html.ini
testing/web-platform/meta/service-workers/service-worker/same-site-cookies.https.html.ini
testing/web-platform/meta/service-workers/service-worker/xhr-content-length.https.window.js.ini
testing/web-platform/meta/xhr/getallresponseheaders.htm.ini
testing/web-platform/meta/xhr/getresponseheader.any.js.ini
--- a/dom/fetch/InternalHeaders.cpp
+++ b/dom/fetch/InternalHeaders.cpp
@@ -432,48 +432,89 @@ void InternalHeaders::Fill(const Record<
     if (aRv.Failed()) {
       return;
     }
   }
 }
 
 namespace {
 
-class FillHeaders final : public nsIHttpHeaderVisitor {
+class FillOriginalResponseHeaders final : public nsIHttpHeaderVisitor {
   RefPtr<InternalHeaders> mInternalHeaders;
 
-  ~FillHeaders() = default;
+  ~FillOriginalResponseHeaders() = default;
 
  public:
   NS_DECL_ISUPPORTS
 
-  explicit FillHeaders(InternalHeaders* aInternalHeaders)
+  explicit FillOriginalResponseHeaders(InternalHeaders* aInternalHeaders)
       : mInternalHeaders(aInternalHeaders) {
     MOZ_DIAGNOSTIC_ASSERT(mInternalHeaders);
   }
 
   NS_IMETHOD
   VisitHeader(const nsACString& aHeader, const nsACString& aValue) override {
     mInternalHeaders->Append(aHeader, aValue, IgnoreErrors());
     return NS_OK;
   }
 };
 
-NS_IMPL_ISUPPORTS(FillHeaders, nsIHttpHeaderVisitor)
+NS_IMPL_ISUPPORTS(FillOriginalResponseHeaders, nsIHttpHeaderVisitor)
+
+class FillMissingResponseHeaders final : public nsIHttpHeaderVisitor {
+  RefPtr<InternalHeaders> mInternalHeaders;
+
+  ~FillMissingResponseHeaders() = default;
+
+ public:
+  NS_DECL_ISUPPORTS
 
+  explicit FillMissingResponseHeaders(InternalHeaders* aInternalHeaders)
+      : mInternalHeaders(aInternalHeaders) {
+    MOZ_DIAGNOSTIC_ASSERT(mInternalHeaders);
+  }
+
+  NS_IMETHOD
+  VisitHeader(const nsACString& aHeader, const nsACString& aValue) override {
+    ErrorResult rv;
+
+    if (!mInternalHeaders->Has(aHeader, rv)) {
+      MOZ_ASSERT(!rv.Failed());
+      mInternalHeaders->Append(aHeader, aValue, IgnoreErrors());
+    }
+    return NS_OK;
+  }
+};
+
+NS_IMPL_ISUPPORTS(FillMissingResponseHeaders, nsIHttpHeaderVisitor)
 }  // namespace
 
 void InternalHeaders::FillResponseHeaders(nsIRequest* aRequest) {
   nsCOMPtr<nsIHttpChannel> httpChannel = do_QueryInterface(aRequest);
   if (!httpChannel) {
     return;
   }
 
-  RefPtr<FillHeaders> visitor = new FillHeaders(this);
-  nsresult rv = httpChannel->VisitResponseHeaders(visitor);
+  RefPtr<FillOriginalResponseHeaders> visitor =
+      new FillOriginalResponseHeaders(this);
+  // response headers received from fetch requires extra processing
+  // we need the response headers received in original formats and also include
+  // any headers internally added
+  // nsIHttpChannel does not have any implemenation to give both types of
+  // headers hence, we fetch them seperately and merge them first step is to get
+  // the original response header
+  nsresult rv = httpChannel->VisitOriginalResponseHeaders(visitor);
+  if (NS_FAILED(rv)) {
+    NS_WARNING("failed to fill headers");
+  }
+
+  RefPtr<FillMissingResponseHeaders> visitMissingHeaders =
+      new FillMissingResponseHeaders(this);
+  rv = httpChannel->VisitResponseHeaders(visitMissingHeaders);
+
   if (NS_FAILED(rv)) {
     NS_WARNING("failed to fill headers");
   }
 }
 
 bool InternalHeaders::HasOnlySimpleHeaders() const {
   for (uint32_t i = 0; i < mList.Length(); ++i) {
     if (!IsSimpleHeader(mList[i].mName, mList[i].mValue)) {
--- a/dom/xhr/XMLHttpRequestMainThread.cpp
+++ b/dom/xhr/XMLHttpRequestMainThread.cpp
@@ -1116,17 +1116,18 @@ void XMLHttpRequestMainThread::GetAllRes
 
   if (mErrorLoad != ErrorType::eOK) {
     return;
   }
 
   if (nsCOMPtr<nsIHttpChannel> httpChannel = GetCurrentHttpChannel()) {
     RefPtr<nsHeaderVisitor> visitor =
         new nsHeaderVisitor(*this, WrapNotNull(httpChannel));
-    if (NS_SUCCEEDED(httpChannel->VisitResponseHeaders(visitor))) {
+    if (NS_SUCCEEDED(httpChannel->VisitOriginalResponseHeaders(visitor))) {
+      visitor->MergeDuplicateHeaders();
       aResponseHeaders = visitor->Headers();
     }
     return;
   }
 
   if (!mChannel) {
     return;
   }
@@ -1151,16 +1152,48 @@ void XMLHttpRequestMainThread::GetAllRes
     if (NS_SUCCEEDED(mChannel->GetContentLength(&length))) {
       aResponseHeaders.AppendLiteral("Content-Length: ");
       aResponseHeaders.AppendInt(length);
       aResponseHeaders.AppendLiteral("\r\n");
     }
   }
 }
 
+namespace {
+// used for parsing headers with duplicate entries
+class nsResponseHeaderVisitor final : public nsIHttpHeaderVisitor {
+ public:
+  NS_DECL_ISUPPORTS
+
+  nsResponseHeaderVisitor() = default;
+
+  NS_IMETHOD
+  VisitHeader(const nsACString& aHeader, const nsACString& aValue) override {
+    if (mIsHeaderPresent) {
+      mValue.AppendLiteral(", ");
+    }
+    mValue.Append(aValue);
+    mIsHeaderPresent = true;
+    return NS_OK;
+  }
+
+  void GetValue(nsACString& aValue) { aValue = mValue; }
+
+ private:
+  nsCString mValue;
+
+  // indicates whether a header is already stored during parsing
+  bool mIsHeaderPresent{false};
+
+  virtual ~nsResponseHeaderVisitor() = default;
+};
+
+NS_IMPL_ISUPPORTS(nsResponseHeaderVisitor, nsIHttpHeaderVisitor)
+}  // namespace
+
 void XMLHttpRequestMainThread::GetResponseHeader(const nsACString& header,
                                                  nsACString& _retval,
                                                  ErrorResult& aRv) {
   NOT_CALLABLE_IN_SYNC_SEND_RV
 
   _retval.SetIsVoid(true);
 
   nsCOMPtr<nsIHttpChannel> httpChannel = GetCurrentHttpChannel();
@@ -1211,21 +1244,26 @@ void XMLHttpRequestMainThread::GetRespon
     return;
   }
 
   // Check for dangerous headers
   if (!IsSafeHeader(header, WrapNotNull(httpChannel))) {
     return;
   }
 
-  aRv = httpChannel->GetResponseHeader(header, _retval);
+  RefPtr<nsResponseHeaderVisitor> resposeHeaderVisitor =
+      new nsResponseHeaderVisitor();
+
+  aRv = httpChannel->GetOriginalResponseHeader(header, resposeHeaderVisitor);
   if (aRv.ErrorCodeIs(NS_ERROR_NOT_AVAILABLE)) {
     // Means no header
     _retval.SetIsVoid(true);
     aRv.SuppressException();
+  } else if (!aRv.Failed()) {
+    resposeHeaderVisitor->GetValue(_retval);
   }
 }
 
 already_AddRefed<nsILoadGroup> XMLHttpRequestMainThread::GetLoadGroup() const {
   if (mFlagBackgroundRequest) {
     return nullptr;
   }
 
--- a/dom/xhr/XMLHttpRequestMainThread.h
+++ b/dom/xhr/XMLHttpRequestMainThread.h
@@ -566,28 +566,46 @@ class XMLHttpRequestMainThread final : p
       }
     };
 
    public:
     NS_DECL_ISUPPORTS
     NS_DECL_NSIHTTPHEADERVISITOR
     nsHeaderVisitor(const XMLHttpRequestMainThread& aXMLHttpRequest,
                     NotNull<nsIHttpChannel*> aHttpChannel);
-    const nsACString& Headers() {
-      for (uint32_t i = 0; i < mHeaderList.Length(); i++) {
+
+    void MergeDuplicateHeaders() {
+      if (mHeaderList.IsEmpty()) {
+        return;
+      }
+
+      mHeaders.Append(mHeaderList.ElementAt(0).mName);
+      mHeaders.AppendLiteral(": ");
+      mHeaders.Append(mHeaderList.ElementAt(0).mValue);
+
+      for (uint32_t i = 1; i < mHeaderList.Length(); i++) {
         HeaderEntry& header = mHeaderList.ElementAt(i);
+        HeaderEntry& prevHeader = mHeaderList.ElementAt(i - 1);
 
-        mHeaders.Append(header.mName);
-        mHeaders.AppendLiteral(": ");
-        mHeaders.Append(header.mValue);
-        mHeaders.AppendLiteral("\r\n");
+        if (header.mName != prevHeader.mName) {
+          mHeaders.AppendLiteral("\r\n");
+          mHeaders.Append(header.mName);
+          mHeaders.AppendLiteral(": ");
+          mHeaders.Append(header.mValue);
+        } else {
+          mHeaders.AppendLiteral(", ");
+          mHeaders.Append(header.mValue);
+        }
       }
-      return mHeaders;
+
+      mHeaders.AppendLiteral("\r\n");
     }
 
+    const nsACString& Headers() { return mHeaders; }
+
    private:
     virtual ~nsHeaderVisitor();
 
     nsTArray<HeaderEntry> mHeaderList;
     nsCString mHeaders;
     const XMLHttpRequestMainThread& mXHR;
     NotNull<nsCOMPtr<nsIHttpChannel>> mHttpChannel;
   };
deleted file mode 100644
--- a/testing/web-platform/meta/fetch/api/basic/header-value-combining.any.js.ini
+++ /dev/null
@@ -1,55 +0,0 @@
-[header-value-combining.any.html]
-  [response.headers.get('heya') expects , \x0b\x0c, 1, , , 2]
-    expected: FAIL
-
-  [response.headers.get('double-trouble') expects , ]
-    expected: FAIL
-
-  [response.headers.get('www-authenticate') expects 1, 2, 3, 4]
-    expected: FAIL
-
-  [response.headers.get('content-length') expects 0, 0]
-    expected: FAIL
-
-
-[header-value-combining.any.worker.html]
-  [response.headers.get('heya') expects , \x0b\x0c, 1, , , 2]
-    expected: FAIL
-
-  [response.headers.get('double-trouble') expects , ]
-    expected: FAIL
-
-  [response.headers.get('www-authenticate') expects 1, 2, 3, 4]
-    expected: FAIL
-
-  [response.headers.get('content-length') expects 0, 0]
-    expected: FAIL
-
-
-[header-value-combining.any.serviceworker.html]
-  [response.headers.get('heya') expects , \x0b\x0c, 1, , , 2]
-    expected: FAIL
-
-  [response.headers.get('double-trouble') expects , ]
-    expected: FAIL
-
-  [response.headers.get('www-authenticate') expects 1, 2, 3, 4]
-    expected: FAIL
-
-  [response.headers.get('content-length') expects 0, 0]
-    expected: FAIL
-
-
-[header-value-combining.any.sharedworker.html]
-  [response.headers.get('heya') expects , \x0b\x0c, 1, , , 2]
-    expected: FAIL
-
-  [response.headers.get('double-trouble') expects , ]
-    expected: FAIL
-
-  [response.headers.get('www-authenticate') expects 1, 2, 3, 4]
-    expected: FAIL
-
-  [response.headers.get('content-length') expects 0, 0]
-    expected: FAIL
-
deleted file mode 100644
--- a/testing/web-platform/meta/fetch/content-length/api-and-duplicate-headers.any.js.ini
+++ /dev/null
@@ -1,15 +0,0 @@
-[api-and-duplicate-headers.any.worker.html]
-  [fetch() and duplicate Content-Length/Content-Type headers]
-    expected: FAIL
-
-  [XMLHttpRequest and duplicate Content-Length/Content-Type headers]
-    expected: FAIL
-
-
-[api-and-duplicate-headers.any.html]
-  [fetch() and duplicate Content-Length/Content-Type headers]
-    expected: FAIL
-
-  [XMLHttpRequest and duplicate Content-Length/Content-Type headers]
-    expected: FAIL
-
deleted file mode 100644
--- a/testing/web-platform/meta/service-workers/service-worker/navigation-sets-cookie.https.html.ini
+++ /dev/null
@@ -1,56 +0,0 @@
-[navigation-sets-cookie.https.html]
-  expected: TIMEOUT
-  [Same-site top-level navigation with passthrough service worker should be able to set SameSite=* cookies.]
-    expected:
-      if (os == "linux") and fission and not debug and (processor == "x86_64"): [TIMEOUT, NOTRUN]
-      TIMEOUT
-
-  [Cross-site top-level navigation with passthrough service worker should be able to set SameSite=* cookies.]
-    expected: NOTRUN
-
-  [Same-site top-level POST with passthrough service worker should be able to set SameSite=* cookies.]
-    expected: NOTRUN
-
-  [Cross-site top-level with passthrough service worker POST should be able to set SameSite=* cookies.]
-    expected: NOTRUN
-
-  [Same-site top-level navigation with navpreload service worker should be able to set SameSite=* cookies.]
-    expected: NOTRUN
-
-  [Cross-site top-level navigation with navpreload service worker should be able to set SameSite=* cookies.]
-    expected: NOTRUN
-
-  [Same-site top-level navigation with change-request service worker should be able to set SameSite=* cookies.]
-    expected: NOTRUN
-
-  [Cross-site top-level navigation with change-request service worker should be able to set SameSite=* cookies.]
-    expected: NOTRUN
-
-  [Same-site top-level POST with change-request service worker should be able to set SameSite=* cookies.]
-    expected: NOTRUN
-
-  [Cross-site top-level with change-request service worker POST should be able to set SameSite=* cookies.]
-    expected: NOTRUN
-
-  [Cleanup service workers]
-    expected: NOTRUN
-
-  [Cross-site top-level navigation with fallback service worker should be able to set SameSite=* cookies.]
-    expected:
-      if (os == "linux") and fission and not debug and (processor == "x86_64"): [PASS, NOTRUN]
-
-  [Cross-site top-level with fallback service worker POST should be able to set SameSite=* cookies.]
-    expected:
-      if (os == "linux") and fission and not debug and (processor == "x86_64"): [PASS, NOTRUN]
-
-  [Same-site top-level POST with fallback service worker should be able to set SameSite=* cookies.]
-    expected:
-      if (os == "linux") and fission and not debug and (processor == "x86_64"): [PASS, NOTRUN]
-
-  [Same-site top-level navigation with fallback service worker should be able to set SameSite=* cookies.]
-    expected:
-      if (os == "linux") and fission and not debug and (processor == "x86_64"): [PASS, NOTRUN]
-
-  [Setup service workers]
-    expected:
-      if (os == "linux") and fission and not debug and (processor == "x86_64"): [PASS, TIMEOUT]
--- a/testing/web-platform/meta/service-workers/service-worker/same-site-cookies.https.html.ini
+++ b/testing/web-platform/meta/service-workers/service-worker/same-site-cookies.https.html.ini
@@ -1,193 +1,54 @@
 [same-site-cookies.https.html]
-  expected:
-    if (os == "linux") and fission and not debug: [TIMEOUT, CRASH]
-    if (os == "linux") and not fission and not debug: [TIMEOUT, CRASH]
-    TIMEOUT
-  [same-origin, window.open with passthrough]
-    expected: TIMEOUT
-
-  [same-origin, window.open with change-request]
-    expected: NOTRUN
-
-  [same-origin, window.open with navpreload]
-    expected: NOTRUN
-
-  [same-site, window.open with no service worker]
-    expected: NOTRUN
-
-  [same-site, window.open with fallback]
-    expected: NOTRUN
-
-  [same-site, window.open with passthrough]
-    expected: NOTRUN
-
-  [same-site, window.open with change-request]
-    expected: NOTRUN
-
-  [same-site, window.open with navpreload]
-    expected: NOTRUN
-
-  [cross-site, window.open with no service worker]
-    expected: NOTRUN
-
-  [cross-site, window.open with fallback]
-    expected: NOTRUN
-
   [cross-site, window.open with passthrough]
-    expected: NOTRUN
-
-  [cross-site, window.open with change-request]
-    expected: NOTRUN
+    expected: FAIL
 
   [cross-site, window.open with navpreload]
-    expected: NOTRUN
-
-  [same-origin, form post with no service worker]
-    expected: NOTRUN
-
-  [same-origin, form post with fallback]
-    expected: NOTRUN
-
-  [same-origin, form post with passthrough]
-    expected: NOTRUN
-
-  [same-origin, form post with change-request]
-    expected: NOTRUN
-
-  [same-site, form post with no service worker]
-    expected: NOTRUN
-
-  [same-site, form post with fallback]
-    expected: NOTRUN
-
-  [same-site, form post with passthrough]
-    expected: NOTRUN
-
-  [same-site, form post with change-request]
-    expected: NOTRUN
+    expected: FAIL
 
   [cross-site, form post with no service worker]
-    expected: NOTRUN
+    expected: FAIL
 
   [cross-site, form post with fallback]
-    expected: NOTRUN
+    expected: FAIL
 
   [cross-site, form post with passthrough]
-    expected: NOTRUN
-
-  [cross-site, form post with change-request]
-    expected: NOTRUN
-
-  [Cleanup service workers]
-    expected: NOTRUN
-
-  [same-origin, window.open with no service worker and same-site redirect]
-    expected: NOTRUN
-
-  [same-origin, window.open with fallback and same-site redirect]
-    expected: NOTRUN
-
-  [same-origin, window.open with passthrough and same-site redirect]
-    expected: NOTRUN
-
-  [same-origin, window.open with change-request and same-site redirect]
-    expected: NOTRUN
-
-  [same-origin, window.open with navpreload and same-site redirect]
-    expected: NOTRUN
-
-  [same-origin, window.open with no service worker and cross-site redirect]
-    expected: NOTRUN
-
-  [same-origin, window.open with fallback and cross-site redirect]
-    expected: NOTRUN
+    expected: FAIL
 
   [same-origin, window.open with passthrough and cross-site redirect]
-    expected: NOTRUN
-
-  [same-origin, window.open with change-request and cross-site redirect]
-    expected: NOTRUN
+    expected: FAIL
 
   [same-origin, window.open with navpreload and cross-site redirect]
-    expected: NOTRUN
-
-  [same-origin, window.open with no service worker, cross-site redirect, and same-origin redirect]
-    expected: NOTRUN
-
-  [same-origin, window.open with fallback, cross-site redirect, and same-origin redirect]
-    expected: NOTRUN
+    expected: FAIL
 
   [same-origin, window.open with passthrough, cross-site redirect, and same-origin redirect]
-    expected: NOTRUN
-
-  [same-origin, window.open with change-request, cross-site redirect, and same-origin redirect]
-    expected: NOTRUN
+    expected: FAIL
 
   [same-origin, window.open with navpreload, cross-site redirect, and same-origin redirect]
-    expected: NOTRUN
-
-  [same-origin, form post with no service worker and same-site redirect]
-    expected: NOTRUN
-
-  [same-origin, form post with fallback and same-site redirect]
-    expected: NOTRUN
-
-  [same-origin, form post with passthrough and same-site redirect]
-    expected: NOTRUN
-
-  [same-origin, form post with change-request and same-site redirect]
-    expected: NOTRUN
+    expected: FAIL
 
   [same-origin, form post with no service worker and cross-site redirect]
-    expected: NOTRUN
+    expected: FAIL
 
   [same-origin, form post with fallback and cross-site redirect]
-    expected: NOTRUN
+    expected: FAIL
 
   [same-origin, form post with passthrough and cross-site redirect]
-    expected: NOTRUN
-
-  [same-origin, form post with change-request and cross-site redirect]
-    expected: NOTRUN
+    expected: FAIL
 
   [same-origin, form post with no service worker, cross-site redirect, and same-origin redirect]
-    expected: NOTRUN
+    expected: FAIL
 
   [same-origin, form post with fallback, cross-site redirect, and same-origin redirect]
-    expected: NOTRUN
+    expected: FAIL
 
   [same-origin, form post with passthrough, cross-site redirect, and same-origin redirect]
-    expected: NOTRUN
-
-  [same-origin, form post with change-request, cross-site redirect, and same-origin redirect]
-    expected: NOTRUN
-
-  [same-origin, nested window.open with cross-site middle frame and no service worker]
-    expected: NOTRUN
-
-  [same-origin, nested window.open with cross-site middle frame and fallback service worker]
-    expected: NOTRUN
-
-  [same-origin, nested window.open with cross-site middle frame and passthrough service worker]
-    expected: NOTRUN
-
-  [same-origin, nested window.open with cross-site middle frame and change-request service worker]
-    expected: NOTRUN
-
-  [same-origin, nested window.open with cross-site middle frame and navpreload service worker]
-    expected: NOTRUN
-
-  [same-origin, nested set location with cross-site middle frame and no service worker]
-    expected: NOTRUN
-
-  [same-origin, nested set location with cross-site middle frame and fallback service worker]
-    expected: NOTRUN
+    expected: FAIL
 
   [same-origin, nested set location with cross-site middle frame and passthrough service worker]
-    expected: NOTRUN
+    expected: FAIL
 
   [same-origin, nested set location with cross-site middle frame and change-request service worker]
-    expected: NOTRUN
+    expected: FAIL
 
   [same-origin, nested set location with cross-site middle frame and navpreload service worker]
-    expected: NOTRUN
+    expected: FAIL
deleted file mode 100644
--- a/testing/web-platform/meta/service-workers/service-worker/xhr-content-length.https.window.js.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[xhr-content-length.https.window.html]
-  expected:
-    if (os == "android") and debug and not swgl: [OK, ERROR]
-  [Synthetic response with two Content-Length headers value larger than response body length]
-    expected: FAIL
deleted file mode 100644
--- a/testing/web-platform/meta/xhr/getallresponseheaders.htm.ini
+++ /dev/null
@@ -1,13 +0,0 @@
-[getallresponseheaders.htm]
-  [XMLHttpRequest: getAllResponseHeaders() 5]
-    expected: FAIL
-
-  [XMLHttpRequest: getAllResponseHeaders() 2]
-    expected: FAIL
-
-  [XMLHttpRequest: getAllResponseHeaders() 6]
-    expected: FAIL
-
-  [XMLHttpRequest: getAllResponseHeaders() 3]
-    expected: FAIL
-
deleted file mode 100644
--- a/testing/web-platform/meta/xhr/getresponseheader.any.js.ini
+++ /dev/null
@@ -1,27 +0,0 @@
-[getresponseheader.any.worker.html]
-  [getResponseHeader('heya') expects , \x0b\x0c, 1, , , 2]
-    expected: FAIL
-
-  [getResponseHeader('double-trouble') expects , ]
-    expected: FAIL
-
-  [getResponseHeader('content-length') expects 0, 0]
-    expected: FAIL
-
-  [getResponseHeader('www-authenticate') expects 1, 2, 3, 4]
-    expected: FAIL
-
-
-[getresponseheader.any.html]
-  [getResponseHeader('heya') expects , \x0b\x0c, 1, , , 2]
-    expected: FAIL
-
-  [getResponseHeader('double-trouble') expects , ]
-    expected: FAIL
-
-  [getResponseHeader('content-length') expects 0, 0]
-    expected: FAIL
-
-  [getResponseHeader('www-authenticate') expects 1, 2, 3, 4]
-    expected: FAIL
-