michael@0: // michael@0: // POST test michael@0: // michael@0: michael@0: Cu.import("resource://testing-common/httpd.js"); michael@0: michael@0: XPCOMUtils.defineLazyGetter(this, "URL", function() { michael@0: return "http://localhost:" + httpserver.identity.primaryPort; michael@0: }); michael@0: michael@0: var httpserver = new HttpServer(); michael@0: var testpath = "/simple"; michael@0: michael@0: var testfile = do_get_file("../unit/data/test_readline6.txt"); michael@0: michael@0: const BOUNDARY = "AaB03x"; michael@0: var teststring1 = "--" + BOUNDARY + "\r\n" michael@0: + "Content-Disposition: form-data; name=\"body\"\r\n\r\n" michael@0: + "0123456789\r\n" michael@0: + "--" + BOUNDARY + "\r\n" michael@0: + "Content-Disposition: form-data; name=\"files\"; filename=\"" + testfile.leafName + "\"\r\n" michael@0: + "Content-Type: application/octet-stream\r\n" michael@0: + "Content-Length: " + testfile.fileSize + "\r\n\r\n"; michael@0: var teststring2 = "--" + BOUNDARY + "--\r\n"; michael@0: michael@0: const BUFFERSIZE = 4096; michael@0: michael@0: function run_test() { michael@0: var sstream1 = Cc["@mozilla.org/io/string-input-stream;1"]. michael@0: createInstance(Ci.nsIStringInputStream); michael@0: sstream1.data = teststring1; michael@0: michael@0: var fstream = Cc["@mozilla.org/network/file-input-stream;1"]. michael@0: createInstance(Ci.nsIFileInputStream); michael@0: fstream.init(testfile, -1, -1, 0); michael@0: michael@0: var buffered = Cc["@mozilla.org/network/buffered-input-stream;1"]. michael@0: createInstance(Ci.nsIBufferedInputStream); michael@0: buffered.init(fstream, BUFFERSIZE); michael@0: michael@0: var sstream2 = Cc["@mozilla.org/io/string-input-stream;1"]. michael@0: createInstance(Ci.nsIStringInputStream); michael@0: sstream2.data = teststring2; michael@0: michael@0: var multi = Cc["@mozilla.org/io/multiplex-input-stream;1"]. michael@0: createInstance(Ci.nsIMultiplexInputStream); michael@0: multi.appendStream(sstream1); michael@0: multi.appendStream(buffered); michael@0: multi.appendStream(sstream2); michael@0: michael@0: var mime = Cc["@mozilla.org/network/mime-input-stream;1"]. michael@0: createInstance(Ci.nsIMIMEInputStream); michael@0: mime.addHeader("Content-Type", "multipart/form-data; boundary="+BOUNDARY); michael@0: mime.setData(multi); michael@0: mime.addContentLength = true; michael@0: michael@0: httpserver.registerPathHandler(testpath, serverHandler); michael@0: httpserver.start(-1); michael@0: michael@0: var channel = setupChannel(testpath); michael@0: michael@0: channel.QueryInterface(Ci.nsIUploadChannel) michael@0: .setUploadStream(mime, "", mime.available()); michael@0: channel.requestMethod = "POST"; michael@0: michael@0: channel.asyncOpen(new ChannelListener(checkRequest, channel), null); michael@0: michael@0: do_test_pending(); michael@0: } michael@0: michael@0: function setupChannel(path) { michael@0: var ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService); michael@0: return chan = ios.newChannel(URL + path, "", null) michael@0: .QueryInterface(Ci.nsIHttpChannel); michael@0: } michael@0: michael@0: function serverHandler(metadata, response) { michael@0: do_check_eq(metadata.method, "POST"); michael@0: michael@0: var data = read_stream(metadata.bodyInputStream, michael@0: metadata.bodyInputStream.available()); michael@0: michael@0: var testfile_stream = Cc["@mozilla.org/network/file-input-stream;1"]. michael@0: createInstance(Ci.nsIFileInputStream); michael@0: testfile_stream.init(testfile, -1, -1, 0); michael@0: michael@0: do_check_eq(teststring1 + michael@0: read_stream(testfile_stream, testfile_stream.available()) + michael@0: teststring2, michael@0: data); michael@0: } michael@0: michael@0: function checkRequest(request, data, context) { michael@0: httpserver.stop(do_test_finished); michael@0: }