test_post.js (3564B)
1 // 2 // POST test 3 // 4 5 "use strict"; 6 7 const { HttpServer } = ChromeUtils.importESModule( 8 "resource://testing-common/httpd.sys.mjs" 9 ); 10 11 ChromeUtils.defineLazyGetter(this, "URL", function () { 12 return "http://localhost:" + httpserver.identity.primaryPort; 13 }); 14 15 var httpserver = new HttpServer(); 16 var testpath = "/simple"; 17 18 var testfile = do_get_file("../unit/data/test_readline6.txt"); 19 20 const BOUNDARY = "AaB03x"; 21 var teststring1 = 22 "--" + 23 BOUNDARY + 24 "\r\n" + 25 'Content-Disposition: form-data; name="body"\r\n\r\n' + 26 "0123456789\r\n" + 27 "--" + 28 BOUNDARY + 29 "\r\n" + 30 'Content-Disposition: form-data; name="files"; filename="' + 31 testfile.leafName + 32 '"\r\n' + 33 "Content-Type: application/octet-stream\r\n" + 34 "Content-Length: " + 35 testfile.fileSize + 36 "\r\n\r\n"; 37 var teststring2 = "--" + BOUNDARY + "--\r\n"; 38 39 const BUFFERSIZE = 4096; 40 var correctOnProgress = false; 41 42 var listenerCallback = { 43 QueryInterface: ChromeUtils.generateQI(["nsIProgressEventSink"]), 44 45 getInterface(iid) { 46 if (iid.equals(Ci.nsIProgressEventSink)) { 47 return this; 48 } 49 throw Components.Exception("", Cr.NS_ERROR_NO_INTERFACE); 50 }, 51 52 onProgress(request, progress, progressMax) { 53 // this works because the response is 0 bytes and does not trigger onprogress 54 if (progress === progressMax) { 55 correctOnProgress = true; 56 } 57 }, 58 59 onStatus() {}, 60 }; 61 62 function run_test() { 63 var sstream1 = Cc["@mozilla.org/io/string-input-stream;1"].createInstance( 64 Ci.nsIStringInputStream 65 ); 66 sstream1.setByteStringData(teststring1); 67 68 var fstream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance( 69 Ci.nsIFileInputStream 70 ); 71 fstream.init(testfile, -1, -1, 0); 72 73 var buffered = Cc[ 74 "@mozilla.org/network/buffered-input-stream;1" 75 ].createInstance(Ci.nsIBufferedInputStream); 76 buffered.init(fstream, BUFFERSIZE); 77 78 var sstream2 = Cc["@mozilla.org/io/string-input-stream;1"].createInstance( 79 Ci.nsIStringInputStream 80 ); 81 sstream2.setByteStringData(teststring2); 82 83 var multi = Cc["@mozilla.org/io/multiplex-input-stream;1"].createInstance( 84 Ci.nsIMultiplexInputStream 85 ); 86 multi.appendStream(sstream1); 87 multi.appendStream(buffered); 88 multi.appendStream(sstream2); 89 90 var mime = Cc["@mozilla.org/network/mime-input-stream;1"].createInstance( 91 Ci.nsIMIMEInputStream 92 ); 93 mime.addHeader("Content-Type", "multipart/form-data; boundary=" + BOUNDARY); 94 mime.setData(multi); 95 96 httpserver.registerPathHandler(testpath, serverHandler); 97 httpserver.start(-1); 98 99 var channel = setupChannel(testpath); 100 101 channel 102 .QueryInterface(Ci.nsIUploadChannel) 103 .setUploadStream(mime, "", mime.available()); 104 channel.requestMethod = "POST"; 105 channel.notificationCallbacks = listenerCallback; 106 channel.asyncOpen(new ChannelListener(checkRequest, channel)); 107 do_test_pending(); 108 } 109 110 function setupChannel(path) { 111 return NetUtil.newChannel({ 112 uri: URL + path, 113 loadUsingSystemPrincipal: true, 114 }).QueryInterface(Ci.nsIHttpChannel); 115 } 116 117 function serverHandler(metadata) { 118 Assert.equal(metadata.method, "POST"); 119 120 var data = read_stream( 121 metadata.bodyInputStream, 122 metadata.bodyInputStream.available() 123 ); 124 125 var testfile_stream = Cc[ 126 "@mozilla.org/network/file-input-stream;1" 127 ].createInstance(Ci.nsIFileInputStream); 128 testfile_stream.init(testfile, -1, -1, 0); 129 130 Assert.equal( 131 teststring1 + 132 read_stream(testfile_stream, testfile_stream.available()) + 133 teststring2, 134 data 135 ); 136 } 137 138 function checkRequest() { 139 Assert.ok(correctOnProgress); 140 httpserver.stop(do_test_finished); 141 }