1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
//
// 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);
}
|