"use strict";
const { HttpServer } = ChromeUtils.importESModule(
"resource://testing-common/httpd.sys.mjs"
);
const VALUE_HDR_NAME =
"X-HTTP-VALUE-HEADER";
const VARY_HDR_NAME =
"X-HTTP-VARY-HEADER";
const CACHECTRL_HDR_NAME =
"X-CACHE-CONTROL-HEADER";
var httpserver =
null;
function make_channel() {
var chan = NetUtil.newChannel({
uri:
"http://localhost:" + httpserver.identity.primaryPort + "/bug633743",
loadUsingSystemPrincipal:
true,
}).QueryInterface(Ci.nsIHttpChannel);
return chan.QueryInterface(Ci.nsIHttpChannel);
}
function Test(flags, varyHdr, sendValue, expectValue, cacheHdr) {
this._flags = flags;
this._varyHdr = varyHdr;
this._sendVal = sendValue;
this._expectVal = expectValue;
this._cacheHdr = cacheHdr;
}
Test.prototype = {
_buffer:
"",
_flags:
null,
_varyHdr:
null,
_sendVal:
null,
_expectVal:
null,
_cacheHdr:
null,
QueryInterface: ChromeUtils.generateQI([
"nsIStreamListener",
"nsIRequestObserver",
]),
onStartRequest() {},
onDataAvailable(request, stream, offset, count) {
this._buffer =
this._buffer.concat(read_stream(stream, count));
},
onStopRequest() {
Assert.equal(
this._buffer,
this._expectVal);
do_timeout(0, run_next_test);
},
run() {
var channel = make_channel();
channel.loadFlags =
this._flags;
channel.setRequestHeader(VALUE_HDR_NAME,
this._sendVal,
false);
channel.setRequestHeader(VARY_HDR_NAME,
this._varyHdr,
false);
if (
this._cacheHdr) {
channel.setRequestHeader(CACHECTRL_HDR_NAME,
this._cacheHdr,
false);
}
channel.asyncOpen(
this);
},
};
var gTests = [
// Test LOAD_FROM_CACHE: Load cache-entry
new Test(
Ci.nsIRequest.LOAD_NORMAL,
"entity-initial",
// hdr-value used to vary
"request1",
// echoed by handler
"request1" // value expected to receive in channel
),
// Verify that it was cached
new Test(
Ci.nsIRequest.LOAD_NORMAL,
"entity-initial",
// hdr-value used to vary
"fresh value with LOAD_NORMAL",
// echoed by handler
"request1" // value expected to receive in channel
),
// Load same entity with LOAD_FROM_CACHE-flag
new Test(
Ci.nsIRequest.LOAD_FROM_CACHE,
"entity-initial",
// hdr-value used to vary
"fresh value with LOAD_FROM_CACHE",
// echoed by handler
"request1" // value expected to receive in channel
),
// Load different entity with LOAD_FROM_CACHE-flag
new Test(
Ci.nsIRequest.LOAD_FROM_CACHE,
"entity-l-f-c",
// hdr-value used to vary
"request2",
// echoed by handler
"request2" // value expected to receive in channel
),
// Verify that new value was cached
new Test(
Ci.nsIRequest.LOAD_NORMAL,
"entity-l-f-c",
// hdr-value used to vary
"fresh value with LOAD_NORMAL",
// echoed by handler
"request2" // value expected to receive in channel
),
// Test VALIDATE_NEVER: Note previous cache-entry
new Test(
Ci.nsIRequest.VALIDATE_NEVER,
"entity-v-n",
// hdr-value used to vary
"request3",
// echoed by handler
"request3" // value expected to receive in channel
),
// Verify that cache-entry was replaced
new Test(
Ci.nsIRequest.LOAD_NORMAL,
"entity-v-n",
// hdr-value used to vary
"fresh value with LOAD_NORMAL",
// echoed by handler
"request3" // value expected to receive in channel
),
// Test combination VALIDATE_NEVER && no-store: Load new cache-entry
new Test(
Ci.nsIRequest.LOAD_NORMAL,
"entity-2",
// hdr-value used to vary
"request4",
// echoed by handler
"request4",
// value expected to receive in channel
"no-store" // set no-store on response
),
// Ensure we validate without IMS header in this case (verified in handler)
new Test(
Ci.nsIRequest.VALIDATE_NEVER,
"entity-2-v-n",
// hdr-value used to vary
"request5",
// echoed by handler
"request5" // value expected to receive in channel
),
// Test VALIDATE-ALWAYS: Load new entity
new Test(
Ci.nsIRequest.LOAD_NORMAL,
"entity-3",
// hdr-value used to vary
"request6",
// echoed by handler
"request6",
// value expected to receive in channel
"no-cache" // set no-cache on response
),
// Ensure we don't send IMS header also in this case (verified in handler)
new Test(
Ci.nsIRequest.VALIDATE_ALWAYS,
"entity-3-v-a",
// hdr-value used to vary
"request7",
// echoed by handler
"request7" // value expected to receive in channel
),
];
function run_next_test() {
if (!gTests.length) {
httpserver.stop(do_test_finished);
return;
}
var test = gTests.shift();
test.run();
}
function handler(metadata, response) {
// None of the tests above should send an IMS
Assert.ok(!metadata.hasHeader(
"If-Modified-Since"));
// Pick up requested value to echo
var hdr =
"default value";
try {
hdr = metadata.getHeader(VALUE_HDR_NAME);
}
catch (ex) {}
// Pick up requested cache-control header-value
var cctrlVal =
"max-age=10000";
try {
cctrlVal = metadata.getHeader(CACHECTRL_HDR_NAME);
}
catch (ex) {}
response.setStatusLine(metadata.httpVersion, 200,
"OK");
response.setHeader(
"Content-Type",
"text/plain",
false);
response.setHeader(
"Cache-Control", cctrlVal,
false);
response.setHeader(
"Vary", VARY_HDR_NAME,
false);
response.setHeader(
"Last-Modified",
"Tue, 15 Nov 1994 12:45:26 GMT",
false);
response.bodyOutputStream.write(hdr, hdr.length);
}
function run_test() {
// clear the cache
evict_cache_entries();
httpserver =
new HttpServer();
httpserver.registerPathHandler(
"/bug633743", handler);
httpserver.start(-1);
run_next_test();
do_test_pending();
}