michael@0: Cu.import("resource://testing-common/httpd.js"); michael@0: michael@0: var httpserver = null; michael@0: michael@0: XPCOMUtils.defineLazyGetter(this, "uri", function() { michael@0: return "http://localhost:" + httpserver.identity.primaryPort + "/multipart"; michael@0: }); michael@0: michael@0: function make_channel(url) { michael@0: var ios = Cc["@mozilla.org/network/io-service;1"]. michael@0: getService(Ci.nsIIOService); michael@0: return ios.newChannel(url, "", null); michael@0: } michael@0: michael@0: var multipartBody = "--boundary\r\n"+ michael@0: "Content-type: text/plain\r\n"+ michael@0: "Content-range: bytes 0-2/10\r\n"+ michael@0: "\r\n"+ michael@0: "aaa\r\n"+ michael@0: "--boundary\r\n"+ michael@0: "Content-type: text/plain\r\n"+ michael@0: "Content-range: bytes 3-7/10\r\n"+ michael@0: "\r\n"+ michael@0: "bbbbb"+ michael@0: "\r\n"+ michael@0: "--boundary\r\n"+ michael@0: "Content-type: text/plain\r\n"+ michael@0: "Content-range: bytes 8-9/10\r\n"+ michael@0: "\r\n"+ michael@0: "cc"+ michael@0: "\r\n"+ michael@0: "--boundary--"; michael@0: michael@0: function make_channel(url) { michael@0: var ios = Cc["@mozilla.org/network/io-service;1"]. michael@0: getService(Ci.nsIIOService); michael@0: return ios.newChannel(url, "", null); michael@0: } michael@0: michael@0: function contentHandler(metadata, response) michael@0: { michael@0: response.setHeader("Content-Type", 'multipart/byteranges; boundary="boundary"'); michael@0: response.bodyOutputStream.write(multipartBody, multipartBody.length); michael@0: } michael@0: michael@0: var numTests = 2; michael@0: var testNum = 0; michael@0: michael@0: var testData = michael@0: [ michael@0: { data: "aaa", type: "text/plain", isByteRangeRequest: true, startRange: 0, endRange: 2 }, michael@0: { data: "bbbbb", type: "text/plain", isByteRangeRequest: true, startRange: 3, endRange: 7 }, michael@0: { data: "cc", type: "text/plain", isByteRangeRequest: true, startRange: 8, endRange: 9 } michael@0: ]; michael@0: michael@0: function responseHandler(request, buffer) michael@0: { michael@0: do_check_eq(buffer, testData[testNum].data); michael@0: do_check_eq(request.QueryInterface(Ci.nsIChannel).contentType, michael@0: testData[testNum].type); michael@0: do_check_eq(request.QueryInterface(Ci.nsIByteRangeRequest).isByteRangeRequest, michael@0: testData[testNum].isByteRangeRequest); michael@0: do_check_eq(request.QueryInterface(Ci.nsIByteRangeRequest).startRange, michael@0: testData[testNum].startRange); michael@0: do_check_eq(request.QueryInterface(Ci.nsIByteRangeRequest).endRange, michael@0: testData[testNum].endRange); michael@0: if (++testNum == numTests) michael@0: httpserver.stop(do_test_finished); michael@0: } michael@0: michael@0: var multipartListener = { michael@0: _buffer: "", michael@0: michael@0: QueryInterface: function(iid) { michael@0: if (iid.equals(Components.interfaces.nsIStreamListener) || michael@0: iid.equals(Components.interfaces.nsIRequestObserver) || michael@0: iid.equals(Components.interfaces.nsISupports)) michael@0: return this; michael@0: throw Components.results.NS_ERROR_NO_INTERFACE; michael@0: }, michael@0: michael@0: onStartRequest: function(request, context) { michael@0: this._buffer = ""; michael@0: }, michael@0: michael@0: onDataAvailable: function(request, context, stream, offset, count) { michael@0: try { michael@0: this._buffer = this._buffer.concat(read_stream(stream, count)); michael@0: dump("BUFFEEE: " + this._buffer + "\n\n"); michael@0: } catch (ex) { michael@0: do_throw("Error in onDataAvailable: " + ex); michael@0: } michael@0: }, michael@0: michael@0: onStopRequest: function(request, context, status) { michael@0: try { michael@0: responseHandler(request, this._buffer); michael@0: } catch (ex) { michael@0: do_throw("Error in closure function: " + ex); michael@0: } michael@0: } michael@0: }; michael@0: michael@0: function run_test() michael@0: { michael@0: httpserver = new HttpServer(); michael@0: httpserver.registerPathHandler("/multipart", contentHandler); michael@0: httpserver.start(-1); michael@0: michael@0: var streamConv = Cc["@mozilla.org/streamConverters;1"] michael@0: .getService(Ci.nsIStreamConverterService); michael@0: var conv = streamConv.asyncConvertData("multipart/byteranges", michael@0: "*/*", michael@0: multipartListener, michael@0: null); michael@0: michael@0: var chan = make_channel(uri); michael@0: chan.asyncOpen(conv, null); michael@0: do_test_pending(); michael@0: }