{\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
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
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
}\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
// 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
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