UploadFile+PUT does not wrap the file in a multipart envelope
authorGonzalo Paniagua Javier <gonzalo.mono@gmail.com>
Thu, 19 Jan 2012 17:23:24 +0000 (12:23 -0500)
committerGonzalo Paniagua Javier <gonzalo.mono@gmail.com>
Thu, 19 Jan 2012 17:23:24 +0000 (12:23 -0500)
When using PUT as the method to upload a file using WebClient, the file
is uploaded as-is, without the multipart boundaries, headers,...
Fixes bug #2970.

mcs/class/System/System.Net/WebClient.cs

index e4bf63257b8bbb51cbca481a4ae886083ad24332..941ac13d3fed54a35a345f04116c217539beebd4 100644 (file)
@@ -529,8 +529,12 @@ namespace System.Net
                                fileCType = "application/octet-stream";
                        }
 
-                       string boundary = "------------" + DateTime.Now.Ticks.ToString ("x");
-                       Headers ["Content-Type"] = String.Format ("multipart/form-data; boundary={0}", boundary);
+                       bool needs_boundary = (method != "PUT"); // only verified case so far
+                       string boundary = null;
+                       if (needs_boundary) {
+                               boundary = "------------" + DateTime.Now.Ticks.ToString ("x");
+                               Headers ["Content-Type"] = String.Format ("multipart/form-data; boundary={0}", boundary);
+                       }
                        Stream reqStream = null;
                        Stream fStream = null;
                        byte [] resultBytes = null;
@@ -542,33 +546,38 @@ namespace System.Net
                                fStream = File.OpenRead (fileName);
                                request = SetupRequest (address, method, true);
                                reqStream = request.GetRequestStream ();
-                               byte [] bytes_boundary = Encoding.ASCII.GetBytes (boundary);
-                               reqStream.WriteByte ((byte) '-');
-                               reqStream.WriteByte ((byte) '-');
-                               reqStream.Write (bytes_boundary, 0, bytes_boundary.Length);
-                               reqStream.WriteByte ((byte) '\r');
-                               reqStream.WriteByte ((byte) '\n');
-                               string partHeaders = String.Format ("Content-Disposition: form-data; " +
-                                                                   "name=\"file\"; filename=\"{0}\"\r\n" +
-                                                                   "Content-Type: {1}\r\n\r\n",
-                                                                   Path.GetFileName (fileName), fileCType);
-
-                               byte [] partHeadersBytes = Encoding.UTF8.GetBytes (partHeaders);
-                               reqStream.Write (partHeadersBytes, 0, partHeadersBytes.Length);
+                               byte [] bytes_boundary = null;
+                               if (needs_boundary) {
+                                       bytes_boundary = Encoding.ASCII.GetBytes (boundary);
+                                       reqStream.WriteByte ((byte) '-');
+                                       reqStream.WriteByte ((byte) '-');
+                                       reqStream.Write (bytes_boundary, 0, bytes_boundary.Length);
+                                       reqStream.WriteByte ((byte) '\r');
+                                       reqStream.WriteByte ((byte) '\n');
+                                       string partHeaders = String.Format ("Content-Disposition: form-data; " +
+                                                                           "name=\"file\"; filename=\"{0}\"\r\n" +
+                                                                           "Content-Type: {1}\r\n\r\n",
+                                                                           Path.GetFileName (fileName), fileCType);
+
+                                       byte [] partHeadersBytes = Encoding.UTF8.GetBytes (partHeaders);
+                                       reqStream.Write (partHeadersBytes, 0, partHeadersBytes.Length);
+                               }
                                int nread;
                                byte [] buffer = new byte [4096];
                                while ((nread = fStream.Read (buffer, 0, 4096)) != 0)
                                        reqStream.Write (buffer, 0, nread);
 
-                               reqStream.WriteByte ((byte) '\r');
-                               reqStream.WriteByte ((byte) '\n');
-                               reqStream.WriteByte ((byte) '-');
-                               reqStream.WriteByte ((byte) '-');
-                               reqStream.Write (bytes_boundary, 0, bytes_boundary.Length);
-                               reqStream.WriteByte ((byte) '-');
-                               reqStream.WriteByte ((byte) '-');
-                               reqStream.WriteByte ((byte) '\r');
-                               reqStream.WriteByte ((byte) '\n');
+                               if (needs_boundary) {
+                                       reqStream.WriteByte ((byte) '\r');
+                                       reqStream.WriteByte ((byte) '\n');
+                                       reqStream.WriteByte ((byte) '-');
+                                       reqStream.WriteByte ((byte) '-');
+                                       reqStream.Write (bytes_boundary, 0, bytes_boundary.Length);
+                                       reqStream.WriteByte ((byte) '-');
+                                       reqStream.WriteByte ((byte) '-');
+                                       reqStream.WriteByte ((byte) '\r');
+                                       reqStream.WriteByte ((byte) '\n');
+                               }
                                reqStream.Close ();
                                reqStream = null;
                                resultBytes = ReadAll (request, userToken);