test_multipart_byteranges.js (3134B)
1 "use strict"; 2 3 const { HttpServer } = ChromeUtils.importESModule( 4 "resource://testing-common/httpd.sys.mjs" 5 ); 6 7 var httpserver = null; 8 9 ChromeUtils.defineLazyGetter(this, "uri", function () { 10 return "http://localhost:" + httpserver.identity.primaryPort + "/multipart"; 11 }); 12 13 function make_channel(url) { 14 return NetUtil.newChannel({ uri: url, loadUsingSystemPrincipal: true }); 15 } 16 17 var multipartBody = 18 "--boundary\r\n" + 19 "Content-type: text/plain\r\n" + 20 "Content-range: bytes 0-2/10\r\n" + 21 "\r\n" + 22 "aaa\r\n" + 23 "--boundary\r\n" + 24 "Content-type: text/plain\r\n" + 25 "Content-range: bytes 3-7/10\r\n" + 26 "\r\n" + 27 "bbbbb" + 28 "\r\n" + 29 "--boundary\r\n" + 30 "Content-type: text/plain\r\n" + 31 "Content-range: bytes 8-9/10\r\n" + 32 "\r\n" + 33 "cc" + 34 "\r\n" + 35 "--boundary--"; 36 37 function contentHandler(metadata, response) { 38 response.setHeader( 39 "Content-Type", 40 'multipart/byteranges; boundary="boundary"' 41 ); 42 response.bodyOutputStream.write(multipartBody, multipartBody.length); 43 } 44 45 var numTests = 2; 46 var testNum = 0; 47 48 var testData = [ 49 { 50 data: "aaa", 51 type: "text/plain", 52 isByteRangeRequest: true, 53 startRange: 0, 54 endRange: 2, 55 }, 56 { 57 data: "bbbbb", 58 type: "text/plain", 59 isByteRangeRequest: true, 60 startRange: 3, 61 endRange: 7, 62 }, 63 { 64 data: "cc", 65 type: "text/plain", 66 isByteRangeRequest: true, 67 startRange: 8, 68 endRange: 9, 69 }, 70 ]; 71 72 function responseHandler(request, buffer) { 73 Assert.equal(buffer, testData[testNum].data); 74 Assert.equal( 75 request.QueryInterface(Ci.nsIChannel).contentType, 76 testData[testNum].type 77 ); 78 Assert.equal( 79 request.QueryInterface(Ci.nsIByteRangeRequest).isByteRangeRequest, 80 testData[testNum].isByteRangeRequest 81 ); 82 Assert.equal( 83 request.QueryInterface(Ci.nsIByteRangeRequest).startRange, 84 testData[testNum].startRange 85 ); 86 Assert.equal( 87 request.QueryInterface(Ci.nsIByteRangeRequest).endRange, 88 testData[testNum].endRange 89 ); 90 if (++testNum == numTests) { 91 httpserver.stop(do_test_finished); 92 } 93 } 94 95 var multipartListener = { 96 _buffer: "", 97 98 QueryInterface: ChromeUtils.generateQI([ 99 "nsIStreamListener", 100 "nsIRequestObserver", 101 ]), 102 103 onStartRequest() { 104 this._buffer = ""; 105 }, 106 107 onDataAvailable(request, stream, offset, count) { 108 try { 109 this._buffer = this._buffer.concat(read_stream(stream, count)); 110 dump("BUFFEEE: " + this._buffer + "\n\n"); 111 } catch (ex) { 112 do_throw("Error in onDataAvailable: " + ex); 113 } 114 }, 115 116 onStopRequest(request) { 117 try { 118 responseHandler(request, this._buffer); 119 } catch (ex) { 120 do_throw("Error in closure function: " + ex); 121 } 122 }, 123 }; 124 125 function run_test() { 126 httpserver = new HttpServer(); 127 httpserver.registerPathHandler("/multipart", contentHandler); 128 httpserver.start(-1); 129 130 var streamConv = Cc["@mozilla.org/streamConverters;1"].getService( 131 Ci.nsIStreamConverterService 132 ); 133 var conv = streamConv.asyncConvertData( 134 "multipart/byteranges", 135 "*/*", 136 multipartListener, 137 null 138 ); 139 140 var chan = make_channel(uri); 141 chan.asyncOpen(conv, null); 142 do_test_pending(); 143 }