netwerk/test/unit/test_resumable_truncate.js

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/netwerk/test/unit/test_resumable_truncate.js	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,89 @@
     1.4 +Cu.import("resource://testing-common/httpd.js");
     1.5 +
     1.6 +var httpserver = null;
     1.7 +
     1.8 +function make_channel(url, callback, ctx) {
     1.9 +  var ios = Cc["@mozilla.org/network/io-service;1"].
    1.10 +            getService(Ci.nsIIOService);
    1.11 +  return ios.newChannel(url, "", null);
    1.12 +}
    1.13 +
    1.14 +const responseBody = "response body";
    1.15 +
    1.16 +function cachedHandler(metadata, response) {
    1.17 +  var body = responseBody;
    1.18 +  if (metadata.hasHeader("Range")) {
    1.19 +    var matches = metadata.getHeader("Range").match(/^\s*bytes=(\d+)?-(\d+)?\s*$/);
    1.20 +    var from = (matches[1] === undefined) ? 0 : matches[1];
    1.21 +    var to = (matches[2] === undefined) ? responseBody.length - 1 : matches[2];
    1.22 +    if (from >= responseBody.length) {
    1.23 +      response.setStatusLine(metadata.httpVersion, 416, "Start pos too high");
    1.24 +      response.setHeader("Content-Range", "*/" + responseBody.length, false);
    1.25 +      return;
    1.26 +    }
    1.27 +    body = responseBody.slice(from, to + 1);
    1.28 +    // always respond to successful range requests with 206
    1.29 +    response.setStatusLine(metadata.httpVersion, 206, "Partial Content");
    1.30 +    response.setHeader("Content-Range", from + "-" + to + "/" + responseBody.length, false);
    1.31 +  }
    1.32 +
    1.33 +  response.setHeader("Content-Type", "text/plain", false);
    1.34 +  response.setHeader("ETag", "Just testing");
    1.35 +  response.setHeader("Accept-Ranges", "bytes");
    1.36 +
    1.37 +  response.bodyOutputStream.write(body, body.length);
    1.38 +}
    1.39 +
    1.40 +function Canceler(continueFn) {
    1.41 +  this.continueFn = continueFn;
    1.42 +}
    1.43 +
    1.44 +Canceler.prototype = {
    1.45 +  QueryInterface: function(iid) {
    1.46 +    if (iid.equals(Ci.nsIStreamListener) ||
    1.47 +        iid.equals(Ci.nsIRequestObserver) ||
    1.48 +        iid.equals(Ci.nsISupports))
    1.49 +      return this;
    1.50 +    throw Components.results.NS_ERROR_NO_INTERFACE;
    1.51 +  },
    1.52 +
    1.53 +  onStartRequest: function(request, context) {
    1.54 +  },
    1.55 +
    1.56 +  onDataAvailable: function(request, context, stream, offset, count) {
    1.57 +    request.QueryInterface(Ci.nsIChannel)
    1.58 +           .cancel(Components.results.NS_BINDING_ABORTED);
    1.59 +  },
    1.60 +
    1.61 +  onStopRequest: function(request, context, status) {
    1.62 +    do_check_eq(status, Components.results.NS_BINDING_ABORTED);
    1.63 +    this.continueFn();
    1.64 +  }
    1.65 +};
    1.66 +
    1.67 +function finish_test() {
    1.68 +  httpserver.stop(do_test_finished);
    1.69 +}
    1.70 +
    1.71 +function start_cache_read() {
    1.72 +  var chan = make_channel("http://localhost:" +
    1.73 +                          httpserver.identity.primaryPort + "/cached/test.gz");
    1.74 +  chan.asyncOpen(new ChannelListener(finish_test, null), null);
    1.75 +}
    1.76 +
    1.77 +function start_canceler() {
    1.78 +  var chan = make_channel("http://localhost:" +
    1.79 +                          httpserver.identity.primaryPort + "/cached/test.gz");
    1.80 +  chan.asyncOpen(new Canceler(start_cache_read), null);
    1.81 +}
    1.82 +
    1.83 +function run_test() {
    1.84 +  httpserver = new HttpServer();
    1.85 +  httpserver.registerPathHandler("/cached/test.gz", cachedHandler);
    1.86 +  httpserver.start(-1);
    1.87 +
    1.88 +  var chan = make_channel("http://localhost:" +
    1.89 +                          httpserver.identity.primaryPort + "/cached/test.gz");
    1.90 +  chan.asyncOpen(new ChannelListener(start_canceler, null), null);
    1.91 +  do_test_pending();
    1.92 +}

mercurial