Bug 803713 - Skip the SP after finding it. r=biesi
authorMasatoshi Kimura <VYV03354@nifty.ne.jp>
Thu, 20 Dec 2012 21:47:40 +0900
changeset 122196 7a025808ca170b9dc107e6543d203f3fc668216d
parent 122195 7d7600c0d5d0dd9ac4c366f041f8b4b053c41a98
child 122197 23da80538e24a7d0a351c3ef2ca042fc1468f2be
push idunknown
push userunknown
push dateunknown
reviewersbiesi
bugs803713
milestone20.0a1
Bug 803713 - Skip the SP after finding it. r=biesi
netwerk/streamconv/converters/nsMultiMixedConv.cpp
netwerk/test/unit/test_multipart_byteranges.js
netwerk/test/unit/xpcshell.ini
--- a/netwerk/streamconv/converters/nsMultiMixedConv.cpp
+++ b/netwerk/streamconv/converters/nsMultiMixedConv.cpp
@@ -982,20 +982,23 @@ nsMultiMixedConv::ParseHeaders(nsIChanne
                 char* tmpPtr;
 
                 tmpPtr = (char *) strchr(colon + 1, '/');
                 if (tmpPtr) 
                     *tmpPtr = '\0';
 
                 // pass the bytes-unit and the SP
                 char *range = (char *) strchr(colon + 2, ' ');
-
                 if (!range)
                     return NS_ERROR_FAILURE;
 
+                do {
+                    range++;
+                } while (*range == ' ');
+
                 if (range[0] == '*'){
                     mByteRangeStart = mByteRangeEnd = 0;
                 }
                 else {
                     tmpPtr = (char *) strchr(range, '-');
                     if (!tmpPtr)
                         return NS_ERROR_FAILURE;
                     
new file mode 100644
--- /dev/null
+++ b/netwerk/test/unit/test_multipart_byteranges.js
@@ -0,0 +1,122 @@
+const Cc = Components.classes;
+const Ci = Components.interfaces;
+const Cu = Components.utils;
+const Cr = Components.results;
+
+Cu.import("resource://testing-common/httpd.js");
+
+var httpserver = null;
+var uri = "http://localhost:4444/multipart";
+
+function make_channel(url) {
+  var ios = Cc["@mozilla.org/network/io-service;1"].
+            getService(Ci.nsIIOService);
+  return ios.newChannel(url, "", null);
+}
+
+var multipartBody = "--boundary\r\n"+
+"Content-type: text/plain\r\n"+
+"Content-range: bytes 0-2/10\r\n"+
+"\r\n"+
+"aaa\r\n"+
+"--boundary\r\n"+
+"Content-type: text/plain\r\n"+
+"Content-range: bytes 3-7/10\r\n"+
+"\r\n"+
+"bbbbb"+
+"\r\n"+
+"--boundary\r\n"+
+"Content-type: text/plain\r\n"+
+"Content-range: bytes  8-9/10\r\n"+
+"\r\n"+
+"cc"+
+"\r\n"+
+"--boundary--";
+
+function make_channel(url) {
+  var ios = Cc["@mozilla.org/network/io-service;1"].
+            getService(Ci.nsIIOService);
+  return ios.newChannel(url, "", null);
+}
+
+function contentHandler(metadata, response)
+{
+  response.setHeader("Content-Type", 'multipart/byteranges; boundary="boundary"');
+  response.bodyOutputStream.write(multipartBody, multipartBody.length);
+}
+
+var numTests = 2;
+var testNum = 0;
+
+var testData =
+  [
+   { data: "aaa", type: "text/plain", isByteRangeRequest: true, startRange: 0, endRange: 2 },
+   { data: "bbbbb", type: "text/plain", isByteRangeRequest: true, startRange: 3, endRange: 7 },
+   { data: "cc", type: "text/plain", isByteRangeRequest: true, startRange: 8, endRange: 9 }
+  ];
+
+function responseHandler(request, buffer)
+{
+    do_check_eq(buffer, testData[testNum].data);
+    do_check_eq(request.QueryInterface(Ci.nsIChannel).contentType,
+		testData[testNum].type);
+    do_check_eq(request.QueryInterface(Ci.nsIByteRangeRequest).isByteRangeRequest,
+		testData[testNum].isByteRangeRequest);
+    do_check_eq(request.QueryInterface(Ci.nsIByteRangeRequest).startRange,
+		testData[testNum].startRange);
+    do_check_eq(request.QueryInterface(Ci.nsIByteRangeRequest).endRange,
+		testData[testNum].endRange);
+    if (++testNum == numTests)
+	httpserver.stop(do_test_finished);
+}
+
+var multipartListener = {
+  _buffer: "",
+
+  QueryInterface: function(iid) {
+    if (iid.equals(Components.interfaces.nsIStreamListener) ||
+        iid.equals(Components.interfaces.nsIRequestObserver) ||
+        iid.equals(Components.interfaces.nsISupports))
+      return this;
+    throw Components.results.NS_ERROR_NO_INTERFACE;
+  },
+
+  onStartRequest: function(request, context) {
+    this._buffer = "";
+  },
+
+  onDataAvailable: function(request, context, stream, offset, count) {
+    try {
+      this._buffer = this._buffer.concat(read_stream(stream, count));
+      dump("BUFFEEE: " + this._buffer + "\n\n");
+    } catch (ex) {
+      do_throw("Error in onDataAvailable: " + ex);
+    }
+  },
+
+  onStopRequest: function(request, context, status) {
+    try {
+      responseHandler(request, this._buffer);
+    } catch (ex) {
+      do_throw("Error in closure function: " + ex);
+    }
+  }
+};
+
+function run_test()
+{
+  httpserver = new HttpServer();
+  httpserver.registerPathHandler("/multipart", contentHandler);
+  httpserver.start(4444);
+
+  var streamConv = Cc["@mozilla.org/streamConverters;1"]
+                     .getService(Ci.nsIStreamConverterService);
+  var conv = streamConv.asyncConvertData("multipart/byteranges",
+					 "*/*",
+					 multipartListener,
+					 null);
+
+  var chan = make_channel(uri);
+  chan.asyncOpen(conv, null);
+  do_test_pending();
+}
--- a/netwerk/test/unit/xpcshell.ini
+++ b/netwerk/test/unit/xpcshell.ini
@@ -143,16 +143,17 @@ skip-if = os == "android"
 [test_httpcancel.js]
 [test_httpsuspend.js]
 [test_idnservice.js]
 [test_invalidport.js]
 [test_localstreams.js]
 [test_mismatch_last-modified.js]
 [test_MIME_params.js]
 [test_mozTXTToHTMLConv.js]
+[test_multipart_byteranges.js]
 [test_multipart_streamconv.js]
 [test_multipart_streamconv_missing_lead_boundary.js]
 [test_nestedabout_serialize.js]
 [test_net_addr.js]
 # Bug 732363: test fails on windows for unknown reasons.
 skip-if = os == "win"
 [test_nojsredir.js]
 [test_offline_status.js]