3 const { HttpServer } = ChromeUtils.import("resource://testing-common/httpd.js");
7 function make_channel(url, callback, ctx) {
8 return NetUtil.newChannel({ uri: url, loadUsingSystemPrincipal: true });
11 const responseBody = "response body";
13 function cachedHandler(metadata, response) {
14 var body = responseBody;
15 if (metadata.hasHeader("Range")) {
16 var matches = metadata
18 .match(/^\s*bytes=(\d+)?-(\d+)?\s*$/);
19 var from = matches[1] === undefined ? 0 : matches[1];
20 var to = matches[2] === undefined ? responseBody.length - 1 : matches[2];
21 if (from >= responseBody.length) {
22 response.setStatusLine(metadata.httpVersion, 416, "Start pos too high");
23 response.setHeader("Content-Range", "*/" + responseBody.length, false);
26 body = responseBody.slice(from, to + 1);
27 // always respond to successful range requests with 206
28 response.setStatusLine(metadata.httpVersion, 206, "Partial Content");
31 from + "-" + to + "/" + responseBody.length,
36 response.setHeader("Content-Type", "text/plain", false);
37 response.setHeader("ETag", "Just testing");
38 response.setHeader("Accept-Ranges", "bytes");
40 response.bodyOutputStream.write(body, body.length);
43 function Canceler(continueFn) {
44 this.continueFn = continueFn;
47 Canceler.prototype = {
48 QueryInterface: ChromeUtils.generateQI([
53 onStartRequest(request) {},
55 onDataAvailable(request, stream, offset, count) {
56 request.QueryInterface(Ci.nsIChannel).cancel(Cr.NS_BINDING_ABORTED);
59 onStopRequest(request, status) {
60 Assert.equal(status, Cr.NS_BINDING_ABORTED);
65 function finish_test() {
66 httpserver.stop(do_test_finished);
69 function start_cache_read() {
70 var chan = make_channel(
71 "http://localhost:" + httpserver.identity.primaryPort + "/cached/test.gz"
73 chan.asyncOpen(new ChannelListener(finish_test, null));
76 function start_canceler() {
77 var chan = make_channel(
78 "http://localhost:" + httpserver.identity.primaryPort + "/cached/test.gz"
80 chan.asyncOpen(new Canceler(start_cache_read));
84 httpserver = new HttpServer();
85 httpserver.registerPathHandler("/cached/test.gz", cachedHandler);
88 var chan = make_channel(
89 "http://localhost:" + httpserver.identity.primaryPort + "/cached/test.gz"
91 chan.asyncOpen(new ChannelListener(start_canceler, null));