UploadFile+PUT does not wrap the file in a multipart envelope
[mono.git] / mcs / class / System / System.Net / WebClient.cs
index 0eaa5911b1a07d5a8ec0cf3e1b991e4ec34e57a7..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);
@@ -890,7 +899,7 @@ namespace System.Net
                        if (nolength)
                                ms = new MemoryStream ();
 
-//                     long total = 0;
+                       long total = 0;
                        int nread = 0;
                        int offset = 0;
                        byte [] buffer = new byte [size];
@@ -902,8 +911,8 @@ namespace System.Net
                                        size -= nread;
                                }
                                if (async){
-//                                     total += nread;
-                                       OnDownloadProgressChanged (new DownloadProgressChangedEventArgs (nread, length, userToken));
+                                       total += nread;
+                                       OnDownloadProgressChanged (new DownloadProgressChangedEventArgs (total, length, userToken));
                                }
                        }