fune/netwerk/test/unit/test_304_headers.js
Valentin Gosu b870386af7 Bug 1713941 - Properly handle duplicated headers in a 304 revalidation r=necko-reviewers,dragana
Going through each of the headers in the 304 response and setting it on the
cached response head will cause us to only keep the last instance when
duplicate header names are present.

We should instead use the GetHeader method which properly handles merging the
response.

Differential Revision: https://phabricator.services.mozilla.com/D121527
2021-08-04 12:07:37 +00:00

89 lines
2.5 KiB
JavaScript

"use strict";
const { HttpServer } = ChromeUtils.import("resource://testing-common/httpd.js");
XPCOMUtils.defineLazyGetter(this, "URL", function() {
return `http://localhost:${httpServer.identity.primaryPort}/test`;
});
let httpServer = null;
function make_channel(url) {
return NetUtil.newChannel({
uri: url,
loadUsingSystemPrincipal: true,
}).QueryInterface(Ci.nsIHttpChannel);
}
function contentHandler(metadata, response) {
response.seizePower();
let etag = "";
try {
etag = metadata.getHeader("If-None-Match");
} catch (ex) {}
if (etag == "test-etag1") {
response.write("HTTP/1.1 304 Not Modified\r\n");
response.write("Link: <ref>; param1=value1\r\n");
response.write("Link: <ref2>; param2=value2\r\n");
response.write("Link: <ref3>; param1=value1\r\n");
response.write("\r\n");
response.finish();
return;
}
response.write("HTTP/1.1 200 OK\r\n");
response.write("ETag: test-etag1\r\n");
response.write("Link: <ref>; param1=value1\r\n");
response.write("Link: <ref2>; param2=value2\r\n");
response.write("Link: <ref3>; param1=value1\r\n");
response.write("\r\n");
response.finish();
}
add_task(async function test() {
httpServer = new HttpServer();
httpServer.registerPathHandler("/test", contentHandler);
httpServer.start(-1);
registerCleanupFunction(async () => {
await httpServer.stop();
});
let chan = make_channel(Services.io.newURI(URL));
chan.requestMethod = "HEAD";
await new Promise(resolve => {
chan.asyncOpen({
onStopRequest(req, status) {
equal(status, Cr.NS_OK);
equal(req.QueryInterface(Ci.nsIHttpChannel).responseStatus, 200);
equal(
req.QueryInterface(Ci.nsIHttpChannel).getResponseHeader("Link"),
"<ref>; param1=value1, <ref2>; param2=value2, <ref3>; param1=value1"
);
resolve();
},
onStartRequest(req) {},
onDataAvailable() {},
});
});
chan = make_channel(Services.io.newURI(URL));
chan.requestMethod = "HEAD";
await new Promise(resolve => {
chan.asyncOpen({
onStopRequest(req, status) {
equal(status, Cr.NS_OK);
equal(req.QueryInterface(Ci.nsIHttpChannel).responseStatus, 200);
equal(
req.QueryInterface(Ci.nsIHttpChannel).getResponseHeader("Link"),
"<ref>; param1=value1, <ref2>; param2=value2, <ref3>; param1=value1"
);
resolve();
},
onStartRequest(req) {},
onDataAvailable() {},
});
});
});