Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

"use strict";
// Test that a multipart/byteranges response with start > end in
// Content-Range is rejected (e.g. "bytes 100-50/200").
const { HttpServer } = ChromeUtils.importESModule(
);
const multipartBody =
"--boundary\r\n" +
"Content-type: text/plain\r\n" +
"Content-range: bytes 100-50/200\r\n" +
"\r\n" +
"aaa\r\n" +
"--boundary--";
add_task(async function test_invalid_content_range() {
let httpserver = new HttpServer();
httpserver.registerPathHandler("/multipart", (metadata, response) => {
response.setHeader(
"Content-Type",
'multipart/byteranges; boundary="boundary"'
);
response.bodyOutputStream.write(multipartBody, multipartBody.length);
});
httpserver.start(-1);
let uri =
"http://localhost:" + httpserver.identity.primaryPort + "/multipart";
let status = await new Promise(resolve => {
let listener = {
QueryInterface: ChromeUtils.generateQI([
"nsIStreamListener",
"nsIRequestObserver",
]),
onStartRequest() {},
onDataAvailable(request, stream, offset, count) {
// Consume the stream even though we expect failure.
read_stream(stream, count);
},
onStopRequest(request, aStatus) {
resolve(aStatus);
},
};
let streamConv = Cc["@mozilla.org/streamConverters;1"].getService(
Ci.nsIStreamConverterService
);
let conv = streamConv.asyncConvertData(
"multipart/byteranges",
"*/*",
listener,
null
);
let chan = NetUtil.newChannel({
uri,
loadUsingSystemPrincipal: true,
});
chan.asyncOpen(conv);
});
Assert.equal(
status,
Cr.NS_ERROR_CORRUPTED_CONTENT,
"Should reject Content-Range with start > end"
);
await new Promise(resolve => httpserver.stop(resolve));
});