netwerk/test/unit/test_httpcancel.js

Wed, 31 Dec 2014 06:55:46 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:55:46 +0100
changeset 1
ca08bd8f51b2
permissions
-rw-r--r--

Added tag TORBROWSER_REPLICA for changeset 6474c204b198

     1 // This file ensures that canceling a channel early does not
     2 // send the request to the server (bug 350790)
     3 //
     4 // I've also shoehorned in a test that ENSURE_CALLED_BEFORE_CONNECT works as
     5 // expected: see comments that start with ENSURE_CALLED_BEFORE_CONNECT:
     7 Cu.import("resource://testing-common/httpd.js");
     9 var ios = Components.classes["@mozilla.org/network/io-service;1"]
    10                     .getService(Components.interfaces.nsIIOService);
    11 var observer = {
    12   QueryInterface: function eventsink_qi(iid) {
    13     if (iid.equals(Components.interfaces.nsISupports) ||
    14         iid.equals(Components.interfaces.nsIObserver))
    15       return this;
    16     throw Components.results.NS_ERROR_NO_INTERFACE;
    17   },
    19   observe: function(subject, topic, data) {
    20     subject = subject.QueryInterface(Components.interfaces.nsIRequest);
    21     subject.cancel(Components.results.NS_BINDING_ABORTED);
    23     // ENSURE_CALLED_BEFORE_CONNECT: setting values should still work
    24     try {
    25       subject.QueryInterface(Components.interfaces.nsIHttpChannel);
    26       currentReferrer = subject.getRequestHeader("Referer");
    27       do_check_eq(currentReferrer, "http://site1.com/");
    28       var uri = ios.newURI("http://site2.com", null, null);
    29       subject.referrer = uri;
    30     } catch (ex) {
    31       do_throw("Exception: " + ex);
    32     }
    34     var obs = Components.classes["@mozilla.org/observer-service;1"].getService();
    35     obs = obs.QueryInterface(Components.interfaces.nsIObserverService);
    36     obs.removeObserver(observer, "http-on-modify-request");
    37   }
    38 };
    40 var listener = {
    41   onStartRequest: function test_onStartR(request, ctx) {
    42     do_check_eq(request.status, Components.results.NS_BINDING_ABORTED);
    44     // ENSURE_CALLED_BEFORE_CONNECT: setting referrer should now fail
    45     try {
    46       request.QueryInterface(Components.interfaces.nsIHttpChannel);
    47       currentReferrer = request.getRequestHeader("Referer");
    48       do_check_eq(currentReferrer, "http://site2.com/");
    49       var uri = ios.newURI("http://site3.com/", null, null);
    51       // Need to set NECKO_ERRORS_ARE_FATAL=0 else we'll abort process
    52       var env = Components.classes["@mozilla.org/process/environment;1"].
    53                   getService(Components.interfaces.nsIEnvironment);
    54       env.set("NECKO_ERRORS_ARE_FATAL", "0");
    55       // we expect setting referrer to fail
    56       try {
    57         request.referrer = uri;
    58         do_throw("Error should have been thrown before getting here");
    59       } catch (ex) { } 
    60     } catch (ex) {
    61       do_throw("Exception: " + ex);
    62     }
    63   },
    65   onDataAvailable: function test_ODA() {
    66     do_throw("Should not get any data!");
    67   },
    69   onStopRequest: function test_onStopR(request, ctx, status) {
    70     httpserv.stop(do_test_finished);
    71   }
    72 };
    74 function makeChan(url) {
    75   var chan = ios.newChannel(url, null, null)
    76                 .QueryInterface(Components.interfaces.nsIHttpChannel);
    78   // ENSURE_CALLED_BEFORE_CONNECT: set original value
    79   var uri = ios.newURI("http://site1.com", null, null);
    80   chan.referrer = uri;
    82   return chan;
    83 }
    85 var httpserv = null;
    87 function execute_test() {
    88   var chan = makeChan("http://localhost:" +
    89                       httpserv.identity.primaryPort + "/failtest");
    91   var obs = Components.classes["@mozilla.org/observer-service;1"].getService();
    92   obs = obs.QueryInterface(Components.interfaces.nsIObserverService);
    93   obs.addObserver(observer, "http-on-modify-request", false);
    95   chan.asyncOpen(listener, null);
    96 }
    98 function run_test() {
    99   httpserv = new HttpServer();
   100   httpserv.registerPathHandler("/failtest", failtest);
   101   httpserv.start(-1);
   103   execute_test();
   105   do_test_pending();
   106 }
   108 // PATHS
   110 // /failtest
   111 function failtest(metadata, response) {
   112   do_throw("This should not be reached");
   113 }

mercurial