зеркало из https://github.com/mozilla/gecko-dev.git
121 строка
3.8 KiB
JavaScript
121 строка
3.8 KiB
JavaScript
//
|
|
// POST test
|
|
//
|
|
|
|
Cu.import("resource://testing-common/httpd.js");
|
|
Cu.import("resource://gre/modules/NetUtil.jsm");
|
|
|
|
XPCOMUtils.defineLazyGetter(this, "URL", function() {
|
|
return "http://localhost:" + httpserver.identity.primaryPort;
|
|
});
|
|
|
|
var httpserver = new HttpServer();
|
|
var testpath = "/simple";
|
|
|
|
var testfile = do_get_file("../unit/data/test_readline6.txt");
|
|
|
|
const BOUNDARY = "AaB03x";
|
|
var teststring1 = "--" + BOUNDARY + "\r\n"
|
|
+ "Content-Disposition: form-data; name=\"body\"\r\n\r\n"
|
|
+ "0123456789\r\n"
|
|
+ "--" + BOUNDARY + "\r\n"
|
|
+ "Content-Disposition: form-data; name=\"files\"; filename=\"" + testfile.leafName + "\"\r\n"
|
|
+ "Content-Type: application/octet-stream\r\n"
|
|
+ "Content-Length: " + testfile.fileSize + "\r\n\r\n";
|
|
var teststring2 = "--" + BOUNDARY + "--\r\n";
|
|
|
|
const BUFFERSIZE = 4096;
|
|
var correctOnProgress = false;
|
|
|
|
var listenerCallback = {
|
|
QueryInterface: function (iid) {
|
|
if (iid.equals(Ci.nsISupports) ||
|
|
iid.equals(Ci.nsIProgressEventSink))
|
|
return this;
|
|
throw Cr.NS_ERROR_NO_INTERFACE;
|
|
},
|
|
|
|
getInterface: function (iid) {
|
|
if (iid.equals(Ci.nsIProgressEventSink))
|
|
return this;
|
|
throw Cr.NS_ERROR_NO_INTERFACE;
|
|
},
|
|
|
|
onProgress: function (request, context, progress, progressMax) {
|
|
// this works because the response is 0 bytes and does not trigger onprogress
|
|
if (progress === progressMax) {
|
|
correctOnProgress = true;
|
|
}
|
|
},
|
|
|
|
onStatus: function (request, context, status, statusArg) { },
|
|
};
|
|
|
|
function run_test() {
|
|
var sstream1 = Cc["@mozilla.org/io/string-input-stream;1"].
|
|
createInstance(Ci.nsIStringInputStream);
|
|
sstream1.data = teststring1;
|
|
|
|
var fstream = Cc["@mozilla.org/network/file-input-stream;1"].
|
|
createInstance(Ci.nsIFileInputStream);
|
|
fstream.init(testfile, -1, -1, 0);
|
|
|
|
var buffered = Cc["@mozilla.org/network/buffered-input-stream;1"].
|
|
createInstance(Ci.nsIBufferedInputStream);
|
|
buffered.init(fstream, BUFFERSIZE);
|
|
|
|
var sstream2 = Cc["@mozilla.org/io/string-input-stream;1"].
|
|
createInstance(Ci.nsIStringInputStream);
|
|
sstream2.data = teststring2;
|
|
|
|
var multi = Cc["@mozilla.org/io/multiplex-input-stream;1"].
|
|
createInstance(Ci.nsIMultiplexInputStream);
|
|
multi.appendStream(sstream1);
|
|
multi.appendStream(buffered);
|
|
multi.appendStream(sstream2);
|
|
|
|
var mime = Cc["@mozilla.org/network/mime-input-stream;1"].
|
|
createInstance(Ci.nsIMIMEInputStream);
|
|
mime.addHeader("Content-Type", "multipart/form-data; boundary="+BOUNDARY);
|
|
mime.setData(multi);
|
|
mime.addContentLength = true;
|
|
|
|
httpserver.registerPathHandler(testpath, serverHandler);
|
|
httpserver.start(-1);
|
|
|
|
var channel = setupChannel(testpath);
|
|
|
|
channel.QueryInterface(Ci.nsIUploadChannel)
|
|
.setUploadStream(mime, "", mime.available());
|
|
channel.requestMethod = "POST";
|
|
channel.notificationCallbacks = listenerCallback;
|
|
channel.asyncOpen2(new ChannelListener(checkRequest, channel));
|
|
do_test_pending();
|
|
}
|
|
|
|
function setupChannel(path) {
|
|
return NetUtil.newChannel({uri: URL + path, loadUsingSystemPrincipal: true})
|
|
.QueryInterface(Ci.nsIHttpChannel);
|
|
}
|
|
|
|
function serverHandler(metadata, response) {
|
|
do_check_eq(metadata.method, "POST");
|
|
|
|
var data = read_stream(metadata.bodyInputStream,
|
|
metadata.bodyInputStream.available());
|
|
|
|
var testfile_stream = Cc["@mozilla.org/network/file-input-stream;1"].
|
|
createInstance(Ci.nsIFileInputStream);
|
|
testfile_stream.init(testfile, -1, -1, 0);
|
|
|
|
do_check_eq(teststring1 +
|
|
read_stream(testfile_stream, testfile_stream.available()) +
|
|
teststring2,
|
|
data);
|
|
}
|
|
|
|
function checkRequest(request, data, context) {
|
|
do_check_true(correctOnProgress);
|
|
httpserver.stop(do_test_finished);
|
|
}
|