Merging with backout.
authorJohnny Stenback <jst@mozilla.com>
Mon, 31 Aug 2009 14:58:01 -0700
changeset 32115 a8e7a19257ab75f2ea3c5f06b90dbdb88ce508d9
parent 32113 105d89f1a33bd83bf4d5c935773c7a0afd269113 (current diff)
parent 32114 5260e85b49fc4ba350d53d93f3e310ad462b11aa (diff)
child 32117 8af8fbde08807a1bdffb9f05d57d096e55b8f307
push id8853
push userjst@mozilla.com
push dateMon, 31 Aug 2009 21:58:20 +0000
treeherderautoland@a8e7a19257ab [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
milestone1.9.3a1pre
Merging with backout.
content/base/public/nsIDOMFileInternal.idl
netwerk/base/public/nsIUploadChannel2.idl
--- a/content/base/public/Makefile.in
+++ b/content/base/public/Makefile.in
@@ -88,17 +88,16 @@ SDK_XPIDLSRCS   = \
 		nsISelection.idl  \
 		$(NULL)
 
 XPIDLSRCS	= \
 		nsIChromeRegistry.idl       \
 		nsIContentPolicy.idl        \
 		nsIDocumentEncoder.idl      \
 		nsIDOMFile.idl \
-		nsIDOMFileInternal.idl \
 		nsIDOMFileList.idl \
 		nsIDOMFileException.idl \
 		nsIDOMParser.idl \
 		nsIDOMSerializer.idl \
 		nsISelection2.idl \
 		nsISelectionController.idl  \
 		nsISelectionDisplay.idl  \
 		nsISelectionListener.idl  \
--- a/content/base/public/nsDOMFile.h
+++ b/content/base/public/nsDOMFile.h
@@ -36,35 +36,32 @@
  *
  * ***** END LICENSE BLOCK ***** */
 
 #ifndef nsDOMFile_h__
 #define nsDOMFile_h__
 
 #include "nsICharsetDetectionObserver.h"
 #include "nsIDOMFile.h"
-#include "nsIDOMFileInternal.h"
 #include "nsIDOMFileList.h"
 #include "nsIInputStream.h"
 #include "nsCOMArray.h"
 #include "nsCOMPtr.h"
 #include "nsString.h"
 
 class nsIDOMDocument;
 class nsIFile;
 class nsIInputStream;
 
 class nsDOMFile : public nsIDOMFile,
-                  public nsIDOMFileInternal,
                   public nsICharsetDetectionObserver
 {
 public:
   NS_DECL_ISUPPORTS
   NS_DECL_NSIDOMFILE
-  NS_DECL_NSIDOMFILEINTERNAL
 
   nsDOMFile(nsIFile *aFile)
     : mFile(aFile)
   {}
   ~nsDOMFile() {}
 
   // from nsICharsetDetectionObserver
   NS_IMETHOD Notify(const char *aCharset, nsDetectionConfident aConf);
deleted file mode 100644
--- a/content/base/public/nsIDOMFileInternal.idl
+++ /dev/null
@@ -1,46 +0,0 @@
-/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is mozilla.org code.
- *
- * The Initial Developer of the Original Code is
- * Mozilla Corporation
- * Portions created by the Initial Developer are Copyright (C) 2007
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-#include "domstubs.idl"
-
-interface nsIFile;
-
-[scriptable, uuid(047CA6C4-52B3-46F1-8976-E198B724F72F)]
-interface nsIDOMFileInternal : nsISupports
-{
-  attribute nsIFile internalFile;
-};
--- a/content/base/src/nsDOMFile.cpp
+++ b/content/base/src/nsDOMFile.cpp
@@ -63,17 +63,16 @@
 #include "plbase64.h"
 #include "prmem.h"
 
 // nsDOMFile implementation
 
 NS_INTERFACE_MAP_BEGIN(nsDOMFile)
   NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIDOMFile)
   NS_INTERFACE_MAP_ENTRY(nsIDOMFile)
-  NS_INTERFACE_MAP_ENTRY(nsIDOMFileInternal)
   NS_INTERFACE_MAP_ENTRY(nsICharsetDetectionObserver)
   NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(File)
 NS_INTERFACE_MAP_END
 
 NS_IMPL_ADDREF(nsDOMFile)
 NS_IMPL_RELEASE(nsDOMFile)
 
 static nsresult
@@ -143,30 +142,16 @@ nsDOMFile::GetAsText(const nsAString &aC
 
   rv = alias->GetPreferred(charsetGuess, charset);
   NS_ENSURE_SUCCESS(rv, rv);
 
   return ConvertStream(stream, charset.get(), aResult);
 }
 
 NS_IMETHODIMP
-nsDOMFile::GetInternalFile(nsIFile **aFile)
-{
-  NS_IF_ADDREF(*aFile = mFile);
-  return NS_OK;
-}
-
-NS_IMETHODIMP
-nsDOMFile::SetInternalFile(nsIFile *aFile)
-{
-  mFile = aFile;
-  return NS_OK;
-}
-
-NS_IMETHODIMP
 nsDOMFile::GetAsDataURL(nsAString &aResult)
 {
   aResult.AssignLiteral("data:");
 
   nsresult rv;
   nsCOMPtr<nsIMIMEService> mimeService =
     do_GetService(NS_MIMESERVICE_CONTRACTID, &rv);
   NS_ENSURE_SUCCESS(rv, rv);
--- a/content/base/src/nsXMLHttpRequest.cpp
+++ b/content/base/src/nsXMLHttpRequest.cpp
@@ -40,39 +40,34 @@
 #include "nsIXPConnect.h"
 #include "nsICharsetConverterManager.h"
 #include "nsLayoutCID.h"
 #include "nsXPIDLString.h"
 #include "nsReadableUtils.h"
 #include "nsIURI.h"
 #include "nsILoadGroup.h"
 #include "nsNetUtil.h"
-#include "nsStreamUtils.h"
 #include "nsThreadUtils.h"
 #include "nsIUploadChannel.h"
-#include "nsIUploadChannel2.h"
 #include "nsIDOMSerializer.h"
 #include "nsXPCOM.h"
 #include "nsISupportsPrimitives.h"
 #include "nsGUIEvent.h"
 #include "nsIPrivateDOMEvent.h"
 #include "prprf.h"
 #include "nsIDOMEventListener.h"
 #include "nsIJSContextStack.h"
 #include "nsJSEnvironment.h"
 #include "nsIScriptSecurityManager.h"
 #include "nsWeakPtr.h"
 #include "nsICharsetAlias.h"
 #include "nsIScriptGlobalObject.h"
 #include "nsIDOMClassInfo.h"
 #include "nsIDOMElement.h"
-#include "nsIDOMFileInternal.h"
 #include "nsIDOMWindow.h"
-#include "nsIMIMEService.h"
-#include "nsCExternalHandlerService.h"
 #include "nsIVariant.h"
 #include "nsVariant.h"
 #include "nsIParser.h"
 #include "nsLoadListenerProxy.h"
 #include "nsStringStream.h"
 #include "nsIStreamConverterService.h"
 #include "nsICachingChannel.h"
 #include "nsContentUtils.h"
@@ -2358,47 +2353,16 @@ nsXMLHttpRequest::Send(nsIVariant *aBody
             wstr->GetData(serial);
           } else {
             // stream?
             nsCOMPtr<nsIInputStream> stream(do_QueryInterface(supports));
             if (stream) {
               postDataStream = stream;
               charset.Truncate();
             }
-            else {
-              // nsIDOMFile?
-              nsCOMPtr<nsIDOMFileInternal> file(do_QueryInterface(supports));
-
-              if (file) {
-                nsCOMPtr<nsIFile> internalFile;
-                rv = file->GetInternalFile(getter_AddRefs(internalFile));
-                NS_ENSURE_SUCCESS(rv, rv);
-
-                nsCOMPtr<nsIInputStream> stream;
-                rv = NS_NewLocalFileInputStream(getter_AddRefs(stream), internalFile); 
-                NS_ENSURE_SUCCESS(rv, rv);
-
-                // Feed local file input stream into our upload channel
-                if (stream) {
-                  postDataStream = stream;
-                  charset.Truncate();
-                  defaultContentType.Truncate();
-
-                  nsCOMPtr<nsIMIMEService> mimeService =
-                      do_GetService(NS_MIMESERVICE_CONTRACTID, &rv);
-                  NS_ENSURE_SUCCESS(rv, rv);
-
-                  nsCAutoString mediaType;
-                  rv = mimeService->GetTypeFromFile(internalFile, mediaType);
-                  if (NS_SUCCEEDED(rv)) {
-                    defaultContentType = mediaType;
-                  }
-                }
-              }
-            }
           }
         }
       }
       break;
     case nsIDataType::VTYPE_VOID:
     case nsIDataType::VTYPE_EMPTY:
       // Makes us act as if !aBody, don't upload anything
       break;
@@ -2419,17 +2383,17 @@ nsXMLHttpRequest::Send(nsIVariant *aBody
       NS_ENSURE_SUCCESS(rv, rv);
 
       rv = converter->ConvertToInputStream(serial,
                                            getter_AddRefs(postDataStream));
       NS_ENSURE_SUCCESS(rv, rv);
     }
 
     if (postDataStream) {
-      nsCOMPtr<nsIUploadChannel2> uploadChannel(do_QueryInterface(httpChannel));
+      nsCOMPtr<nsIUploadChannel> uploadChannel(do_QueryInterface(httpChannel));
       NS_ASSERTION(uploadChannel, "http must support nsIUploadChannel");
 
       // If no content type header was set by the client, we set it to
       // application/xml.
       nsCAutoString contentType;
       if (NS_FAILED(httpChannel->
                       GetRequestHeader(NS_LITERAL_CSTRING("Content-Type"),
                                        contentType)) ||
@@ -2458,36 +2422,25 @@ nsXMLHttpRequest::Send(nsIVariant *aBody
             nsCAutoString newCharset("; charset=");
             newCharset.Append(charset);
             contentType.Replace(charsetStart, charsetEnd - charsetStart,
                                 newCharset);
           }
         }
       }
 
-      // If necessary, wrap the stream in a buffered stream so as to guarantee
-      // support for our upload when calling ExplicitSetUploadStream.
-      if (!NS_InputStreamIsBuffered(postDataStream)) {
-        nsCOMPtr<nsIInputStream> bufferedStream;
-        rv = NS_NewBufferedInputStream(getter_AddRefs(bufferedStream),
-                                       postDataStream, 
-                                       4096);
-        NS_ENSURE_SUCCESS(rv, rv);
-
-        postDataStream = bufferedStream;
-      }
-
       mUploadComplete = PR_FALSE;
       PRUint32 uploadTotal = 0;
       postDataStream->Available(&uploadTotal);
       mUploadTotal = uploadTotal;
-
-      // We want to use a newer version of the upload channel that won't
-      // ignore the necessary headers for an empty Content-Type.
-      rv = uploadChannel->ExplicitSetUploadStream(postDataStream, contentType, -1, method, PR_FALSE);
+      rv = uploadChannel->SetUploadStream(postDataStream, contentType, -1);
+      // Reset the method to its original value
+      if (httpChannel) {
+        httpChannel->SetRequestMethod(method);
+      }
     }
   }
 
   // Reset responseBody
   mResponseBody.Truncate();
 
   // Reset responseXML
   mResponseXML = nsnull;
--- a/content/base/test/file_XHRSendData.sjs
+++ b/content/base/test/file_XHRSendData.sjs
@@ -13,18 +13,10 @@ function handleRequest(request, response
 
   var body = new BinaryInputStream(request.bodyInputStream);
   var avail;
   var bytes = [];
   while ((avail = body.available()) > 0)
     Array.prototype.push.apply(bytes, body.readByteArray(avail));
 
   var data = String.fromCharCode.apply(null, bytes);
-  response.setHeader("Result-Content-Length", "" + data.length);
-  if (data.indexOf("TEST_REDIRECT_STR") >= 0) {
-    var newURL = "http://" + data.split("&url=")[1];
-    response.setStatusLine(null, 307, "redirect");
-    response.setHeader("Location", newURL, false);
-  }
-  else {
-    response.write(data);
-  }
-}
+  response.write(data);
+}
\ No newline at end of file
--- a/content/base/test/test_XHRSendData.html
+++ b/content/base/test/test_XHRSendData.html
@@ -8,17 +8,16 @@ https://bugzilla.mozilla.org/show_bug.cg
   <script type="text/javascript" src="/MochiKit/packed.js"></script>
   <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>        
   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
 </head>
 <body>
 <a target="_blank"
    href="https://bugzilla.mozilla.org/show_bug.cgi?id=464848">Mozilla Bug 464848</a>
 <p id="display">
-  <input id="fileList" type="file"></input>
 </p>
 <div id="content" style="display: none">
   
 </div>
 <pre id="test">
 <script class="testbody" type="application/javascript;version=1.8">
 
 xhr = new XMLHttpRequest();
@@ -28,42 +27,16 @@ testDoc1 = xhr.responseXML;
 is(testDoc1.inputEncoding, "ISO-8859-1", "wrong encoding");
 
 testDoc2 = document.implementation.createDocument("", "", null);
 testDoc2.appendChild(testDoc2.createComment(" doc 2 "));
 testDoc2.appendChild(testDoc2.createElement("res"));
 testDoc2.documentElement.appendChild(testDoc2.createTextNode("text"));
 is(testDoc2.inputEncoding, null, "wrong encoding");
 
-netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
-
-var testData = "blahblahblahblahblahblahblaaaaaaaah. blah.";
-testFileTxt = createFileWithDataExt(testData, ".txt");
-testFilePng = createFileWithDataExt(testData, ".png");
-testFileJpg = createFileWithDataExt(testData, ".jpg");
-testFileGif = createFileWithDataExt(testData, ".gif");
-testFilePdf = createFileWithDataExt(testData, ".pdf");
-testFileXml = createFileWithDataExt(testData, ".xml");
-testFileUnknown = createFileWithDataExt(testData, "noext");
-
-function createFileWithDataExt(fileData, extension) {
-  var dirSvc = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties);
-  var testFile = dirSvc.get("ProfD", Components.interfaces.nsIFile);
-  testFile.append("testfile" + extension);
-  var outStream = Components.classes["@mozilla.org/network/file-output-stream;1"].createInstance(Components.interfaces.nsIFileOutputStream);
-  outStream.init(testFile, 0x02 | 0x08 | 0x20, 0666, 0);
-  outStream.write(fileData, fileData.length);
-  outStream.close();
-
-  var fileList = document.getElementById('fileList');
-  fileList.value = testFile.path;
-
-  return fileList.files[0];
-}
-
 tests = [{ body: null,
            resBody: "",
          },
          { body: undefined,
            resBody: "",
          },
          { body: "hi",
            resBody: "hi",
@@ -131,112 +104,37 @@ tests = [{ body: null,
            resBody: "<!-- doc 2 -->\n<res>text</res>",
            resContentType: "foo/bar; charset=UTF-8; baz=bin",
          },
          { body: testDoc2,
            contentType: "foo/bar; charset=uTf-8",
            resBody: "<!-- doc 2 -->\n<res>text</res>",
            resContentType: "foo/bar; charset=uTf-8",
          },
-         { body: testFileTxt,
-           resBody: testData,
-           resContentType: testFileTxt.mediaType,
-           resContentLength: testData.length,
-         },
-         { body: testFilePng,
-           resBody: testData,
-           resContentType: testFilePng.mediaType,
-           resContentLength: testData.length,
-         },
-         { body: testFileJpg,
-           resBody: testData,
-           resContentType: testFileJpg.mediaType,
-           resContentLength: testData.length,
-         },
-         { body: testFileGif,
-           resBody: testData,
-           resContentType: testFileGif.mediaType,
-           resContentLength: testData.length,
-         },
-         { body: testFilePdf,
-           resBody: testData,
-           resContentType: testFilePdf.mediaType,
-           resContentLength: testData.length,
-         },
-         { body: testFileXml,
-           resBody: testData,
-           resContentType: testFileXml.mediaType,
-           resContentLength: testData.length,
-         },
-         { body: testFileUnknown,
-           resBody: testData,
-           resContentType: "",
-           resContentLength: testData.length,
-         },
-         { //will trigger a redirect test server-side
-           body: ("TEST_REDIRECT_STR&url=" + window.location.host + window.location.pathname),
-           redirect: true,
-         },
          ];
 
-try {
-  for each(test in tests) {
-    xhr = new XMLHttpRequest;
-    xhr.open("POST", "file_XHRSendData.sjs", false);
-    if (test.contentType)
-      xhr.setRequestHeader("Content-Type", test.contentType);
-    xhr.send(test.body);
-
-    if (test.resContentType) {
-      is(xhr.getResponseHeader("Result-Content-Type"), test.resContentType,
-         "Wrong Content-Type sent");
-    }
-    else {
-      is(xhr.getResponseHeader("Result-Content-Type"), null);
-    }
+for each(test in tests) {
+  xhr = new XMLHttpRequest;
+  xhr.open("POST", "file_XHRSendData.sjs", false);
+  if (test.contentType)
+    xhr.setRequestHeader("Content-Type", test.contentType);
+  xhr.send(test.body);
 
-    if (test.resContentLength) {
-      is(xhr.getResponseHeader("Result-Content-Length"), test.resContentLength, "Wrong Content-Length sent");
-    }
+  if (test.resContentType) {
+    is(xhr.getResponseHeader("Result-Content-Type"), test.resContentType,
+       "Wrong Content-Type sent");
+  }
+  else {
+    is(xhr.getResponseHeader("Result-Content-Type"), null);
+  }
 
-    if (test.body instanceof Document) {
-      is(xhr.responseText.replace("\r\n", "\n"), test.resBody, "Wrong body");
-    }
-    else if (!test.redirect) {
-      is(xhr.responseText, test.resBody, "Wrong body");
-    }
-    else {
-      // If we're testing redirect, determine whether the body is
-      // this document by looking for the relevant bug url
-      is(xhr.responseText.indexOf("https://bugzilla.mozilla.org/show_bug.cgi?id=464848") >= 0, true,
-                                  "Wrong page for redirect");
-    }
+  if (test.body instanceof Document) {
+    is(xhr.responseText.replace("\r\n", "\n"), test.resBody, "Wrong body");
+  }
+  else {
+    is(xhr.responseText, test.resBody, "Wrong body");
   }
 }
-finally {
-  cleanUpData();
-}
-
-function cleanUpData() {
-  removeFileWithExt(".txt");
-  removeFileWithExt(".png");
-  removeFileWithExt(".jpg");
-  removeFileWithExt(".gif");
-  removeFileWithExt(".pdf");
-  removeFileWithExt(".xml");
-  removeFileWithExt("noext");
-}
-
-function removeFileWithExt(extension)
-{
-    netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");    
-    var dirSvc = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties);
-    var testFile = dirSvc.get("ProfD", Components.interfaces.nsIFile);
-
-    testFile.append("testfile" + extension);
-    testFile.remove(false);
-}
-
 
 </script>
 </pre>
 </body>
 </html>
--- a/netwerk/base/public/Makefile.in
+++ b/netwerk/base/public/Makefile.in
@@ -106,17 +106,16 @@ XPIDLSRCS	= \
 		nsISecurityInfoProvider.idl \
 		nsIStreamListenerTee.idl \
 		nsISimpleStreamListener.idl \
 		nsIStreamTransportService.idl \
 		nsIStreamLoader.idl \
 		nsISyncStreamListener.idl \
 		nsISystemProxySettings.idl \
 		nsIUnicharStreamLoader.idl \
-		nsIUploadChannel2.idl \
 		nsIStandardURL.idl \
 		nsINestedURI.idl \
 		nsIURLParser.idl \
 		nsIURIChecker.idl \
 		nsISecurityEventSink.idl \
 		nsISecretDecoderRing.idl \
 		nsISecureBrowserUI.idl \
 		nsICryptoFIPSInfo.idl \
deleted file mode 100644
--- a/netwerk/base/public/nsIUploadChannel2.idl
+++ /dev/null
@@ -1,73 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is mozilla.org code.
- *
- * The Initial Developer of the Original Code is
- * Netscape Communications Corporation.
- * Portions created by the Initial Developer are Copyright (C) 1998
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-#include "nsISupports.idl"
-
-interface nsIInputStream;
-
-[scriptable, uuid(8821E259-7252-4464-B874-A55D8EF6B222)]
-interface nsIUploadChannel2 : nsISupports
-{
-    /**
-     * Sets a stream to be uploaded by this channel with the specified
-     * Content-Type and Content-Length header values.
-     *
-     * Most implementations of this interface require that the stream:
-     *   (1) implement threadsafe addRef and release
-     *   (2) implement nsIInputStream::readSegments
-     *   (3) implement nsISeekableStream::seek
-     *
-     * @param aStream
-     *        The stream to be uploaded by this channel.
-     * @param aContentType
-     *        This value will replace any existing Content-Type
-     *        header on the HTTP request, regardless of whether
-     *        or not its empty.
-     * @param aContentLength
-     *        A value of -1 indicates that the length of the stream should be
-     *        determined by calling the stream's |available| method.
-     * @param aMethod
-     *        The HTTP request method to set on the stream.
-     * @param aStreamHasHeaders
-     *        True if the stream already contains headers for the HTTP request.
-     */
-    void explicitSetUploadStream(in nsIInputStream aStream,
-                                 in ACString aContentType,
-                                 in long long aContentLength,
-                                 in ACString aMethod,
-                                 in boolean aStreamHasHeaders);
-};
--- a/netwerk/protocol/http/src/nsHttpChannel.cpp
+++ b/netwerk/protocol/http/src/nsHttpChannel.cpp
@@ -2766,36 +2766,38 @@ nsHttpChannel::SetupReplacementChannel(n
     newChannel->SetNotificationCallbacks(mCallbacks);
     newChannel->SetLoadFlags(newLoadFlags);
 
     nsCOMPtr<nsIHttpChannel> httpChannel = do_QueryInterface(newChannel);
     if (!httpChannel)
         return NS_OK; // no other options to set
 
     if (preserveMethod) {
-        nsCOMPtr<nsIUploadChannel2> uploadChannel = do_QueryInterface(httpChannel);
+        nsCOMPtr<nsIUploadChannel> uploadChannel = do_QueryInterface(httpChannel);
         if (mUploadStream && uploadChannel) {
             // rewind upload stream
             nsCOMPtr<nsISeekableStream> seekable = do_QueryInterface(mUploadStream);
             if (seekable)
                 seekable->Seek(nsISeekableStream::NS_SEEK_SET, 0);
 
             // replicate original call to SetUploadStream...
-            const char *ctype = mRequestHead.PeekHeader(nsHttp::Content_Type);
-            if (!ctype)
-              ctype = "";
-            const char *clen  = mRequestHead.PeekHeader(nsHttp::Content_Length);
-            if (clen)
-                uploadChannel->ExplicitSetUploadStream(
-                    mUploadStream,
-                    nsDependentCString(ctype),
-                    nsCRT::atoll(clen),
-                    nsDependentCString(mRequestHead.Method()),
-                    mUploadStreamHasHeaders);
+            if (mUploadStreamHasHeaders)
+                uploadChannel->SetUploadStream(mUploadStream, EmptyCString(), -1);
+            else {
+                const char *ctype = mRequestHead.PeekHeader(nsHttp::Content_Type);
+                const char *clen  = mRequestHead.PeekHeader(nsHttp::Content_Length);
+                if (ctype && clen)
+                    uploadChannel->SetUploadStream(mUploadStream,
+                                                   nsDependentCString(ctype),
+                                                   atoi(clen));
+            }
         }
+        // must happen after setting upload stream since SetUploadStream
+        // may change the request method.
+        httpChannel->SetRequestMethod(nsDependentCString(mRequestHead.Method()));
     }
     // convey the referrer if one was used for this channel to the next one
     if (mReferrer)
         httpChannel->SetReferrer(mReferrer);
     // convey the mAllowPipelining flag
     httpChannel->SetAllowPipelining(mAllowPipelining);
     // convey the new redirection limit
     httpChannel->SetRedirectionLimit(mRedirectionLimit - 1);
@@ -4071,17 +4073,16 @@ NS_IMPL_RELEASE_INHERITED(nsHttpChannel,
 NS_INTERFACE_MAP_BEGIN(nsHttpChannel)
     NS_INTERFACE_MAP_ENTRY(nsIRequest)
     NS_INTERFACE_MAP_ENTRY(nsIChannel)
     NS_INTERFACE_MAP_ENTRY(nsIRequestObserver)
     NS_INTERFACE_MAP_ENTRY(nsIStreamListener)
     NS_INTERFACE_MAP_ENTRY(nsIHttpChannel)
     NS_INTERFACE_MAP_ENTRY(nsICachingChannel)
     NS_INTERFACE_MAP_ENTRY(nsIUploadChannel)
-    NS_INTERFACE_MAP_ENTRY(nsIUploadChannel2)
     NS_INTERFACE_MAP_ENTRY(nsICacheListener)
     NS_INTERFACE_MAP_ENTRY(nsIEncodedChannel)
     NS_INTERFACE_MAP_ENTRY(nsIHttpChannelInternal)
     NS_INTERFACE_MAP_ENTRY(nsIResumableChannel)
     NS_INTERFACE_MAP_ENTRY(nsITransportEventSink)
     NS_INTERFACE_MAP_ENTRY(nsISupportsPriority)
     NS_INTERFACE_MAP_ENTRY(nsIProtocolProxyCallback)
     NS_INTERFACE_MAP_ENTRY(nsIProxiedChannel)
@@ -4679,19 +4680,17 @@ nsHttpChannel::GetUploadStream(nsIInputS
 {
     NS_ENSURE_ARG_POINTER(stream);
     *stream = mUploadStream;
     NS_IF_ADDREF(*stream);
     return NS_OK;
 }
 
 NS_IMETHODIMP
-nsHttpChannel::SetUploadStream(nsIInputStream *stream,
-                               const nsACString &contentType,
-                               PRInt32 contentLength)
+nsHttpChannel::SetUploadStream(nsIInputStream *stream, const nsACString &contentType, PRInt32 contentLength)
 {
     // NOTE: for backwards compatibility and for compatibility with old style
     // plugins, |stream| may include headers, specifically Content-Type and
     // Content-Length headers.  in this case, |contentType| and |contentLength|
     // would be unspecified.  this is traditionally the case of a POST request,
     // and so we select POST as the request method if contentType and
     // contentLength are unspecified.
     
@@ -4699,18 +4698,17 @@ nsHttpChannel::SetUploadStream(nsIInputS
         if (!contentType.IsEmpty()) {
             if (contentLength < 0) {
                 stream->Available((PRUint32 *) &contentLength);
                 if (contentLength < 0) {
                     NS_ERROR("unable to determine content length");
                     return NS_ERROR_FAILURE;
                 }
             }
-            mRequestHead.SetHeader(nsHttp::Content_Length,
-                                   nsPrintfCString("%d", contentLength));
+            mRequestHead.SetHeader(nsHttp::Content_Length, nsPrintfCString("%d", contentLength));
             mRequestHead.SetHeader(nsHttp::Content_Type, contentType);
             mUploadStreamHasHeaders = PR_FALSE;
             mRequestHead.SetMethod(nsHttp::Put); // PUT request
         }
         else {
             mUploadStreamHasHeaders = PR_TRUE;
             mRequestHead.SetMethod(nsHttp::Post); // POST request
         }
@@ -4719,47 +4717,16 @@ nsHttpChannel::SetUploadStream(nsIInputS
         mUploadStreamHasHeaders = PR_FALSE;
         mRequestHead.SetMethod(nsHttp::Get); // revert to GET request
     }
     mUploadStream = stream;
     return NS_OK;
 }
 
 NS_IMETHODIMP
-nsHttpChannel::ExplicitSetUploadStream(nsIInputStream *aStream,
-                                       const nsACString &aContentType,
-                                       PRInt64 aContentLength,
-                                       const nsACString &aMethod,
-                                       PRBool aStreamHasHeaders)
-{
-    // Ensure stream is set and method is valid 
-    NS_ENSURE_TRUE(aStream, NS_ERROR_FAILURE);
-
-    if (aContentLength < 0) {
-        PRUint32 streamLength;
-        aStream->Available(&streamLength);
-        aContentLength = streamLength;
-        if (aContentLength < 0) {
-            NS_ERROR("unable to determine content length");
-            return NS_ERROR_FAILURE;
-        }
-    }
-
-    nsresult rv = SetRequestMethod(aMethod);
-    NS_ENSURE_SUCCESS(rv, rv);
-
-    mRequestHead.SetHeader(nsHttp::Content_Length, nsPrintfCString("%lld", aContentLength));
-    mRequestHead.SetHeader(nsHttp::Content_Type, aContentType);
-
-    mUploadStreamHasHeaders = aStreamHasHeaders;
-    mUploadStream = aStream;
-    return NS_OK;
-}
-
-NS_IMETHODIMP
 nsHttpChannel::GetResponseStatus(PRUint32 *value)
 {
     NS_ENSURE_ARG_POINTER(value);
     if (!mResponseHead)
         return NS_ERROR_NOT_AVAILABLE;
     *value = mResponseHead->Status();
     return NS_OK;
 }
--- a/netwerk/protocol/http/src/nsHttpChannel.h
+++ b/netwerk/protocol/http/src/nsHttpChannel.h
@@ -69,17 +69,16 @@
 #include "nsICacheSession.h"
 #include "nsICacheEntryDescriptor.h"
 #include "nsICacheListener.h"
 #include "nsIApplicationCache.h"
 #include "nsIApplicationCacheChannel.h"
 #include "nsIEncodedChannel.h"
 #include "nsITransport.h"
 #include "nsIUploadChannel.h"
-#include "nsIUploadChannel2.h"
 #include "nsIStringEnumerator.h"
 #include "nsIOutputStream.h"
 #include "nsIAsyncInputStream.h"
 #include "nsIPrompt.h"
 #include "nsIResumableChannel.h"
 #include "nsISupportsPriority.h"
 #include "nsIProtocolProxyCallback.h"
 #include "nsICancelable.h"
@@ -97,17 +96,16 @@ class nsProxyInfo;
 //-----------------------------------------------------------------------------
 
 class nsHttpChannel : public nsHashPropertyBag
                     , public nsIHttpChannel
                     , public nsIHttpChannelInternal
                     , public nsIStreamListener
                     , public nsICachingChannel
                     , public nsIUploadChannel
-                    , public nsIUploadChannel2
                     , public nsICacheListener
                     , public nsIEncodedChannel
                     , public nsITransportEventSink
                     , public nsIResumableChannel
                     , public nsISupportsPriority
                     , public nsIProtocolProxyCallback
                     , public nsIProxiedChannel
                     , public nsITraceableChannel
@@ -118,17 +116,16 @@ public:
     NS_DECL_ISUPPORTS_INHERITED
     NS_DECL_NSIREQUEST
     NS_DECL_NSICHANNEL
     NS_DECL_NSIHTTPCHANNEL
     NS_DECL_NSIREQUESTOBSERVER
     NS_DECL_NSISTREAMLISTENER
     NS_DECL_NSICACHINGCHANNEL
     NS_DECL_NSIUPLOADCHANNEL
-    NS_DECL_NSIUPLOADCHANNEL2
     NS_DECL_NSICACHELISTENER
     NS_DECL_NSIENCODEDCHANNEL
     NS_DECL_NSIHTTPCHANNELINTERNAL
     NS_DECL_NSITRANSPORTEVENTSINK
     NS_DECL_NSIRESUMABLECHANNEL
     NS_DECL_NSISUPPORTSPRIORITY
     NS_DECL_NSIPROTOCOLPROXYCALLBACK
     NS_DECL_NSIPROXIEDCHANNEL