forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			143 lines
		
	
	
	
		
			3.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			143 lines
		
	
	
	
		
			3.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| "use strict";
 | |
| 
 | |
| const { HttpServer } = ChromeUtils.import("resource://testing-common/httpd.js");
 | |
| 
 | |
| XPCOMUtils.defineLazyGetter(this, "URL", function() {
 | |
|   return "http://localhost:" + httpserver.identity.primaryPort;
 | |
| });
 | |
| 
 | |
| var httpserver = new HttpServer();
 | |
| var testpath = "/simple";
 | |
| var httpbody = "0123456789";
 | |
| 
 | |
| var last = 0,
 | |
|   max = 0;
 | |
| 
 | |
| const STATUS_RECEIVING_FROM = 0x804b0006;
 | |
| const LOOPS = 50000;
 | |
| 
 | |
| const TYPE_ONSTATUS = 1;
 | |
| const TYPE_ONPROGRESS = 2;
 | |
| const TYPE_ONSTARTREQUEST = 3;
 | |
| const TYPE_ONDATAAVAILABLE = 4;
 | |
| const TYPE_ONSTOPREQUEST = 5;
 | |
| 
 | |
| var ProgressCallback = function() {};
 | |
| 
 | |
| ProgressCallback.prototype = {
 | |
|   _listener: null,
 | |
|   _got_onstartrequest: false,
 | |
|   _got_onstatus_after_onstartrequest: false,
 | |
|   _last_callback_handled: null,
 | |
|   statusArg: "",
 | |
|   finish: null,
 | |
| 
 | |
|   QueryInterface: ChromeUtils.generateQI([
 | |
|     "nsIProgressEventSink",
 | |
|     "nsIStreamListener",
 | |
|     "nsIRequestObserver",
 | |
|   ]),
 | |
| 
 | |
|   getInterface(iid) {
 | |
|     if (
 | |
|       iid.equals(Ci.nsIProgressEventSink) ||
 | |
|       iid.equals(Ci.nsIStreamListener) ||
 | |
|       iid.equals(Ci.nsIRequestObserver)
 | |
|     ) {
 | |
|       return this;
 | |
|     }
 | |
|     throw Components.Exception("", Cr.NS_ERROR_NO_INTERFACE);
 | |
|   },
 | |
| 
 | |
|   onStartRequest(request) {
 | |
|     Assert.equal(this._last_callback_handled, TYPE_ONSTATUS);
 | |
|     this._got_onstartrequest = true;
 | |
|     this._last_callback_handled = TYPE_ONSTARTREQUEST;
 | |
| 
 | |
|     this._listener = new ChannelListener(checkRequest, request);
 | |
|     this._listener.onStartRequest(request);
 | |
|   },
 | |
| 
 | |
|   onDataAvailable(request, data, offset, count) {
 | |
|     Assert.equal(this._last_callback_handled, TYPE_ONPROGRESS);
 | |
|     this._last_callback_handled = TYPE_ONDATAAVAILABLE;
 | |
| 
 | |
|     this._listener.onDataAvailable(request, data, offset, count);
 | |
|   },
 | |
| 
 | |
|   onStopRequest(request, status) {
 | |
|     Assert.equal(this._last_callback_handled, TYPE_ONDATAAVAILABLE);
 | |
|     Assert.ok(this._got_onstatus_after_onstartrequest);
 | |
|     this._last_callback_handled = TYPE_ONSTOPREQUEST;
 | |
| 
 | |
|     this._listener.onStopRequest(request, status);
 | |
|     delete this._listener;
 | |
|     this.finish();
 | |
|   },
 | |
| 
 | |
|   onProgress(request, progress, progressMax) {
 | |
|     Assert.equal(this._last_callback_handled, TYPE_ONSTATUS);
 | |
|     this._last_callback_handled = TYPE_ONPROGRESS;
 | |
| 
 | |
|     Assert.equal(this.mStatus, STATUS_RECEIVING_FROM);
 | |
|     last = progress;
 | |
|     max = progressMax;
 | |
|   },
 | |
| 
 | |
|   onStatus(request, status, statusArg) {
 | |
|     if (!this._got_onstartrequest) {
 | |
|       // Ensure that all messages before onStartRequest are onStatus
 | |
|       if (this._last_callback_handled) {
 | |
|         Assert.equal(this._last_callback_handled, TYPE_ONSTATUS);
 | |
|       }
 | |
|     } else if (this._last_callback_handled == TYPE_ONSTARTREQUEST) {
 | |
|       this._got_onstatus_after_onstartrequest = true;
 | |
|     } else {
 | |
|       Assert.equal(this._last_callback_handled, TYPE_ONDATAAVAILABLE);
 | |
|     }
 | |
|     this._last_callback_handled = TYPE_ONSTATUS;
 | |
| 
 | |
|     Assert.equal(statusArg, this.statusArg);
 | |
|     this.mStatus = status;
 | |
|   },
 | |
| 
 | |
|   mStatus: 0,
 | |
| };
 | |
| 
 | |
| registerCleanupFunction(async () => {
 | |
|   await httpserver.stop();
 | |
| });
 | |
| 
 | |
| function chanPromise(uri, statusArg) {
 | |
|   return new Promise(resolve => {
 | |
|     var chan = NetUtil.newChannel({
 | |
|       uri,
 | |
|       loadUsingSystemPrincipal: true,
 | |
|     });
 | |
|     chan.QueryInterface(Ci.nsIHttpChannel);
 | |
|     chan.requestMethod = "GET";
 | |
|     let listener = new ProgressCallback();
 | |
|     listener.statusArg = statusArg;
 | |
|     chan.notificationCallbacks = listener;
 | |
|     listener.finish = resolve;
 | |
|     chan.asyncOpen(listener);
 | |
|   });
 | |
| }
 | |
| 
 | |
| add_task(async function test_http1_1() {
 | |
|   httpserver.registerPathHandler(testpath, serverHandler);
 | |
|   httpserver.start(-1);
 | |
|   await chanPromise(URL + testpath, "localhost");
 | |
| });
 | |
| 
 | |
| function serverHandler(metadata, response) {
 | |
|   response.setHeader("Content-Type", "text/plain", false);
 | |
|   for (let i = 0; i < LOOPS; i++) {
 | |
|     response.bodyOutputStream.write(httpbody, httpbody.length);
 | |
|   }
 | |
| }
 | |
| 
 | |
| function checkRequest(request, data, context) {
 | |
|   Assert.equal(last, httpbody.length * LOOPS);
 | |
|   Assert.equal(max, httpbody.length * LOOPS);
 | |
| }
 | 
