Removed Consoles and ^Ms
[mono.git] / mcs / class / System / System.Net / WebClient.cs
index a6605ceeb7aac4f05b77499ab8dc55fa26890cc2..ca424855e3ffefb5c669487e150c12b6e65d8bd1 100644 (file)
@@ -35,10 +35,10 @@ namespace System.Net
                {\r
                        hexBytes = new byte [16];\r
                        int index = 0;\r
-                       for (int i = '0'; i < '9'; i++, index++)\r
+                       for (int i = '0'; i <= '9'; i++, index++)\r
                                hexBytes [index] = (byte) i;\r
 \r
-                       for (int i = 'A'; i < 'F'; i++, index++)\r
+                       for (int i = 'A'; i <= 'F'; i++, index++)\r
                                hexBytes [index] = (byte) i;\r
                }\r
                \r
@@ -169,10 +169,63 @@ namespace System.Net
                        return UploadFile (address, "POST", fileName);\r
                }\r
                \r
-               [MonoTODO]\r
-               public byte[] UploadFile (string address, string method, string fileName)\r
+               public byte [] UploadFile (string address, string method, string fileName)\r
                {\r
-                       throw new NotImplementedException ();\r
+                       string fileCType = Headers ["Content-Type"];\r
+                       if (fileCType != null) {\r
+                               string lower = fileCType.ToLower ();\r
+                               if (lower.StartsWith ("multipart/"))\r
+                                       throw new WebException ("Content-Type cannot be set to a multipart" +\r
+                                                               " type for this request.");\r
+                       } else {\r
+                               fileCType = "application/octet-stream";\r
+                       }\r
+\r
+                       string boundary = "------------" + DateTime.Now.Ticks.ToString ("x");\r
+                       Headers ["Content-Type"] = String.Format ("multipart/form-data; boundary={0}", boundary);\r
+                       WebRequest request = SetupRequest (address, method);\r
+                       Stream reqStream = null;\r
+                       Stream fStream = null;\r
+                       byte [] resultBytes = null;\r
+\r
+                       try {\r
+                               fStream = File.OpenRead (fileName);\r
+                               reqStream = request.GetRequestStream ();\r
+                               byte [] realBoundary = Encoding.ASCII.GetBytes ("--" + boundary + "\r\n");\r
+                               reqStream.Write (realBoundary, 0, realBoundary.Length);\r
+                               string partHeaders = String.Format ("Content-Disposition: form-data; " +\r
+                                                                   "name=\"file\"; filename=\"{0}\"\r\n" +\r
+                                                                   "Content-Type: {1}\r\n\r\n",\r
+                                                                   Path.GetFileName (fileName), fileCType);\r
+\r
+                               byte [] partHeadersBytes = Encoding.UTF8.GetBytes (partHeaders);\r
+                               reqStream.Write (partHeadersBytes, 0, partHeadersBytes.Length);\r
+                               int nread;\r
+                               byte [] buffer = new byte [4096];\r
+                               while ((nread = fStream.Read (buffer, 0, 4096)) != 0)\r
+                                       reqStream.Write (buffer, 0, nread);\r
+\r
+                               reqStream.WriteByte ((byte) '\r');\r
+                               reqStream.WriteByte ((byte) '\n');\r
+                               reqStream.Write (realBoundary, 0, realBoundary.Length);\r
+                               reqStream.Close ();\r
+                               reqStream = null;\r
+                               WebResponse response = request.GetResponse ();\r
+                               Stream st = ProcessResponse (response);\r
+                               resultBytes = ReadAll (st, (int) response.ContentLength);\r
+                       } catch (WebException) {\r
+                               throw;\r
+                       } catch (Exception e) {\r
+                               throw new WebException ("Error uploading file.", e);\r
+                       } finally {\r
+                               if (fStream != null)\r
+                                       fStream.Close ();\r
+\r
+                               if (reqStream != null)\r
+                                       reqStream.Close ();\r
+                       }\r
+                       \r
+                       return resultBytes;     \r
                }\r
                \r
                public byte[] UploadValues (string address, NameValueCollection data)\r
@@ -229,7 +282,7 @@ namespace System.Net
                                StringBuilder sb = new StringBuilder ();\r
                                sb.Append ('?');\r
                                foreach (string key in queryString)\r
-                                       sb.AppendFormat ("{0}={1}&", key, queryString [key]);\r
+                                       sb.AppendFormat ("{0}={1}&", key, UrlEncode (queryString [key]));\r
 \r
                                if (sb.Length != 0) {\r
                                        sb.Length--; // remove trailing '&'\r
@@ -238,16 +291,27 @@ namespace System.Net
                        }\r
                        \r
 \r
-                       if (baseAddress == null && query == null)\r
-                               return new Uri (path);\r
+                       if (baseAddress == null && query == null) {\r
+                               try {\r
+                                       return new Uri (path);\r
+                               }\r
+                               catch (System.UriFormatException) {\r
+                                       if ((path[0] == Path.DirectorySeparatorChar) || (path[1] == ':' && Char.ToLower(path[0]) > 'a' && Char.ToLower(path[0]) < 'z')) {\r
+                                               return new Uri ("file://" + path);\r
+                                       }\r
+                                       else {\r
+                                               return new Uri ("file://" + Environment.CurrentDirectory + Path.DirectorySeparatorChar + path);\r
+                                       }\r
+                               }\r
+                       }\r
 \r
                        if (baseAddress == null)\r
-                               return new Uri (path + query);\r
+                               return new Uri (path + query, (query != null));\r
 \r
                        if (query == null)\r
                                return new Uri (baseAddress, path);\r
 \r
-                       return new Uri (baseAddress, path + query);\r
+                       return new Uri (baseAddress, path + query, (query != null));\r
                }\r
                \r
                WebRequest SetupRequest (string address)\r
@@ -260,43 +324,37 @@ namespace System.Net
                        // What do we do with other requests differnt from HttpWebRequest?\r
                        if (headers != null && headers.Count != 0 && (request is HttpWebRequest)) {\r
                                HttpWebRequest req = (HttpWebRequest) request;\r
-                               string val = headers ["Expect"];\r
-                               if (val != null && val != "") {\r
-                                       req.Expect = val;\r
-                                       headers.RemoveInternal ("Expect");\r
-                               }\r
+                               string expect = headers ["Expect"];\r
+                               string contentType = headers ["Content-Type"];\r
+                               string accept = headers ["Accept"];\r
+                               string connection = headers ["Connection"];\r
+                               string userAgent = headers ["User-Agent"];\r
+                               string referer = headers ["Referer"];\r
+                               headers.RemoveInternal ("Expect");\r
+                               headers.RemoveInternal ("Content-Type");\r
+                               headers.RemoveInternal ("Accept");\r
+                               headers.RemoveInternal ("Connection");\r
+                               headers.RemoveInternal ("Referer");\r
+                               headers.RemoveInternal ("User-Agent");\r
+                               request.Headers = headers;\r
 \r
-                               val = headers ["Accept"];\r
-                               if (val != null && val != "") {\r
-                                       req.Accept = val;\r
-                                       headers.RemoveInternal ("Accept");\r
-                               }\r
+                               if (expect != null && expect != "")\r
+                                       req.Expect = expect;\r
 \r
-                               val = headers ["Content-Type"];\r
-                               if (val != null && val != "") {\r
-                                       req.ContentType = val;\r
-                                       headers.RemoveInternal ("Content-Type");\r
-                               }\r
+                               if (accept != null && accept != "")\r
+                                       req.Accept = accept;\r
 \r
-                               val = headers ["Connection"];\r
-                               if (val != null && val != "") {\r
-                                       req.Connection = val;\r
-                                       headers.RemoveInternal ("Connection");\r
-                               }\r
+                               if (contentType != null && contentType != "")\r
+                                       req.ContentType = contentType;\r
 \r
-                               val = headers ["User-Agent"];\r
-                               if (val != null && val != "") {\r
-                                       req.UserAgent = val;\r
-                                       headers.RemoveInternal ("User-Agent");\r
-                               }\r
+                               if (connection != null && connection != "")\r
+                                       req.Connection = connection;\r
 \r
-                               val = headers ["Referer"];\r
-                               if (val != null && val != "") {\r
-                                       req.Referer = val;\r
-                                       headers.RemoveInternal ("Referer");\r
-                               }\r
+                               if (userAgent != null && userAgent != "")\r
+                                       req.UserAgent = userAgent;\r
 \r
-                               request.Headers = headers;\r
+                               if (referer != null && referer != "")\r
+                                       req.Referer = referer;\r
                        }\r
 \r
                        responseHeaders = null;\r
@@ -350,6 +408,32 @@ namespace System.Net
                        return buffer;\r
                }\r
 \r
+               string UrlEncode (string str)\r
+               {\r
+                       StringBuilder result = new StringBuilder ();\r
+\r
+                       int len = str.Length;\r
+                       for (int i = 0; i < len; i++) {\r
+                               char c = str [i];\r
+                               if (c == ' ')\r
+                                       result.Append ('+');\r
+                               else if ((c < '0' && c != '-' && c != '.') ||\r
+                                        (c < 'A' && c > '9') ||\r
+                                        (c > 'Z' && c < 'a' && c != '_') ||\r
+                                        (c > 'z')) {\r
+                                       result.Append ('%');\r
+                                       int idx = ((int) c) >> 4;\r
+                                       result.Append ((char) hexBytes [idx]);\r
+                                       idx = ((int) c) & 0x0F;\r
+                                       result.Append ((char) hexBytes [idx]);\r
+                               } else {\r
+                                       result.Append (c);\r
+                               }\r
+                       }\r
+\r
+                       return result.ToString ();\r
+               }\r
+\r
                static void UrlEncodeAndWrite (Stream stream, byte [] bytes)\r
                {\r
                        if (bytes == null)\r