Bug 1796551 [wpt PR 36570] - WebKit export of https://bugs.webkit.org/show_bug.cgi...
[gecko.git] / netwerk / test / unit / test_resumable_truncate.js
blob72785a5b4b1fe831d78839b98234e539e9b8494a
1 "use strict";
3 const { HttpServer } = ChromeUtils.import("resource://testing-common/httpd.js");
5 var httpserver = null;
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
17       .getHeader("Range")
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);
24       return;
25     }
26     body = responseBody.slice(from, to + 1);
27     // always respond to successful range requests with 206
28     response.setStatusLine(metadata.httpVersion, 206, "Partial Content");
29     response.setHeader(
30       "Content-Range",
31       from + "-" + to + "/" + responseBody.length,
32       false
33     );
34   }
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([
49     "nsIStreamListener",
50     "nsIRequestObserver",
51   ]),
53   onStartRequest(request) {},
55   onDataAvailable(request, stream, offset, count) {
56     request.QueryInterface(Ci.nsIChannel).cancel(Cr.NS_BINDING_ABORTED);
57   },
59   onStopRequest(request, status) {
60     Assert.equal(status, Cr.NS_BINDING_ABORTED);
61     this.continueFn();
62   },
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"
72   );
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"
79   );
80   chan.asyncOpen(new Canceler(start_cache_read));
83 function run_test() {
84   httpserver = new HttpServer();
85   httpserver.registerPathHandler("/cached/test.gz", cachedHandler);
86   httpserver.start(-1);
88   var chan = make_channel(
89     "http://localhost:" + httpserver.identity.primaryPort + "/cached/test.gz"
90   );
91   chan.asyncOpen(new ChannelListener(start_canceler, null));
92   do_test_pending();