Merge pull request #3714 from kumpera/fix_process_stream_dispose
[mono.git] / mcs / class / System.Net.Http / System.Net.Http / HttpRequestMessage.cs
index fd4f7c0d080df3a25d395814dedbb6136f4e4ea0..0823365d74476ff243a965f357fc77203697beae 100644 (file)
 
 using System.Collections.Generic;
 using System.Net.Http.Headers;
+using System.Text;
 
 namespace System.Net.Http
 {
        public class HttpRequestMessage : IDisposable
        {
-               HttpContent content;
                HttpRequestHeaders headers;
                HttpMethod method;
                Version version;
@@ -48,7 +48,7 @@ namespace System.Net.Http
                }
 
                public HttpRequestMessage (HttpMethod method, string requestUri)
-                       : this (method, string.IsNullOrEmpty (requestUri) ? (Uri) null : new Uri (requestUri))
+                       : this (method, string.IsNullOrEmpty (requestUri) ? (Uri) null : new Uri (requestUri, System.UriKind.RelativeOrAbsolute))
                {
                }
 
@@ -58,14 +58,7 @@ namespace System.Net.Http
                        RequestUri = requestUri;
                }
 
-               public HttpContent Content {
-                       get {
-                               return content;
-                       }
-                       set {
-                               content = value;
-                       }
-               }
+               public HttpContent Content { get; set; }
 
                public HttpRequestHeaders Headers {
                        get {
@@ -96,13 +89,25 @@ namespace System.Net.Http
                                return uri;
                        }
                        set {
-                               if (value != null && (value.Scheme != Uri.UriSchemeHttp && value.Scheme != Uri.UriSchemeHttps))
+                               if (value != null && value.IsAbsoluteUri && !IsAllowedAbsoluteUri (value))
                                        throw new ArgumentException ("Only http or https scheme is allowed");
 
                                uri = value;
                        }
                }
 
+               static bool IsAllowedAbsoluteUri (Uri uri)
+               {
+                       if (uri.Scheme == Uri.UriSchemeHttp || uri.Scheme == Uri.UriSchemeHttps)
+                               return true;
+
+                       // Mono URI handling which does not distinguish between file and url absolute paths without scheme
+                       if (uri.Scheme == Uri.UriSchemeFile && uri.OriginalString.StartsWith ("/", StringComparison.Ordinal))
+                               return true;
+
+                       return false;
+               }
+
                public Version Version {
                        get {
                                return version ?? HttpVersion.Version11;
@@ -138,5 +143,20 @@ namespace System.Net.Http
                        is_used = true;
                        return false;
                }
+               
+               public override string ToString ()
+               {
+                       var sb = new StringBuilder ();
+                       sb.Append ("Method: ").Append (method);
+                       sb.Append (", RequestUri: '").Append (RequestUri != null ? RequestUri.ToString () : "<null>");
+                       sb.Append ("', Version: ").Append (Version);
+                       sb.Append (", Content: ").Append (Content != null ? Content.ToString () : "<null>");
+                       sb.Append (", Headers:\r\n{\r\n").Append (Headers);
+                       if (Content != null)
+                               sb.Append (Content.Headers);
+                       sb.Append ("}");
+                       
+                       return sb.ToString ();
+               }
        }
 }