7 const { HttpServer } = ChromeUtils.importESModule(
8 "resource://testing-common/httpd.sys.mjs"
11 ChromeUtils.defineLazyGetter(this, "URL", function () {
12 return "http://localhost:" + httpserver.identity.primaryPort;
15 var httpserver = new HttpServer();
16 var testpath = "/simple";
18 var testfile = do_get_file("../unit/data/test_readline6.txt");
20 const BOUNDARY = "AaB03x";
25 'Content-Disposition: form-data; name="body"\r\n\r\n' +
30 'Content-Disposition: form-data; name="files"; filename="' +
33 "Content-Type: application/octet-stream\r\n" +
37 var teststring2 = "--" + BOUNDARY + "--\r\n";
39 const BUFFERSIZE = 4096;
40 var correctOnProgress = false;
42 var listenerCallback = {
43 QueryInterface: ChromeUtils.generateQI(["nsIProgressEventSink"]),
46 if (iid.equals(Ci.nsIProgressEventSink)) {
49 throw Components.Exception("", Cr.NS_ERROR_NO_INTERFACE);
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;
63 var sstream1 = Cc["@mozilla.org/io/string-input-stream;1"].createInstance(
64 Ci.nsIStringInputStream
66 sstream1.data = teststring1;
68 var fstream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(
71 fstream.init(testfile, -1, -1, 0);
74 "@mozilla.org/network/buffered-input-stream;1"
75 ].createInstance(Ci.nsIBufferedInputStream);
76 buffered.init(fstream, BUFFERSIZE);
78 var sstream2 = Cc["@mozilla.org/io/string-input-stream;1"].createInstance(
79 Ci.nsIStringInputStream
81 sstream2.data = teststring2;
83 var multi = Cc["@mozilla.org/io/multiplex-input-stream;1"].createInstance(
84 Ci.nsIMultiplexInputStream
86 multi.appendStream(sstream1);
87 multi.appendStream(buffered);
88 multi.appendStream(sstream2);
90 var mime = Cc["@mozilla.org/network/mime-input-stream;1"].createInstance(
93 mime.addHeader("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);
96 httpserver.registerPathHandler(testpath, serverHandler);
99 var channel = setupChannel(testpath);
102 .QueryInterface(Ci.nsIUploadChannel)
103 .setUploadStream(mime, "", mime.available());
104 channel.requestMethod = "POST";
105 channel.notificationCallbacks = listenerCallback;
106 channel.asyncOpen(new ChannelListener(checkRequest, channel));
110 function setupChannel(path) {
111 return NetUtil.newChannel({
113 loadUsingSystemPrincipal: true,
114 }).QueryInterface(Ci.nsIHttpChannel);
117 function serverHandler(metadata) {
118 Assert.equal(metadata.method, "POST");
120 var data = read_stream(
121 metadata.bodyInputStream,
122 metadata.bodyInputStream.available()
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);
132 read_stream(testfile_stream, testfile_stream.available()) +
138 function checkRequest() {
139 Assert.ok(correctOnProgress);
140 httpserver.stop(do_test_finished);