// This test exists mostly as documentation that
// Firefox can load brotli files over HTTP if we set the proper pref.
"use strict";
function contentHandler(metadata, response) {
response.setHeader(
"Content-Type",
"text/plain",
false);
response.setHeader(
"Content-Encoding",
"br",
false);
response.write(
"\x0b\x02\x80hello\x03");
}
const { HttpServer } = ChromeUtils.importESModule(
"resource://testing-common/httpd.sys.mjs"
);
ChromeUtils.defineLazyGetter(
this,
"URL",
function () {
return "http://localhost:" + httpServer.identity.primaryPort + "/content";
});
var httpServer =
null;
add_task(async
function check_brotli() {
httpServer =
new HttpServer();
httpServer.registerPathHandler(
"/content", contentHandler);
httpServer.start(-1);
async
function test() {
let chan = NetUtil.newChannel({ uri: URL, loadUsingSystemPrincipal:
true });
let [, buff] = await
new Promise(resolve => {
chan.asyncOpen(
new ChannelListener(
(req, buff1) => {
resolve([req, buff1]);
},
null,
CL_IGNORE_CL
)
);
});
return buff;
}
Services.prefs.setBoolPref(
"network.http.encoding.trustworthy_is_https",
true
);
equal(
await test(),
"hello",
"Should decode brotli when trustworthy_is_https=true"
);
Services.prefs.setBoolPref(
"network.http.encoding.trustworthy_is_https",
false
);
equal(
await test(),
"\x0b\x02\x80hello\x03",
"Should not decode brotli when trustworthy_is_https=false"
);
Services.prefs.setCharPref(
"network.http.accept-encoding",
"gzip, deflate, br"
);
equal(
await test(),
"hello",
"Should decode brotli if we set the HTTP accept encoding to include brotli"
);
Services.prefs.clearUserPref(
"network.http.accept-encoding");
Services.prefs.clearUserPref(
"network.http.encoding.trustworthy_is_https");
await httpServer.stop();
});
// Make sure we still decode brotli on HTTPS
// Node server doesn't work on Android yet.
add_task(
{ skip_if: () => AppConstants.platform ==
"android" },
async
function check_https() {
Services.prefs.setBoolPref(
"network.http.encoding.trustworthy_is_https",
true
);
let certdb = Cc[
"@mozilla.org/security/x509certdb;1"].getService(
Ci.nsIX509CertDB
);
addCertFromFile(certdb,
"http2-ca.pem",
"CTu,u,u");
let server =
new NodeHTTPSServer();
await server.start();
registerCleanupFunction(async () => {
await server.stop();
});
await server.registerPathHandler(
"/brotli", (req, resp) => {
resp.setHeader(
"Content-Type",
"text/plain");
resp.setHeader(
"Content-Encoding",
"br");
let output =
"\x0b\x02\x80hello\x03";
resp.writeHead(200);
resp.end(output,
"binary");
});
equal(
Services.prefs.getCharPref(
"network.http.accept-encoding.secure"),
"gzip, deflate, br, zstd"
);
let { req, buff } = await
new Promise(resolve => {
let chan = NetUtil.newChannel({
uri: `${server.origin()}/brotli`,
loadUsingSystemPrincipal:
true,
});
chan.asyncOpen(
new ChannelListener(
(req1, buff1) => resolve({ req: req1, buff: buff1 }),
null,
CL_ALLOW_UNKNOWN_CL
)
);
});
equal(req.status, Cr.NS_OK);
equal(req.QueryInterface(Ci.nsIHttpChannel).responseStatus, 200);
equal(buff,
"hello");
}
);