test_multipart_contentdisp.js (3403B)
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; 11 }); 12 13 function make_channel(url) { 14 return NetUtil.newChannel({ uri: url, loadUsingSystemPrincipal: true }); 15 } 16 17 var multipartBody = 18 "--boundary\r\nContent-Type: text/html\r\nContent-Disposition: inline\r\n\r\n<script>alert(document.domain)</script>\r\n--boundary--"; 19 20 function contentHandler(metadata, response) { 21 response.setHeader("Content-Type", 'multipart/mixed; boundary="boundary"'); 22 response.bodyOutputStream.write(multipartBody, multipartBody.length); 23 } 24 25 function contentHandler2(metadata, response) { 26 response.setHeader("Content-Type", 'multipart/mixed; boundary="boundary"'); 27 response.setHeader("Content-Disposition", "attachment"); 28 29 response.bodyOutputStream.write(multipartBody, multipartBody.length); 30 } 31 32 class MultipartListener { 33 QueryInterface = ChromeUtils.generateQI([ 34 "nsIStreamListener", 35 "nsIRequestObserver", 36 "nsIMultiPartChannelListener", 37 ]); 38 39 constructor(callback) { 40 this.entries = []; 41 this.entry = null; 42 this.callback = callback; 43 } 44 45 onStartRequest(request) { 46 this.entry = { 47 request, 48 data: "", 49 }; 50 } 51 52 onDataAvailable(request, stream, offset, count) { 53 try { 54 this.entry.data = this.entry.data.concat(read_stream(stream, count)); 55 dump("BUFFEEE: " + this.entry.data + "\n\n"); 56 } catch (ex) { 57 do_throw("Error in onDataAvailable: " + ex); 58 } 59 } 60 61 onStopRequest(_request) { 62 this.entries.push(this.entry); 63 this.entry = null; 64 } 65 66 onAfterLastPart(status) { 67 this.callback(this.entries, status); 68 } 69 } 70 71 add_setup(async () => { 72 httpserver = new HttpServer(); 73 httpserver.registerPathHandler("/multipart", contentHandler); 74 httpserver.registerPathHandler("/multipart2", contentHandler2); 75 httpserver.start(-1); 76 }); 77 78 add_task(async function test_contentDisp() { 79 var streamConv = Cc["@mozilla.org/streamConverters;1"].getService( 80 Ci.nsIStreamConverterService 81 ); 82 let req = await new Promise(resolve => { 83 let multipartListener = new MultipartListener(resolve); 84 var conv = streamConv.asyncConvertData( 85 "multipart/mixed", 86 "*/*", 87 multipartListener, 88 null 89 ); 90 var chan = make_channel(`${uri}/multipart`); 91 chan.asyncOpen(conv, null); 92 }); 93 Assert.ok(req.length); 94 req[0].request.QueryInterface(Ci.nsIChannel); 95 Assert.equal(req[0].request.contentType, "text/html"); 96 Assert.equal( 97 req[0].request.contentDisposition, 98 Ci.nsIChannel.DISPOSITION_INLINE 99 ); 100 }); 101 102 add_task(async function test_contentDisp() { 103 var streamConv = Cc["@mozilla.org/streamConverters;1"].getService( 104 Ci.nsIStreamConverterService 105 ); 106 let req = await new Promise(resolve => { 107 let multipartListener = new MultipartListener(resolve); 108 var conv = streamConv.asyncConvertData( 109 "multipart/mixed", 110 "*/*", 111 multipartListener, 112 null 113 ); 114 var chan = make_channel(`${uri}/multipart2`); 115 chan.asyncOpen(conv, null); 116 }); 117 Assert.ok(req.length); 118 req[0].request.QueryInterface(Ci.nsIChannel); 119 Assert.equal(req[0].request.contentType, "text/html"); 120 Assert.equal( 121 req[0].request.contentDisposition, 122 Ci.nsIChannel.DISPOSITION_ATTACHMENT 123 ); 124 });