summaryrefslogtreecommitdiffstats
path: root/netwerk/test/unit/test_post.js
blob: edb68f6e43c4553472a42c20f7666650f93bad05 (plain)
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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
//
// POST test
//

"use strict";

const { HttpServer } = ChromeUtils.import("resource://testing-common/httpd.js");

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: ChromeUtils.generateQI(["nsIProgressEventSink"]),

  getInterface(iid) {
    if (iid.equals(Ci.nsIProgressEventSink)) {
      return this;
    }
    throw Components.Exception("", Cr.NS_ERROR_NO_INTERFACE);
  },

  onProgress(request, progress, progressMax) {
    // this works because the response is 0 bytes and does not trigger onprogress
    if (progress === progressMax) {
      correctOnProgress = true;
    }
  },

  onStatus(request, 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);

  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.asyncOpen(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) {
  Assert.equal(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);

  Assert.equal(
    teststring1 +
      read_stream(testfile_stream, testfile_stream.available()) +
      teststring2,
    data
  );
}

function checkRequest(request, data, context) {
  Assert.ok(correctOnProgress);
  httpserver.stop(do_test_finished);
}