|
1 // |
|
2 // POST test |
|
3 // |
|
4 |
|
5 Cu.import("resource://testing-common/httpd.js"); |
|
6 |
|
7 XPCOMUtils.defineLazyGetter(this, "URL", function() { |
|
8 return "http://localhost:" + httpserver.identity.primaryPort; |
|
9 }); |
|
10 |
|
11 var httpserver = new HttpServer(); |
|
12 var testpath = "/simple"; |
|
13 |
|
14 var testfile = do_get_file("../unit/data/test_readline6.txt"); |
|
15 |
|
16 const BOUNDARY = "AaB03x"; |
|
17 var teststring1 = "--" + BOUNDARY + "\r\n" |
|
18 + "Content-Disposition: form-data; name=\"body\"\r\n\r\n" |
|
19 + "0123456789\r\n" |
|
20 + "--" + BOUNDARY + "\r\n" |
|
21 + "Content-Disposition: form-data; name=\"files\"; filename=\"" + testfile.leafName + "\"\r\n" |
|
22 + "Content-Type: application/octet-stream\r\n" |
|
23 + "Content-Length: " + testfile.fileSize + "\r\n\r\n"; |
|
24 var teststring2 = "--" + BOUNDARY + "--\r\n"; |
|
25 |
|
26 const BUFFERSIZE = 4096; |
|
27 |
|
28 function run_test() { |
|
29 var sstream1 = Cc["@mozilla.org/io/string-input-stream;1"]. |
|
30 createInstance(Ci.nsIStringInputStream); |
|
31 sstream1.data = teststring1; |
|
32 |
|
33 var fstream = Cc["@mozilla.org/network/file-input-stream;1"]. |
|
34 createInstance(Ci.nsIFileInputStream); |
|
35 fstream.init(testfile, -1, -1, 0); |
|
36 |
|
37 var buffered = Cc["@mozilla.org/network/buffered-input-stream;1"]. |
|
38 createInstance(Ci.nsIBufferedInputStream); |
|
39 buffered.init(fstream, BUFFERSIZE); |
|
40 |
|
41 var sstream2 = Cc["@mozilla.org/io/string-input-stream;1"]. |
|
42 createInstance(Ci.nsIStringInputStream); |
|
43 sstream2.data = teststring2; |
|
44 |
|
45 var multi = Cc["@mozilla.org/io/multiplex-input-stream;1"]. |
|
46 createInstance(Ci.nsIMultiplexInputStream); |
|
47 multi.appendStream(sstream1); |
|
48 multi.appendStream(buffered); |
|
49 multi.appendStream(sstream2); |
|
50 |
|
51 var mime = Cc["@mozilla.org/network/mime-input-stream;1"]. |
|
52 createInstance(Ci.nsIMIMEInputStream); |
|
53 mime.addHeader("Content-Type", "multipart/form-data; boundary="+BOUNDARY); |
|
54 mime.setData(multi); |
|
55 mime.addContentLength = true; |
|
56 |
|
57 httpserver.registerPathHandler(testpath, serverHandler); |
|
58 httpserver.start(-1); |
|
59 |
|
60 var channel = setupChannel(testpath); |
|
61 |
|
62 channel.QueryInterface(Ci.nsIUploadChannel) |
|
63 .setUploadStream(mime, "", mime.available()); |
|
64 channel.requestMethod = "POST"; |
|
65 |
|
66 channel.asyncOpen(new ChannelListener(checkRequest, channel), null); |
|
67 |
|
68 do_test_pending(); |
|
69 } |
|
70 |
|
71 function setupChannel(path) { |
|
72 var ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService); |
|
73 return chan = ios.newChannel(URL + path, "", null) |
|
74 .QueryInterface(Ci.nsIHttpChannel); |
|
75 } |
|
76 |
|
77 function serverHandler(metadata, response) { |
|
78 do_check_eq(metadata.method, "POST"); |
|
79 |
|
80 var data = read_stream(metadata.bodyInputStream, |
|
81 metadata.bodyInputStream.available()); |
|
82 |
|
83 var testfile_stream = Cc["@mozilla.org/network/file-input-stream;1"]. |
|
84 createInstance(Ci.nsIFileInputStream); |
|
85 testfile_stream.init(testfile, -1, -1, 0); |
|
86 |
|
87 do_check_eq(teststring1 + |
|
88 read_stream(testfile_stream, testfile_stream.available()) + |
|
89 teststring2, |
|
90 data); |
|
91 } |
|
92 |
|
93 function checkRequest(request, data, context) { |
|
94 httpserver.stop(do_test_finished); |
|
95 } |