Bug 1305162: Part 1b - Properly serialize nsIMIMEInputStream in RemoteWebNavigation. r=dragana draft
authorKris Maglione <maglione.k@gmail.com>
Fri, 09 Dec 2016 17:35:33 -1000
changeset 458714 7b32b3e6d774f5272cacc9382cd0d17531d1a5eb
parent 458713 9a9e316b52c2659c638fcda7558382ae0e6f0b05
child 458715 c639b044f833122f70a6492dba95a2e95652a231
push id41026
push usermaglione.k@gmail.com
push dateTue, 10 Jan 2017 22:29:18 +0000
reviewersdragana
bugs1305162
milestone53.0a1
Bug 1305162: Part 1b - Properly serialize nsIMIMEInputStream in RemoteWebNavigation. r=dragana MozReview-Commit-ID: 6PePVAEL1Px
toolkit/components/remotebrowserutils/RemoteWebNavigation.js
toolkit/content/browser-child.js
--- a/toolkit/components/remotebrowserutils/RemoteWebNavigation.js
+++ b/toolkit/components/remotebrowserutils/RemoteWebNavigation.js
@@ -12,19 +12,30 @@ XPCOMUtils.defineLazyModuleGetter(this, 
 XPCOMUtils.defineLazyModuleGetter(this, "NetUtil",
   "resource://gre/modules/NetUtil.jsm");
 
 function makeURI(url)
 {
   return Services.io.newURI(url, null, null);
 }
 
-function readInputStreamToString(aStream)
+function serializeInputStream(aStream)
 {
-  return NetUtil.readInputStreamToString(aStream, aStream.available());
+  let data = {
+    content: NetUtil.readInputStreamToString(aStream, aStream.available()),
+  };
+
+  if (aStream instanceof Ci.nsIMIMEInputStream) {
+    data.headers = new Map();
+    aStream.visitHeaders((name, value) => {
+      data.headers.set(name, value);
+    });
+  }
+
+  return data;
 }
 
 function RemoteWebNavigation()
 {
   this.wrappedJSObject = this;
 }
 
 RemoteWebNavigation.prototype = {
@@ -77,18 +88,18 @@ RemoteWebNavigation.prototype = {
   },
   loadURIWithOptions: function(aURI, aLoadFlags, aReferrer, aReferrerPolicy,
                                aPostData, aHeaders, aBaseURI) {
     this._sendMessage("WebNavigation:LoadURI", {
       uri: aURI,
       flags: aLoadFlags,
       referrer: aReferrer ? aReferrer.spec : null,
       referrerPolicy: aReferrerPolicy,
-      postData: aPostData ? readInputStreamToString(aPostData) : null,
-      headers: aHeaders ? readInputStreamToString(aHeaders) : null,
+      postData: aPostData ? serializeInputStream(aPostData) : null,
+      headers: aHeaders ? serializeInputStream(aHeaders) : null,
       baseURI: aBaseURI ? aBaseURI.spec : null,
     });
   },
   setOriginAttributesBeforeLoading: function(aOriginAttributes) {
     this._sendMessage("WebNavigation:SetOriginAttributes", {
       originAttributes: aOriginAttributes,
     });
   },
--- a/toolkit/content/browser-child.js
+++ b/toolkit/content/browser-child.js
@@ -18,20 +18,32 @@ XPCOMUtils.defineLazyModuleGetter(this, 
   "resource://gre/modules/PageThumbUtils.jsm");
 
 if (AppConstants.MOZ_CRASHREPORTER) {
   XPCOMUtils.defineLazyServiceGetter(this, "CrashReporter",
                                      "@mozilla.org/xre/app-info;1",
                                      "nsICrashReporter");
 }
 
-function makeInputStream(aString) {
+function makeInputStream(data) {
   let stream = Cc["@mozilla.org/io/string-input-stream;1"].
                createInstance(Ci.nsISupportsCString);
-  stream.data = aString;
+  stream.data = data.content;
+
+  if (data.headers) {
+    let mimeStream = Cc["@mozilla.org/network/mime-input-stream;1"]
+        .createInstance(Ci.nsIMIMEInputStream);
+
+    mimeStream.setData(stream);
+    for (let [name, value] of data.headers) {
+      mimeStream.addHeader(name, value);
+    }
+    return mimeStream;
+  }
+
   return stream; // XPConnect will QI this to nsIInputStream for us.
 }
 
 var WebProgressListener = {
   init: function() {
     this._filter = Cc["@mozilla.org/appshell/component/browser-status-filter;1"]
                      .createInstance(Ci.nsIWebProgress);
     this._filter.addProgressListener(this, Ci.nsIWebProgress.NOTIFY_ALL);