Merge remote-tracking branch 'local/msvc-updates' into msvc-updates
[mono.git] / mcs / class / System.Net.Http / System.Net.Http / HttpRequestMessage.cs
1 //
2 // HttpRequestMessage.cs
3 //
4 // Authors:
5 //      Marek Safar  <marek.safar@gmail.com>
6 //
7 // Copyright (C) 2011 Xamarin Inc (http://www.xamarin.com)
8 //
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
16 //
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
19 //
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 //
28
29 using System.Collections.Generic;
30 using System.Net.Http.Headers;
31
32 namespace System.Net.Http
33 {
34         public class HttpRequestMessage : IDisposable
35         {
36                 HttpContent content;
37                 HttpRequestHeaders headers;
38                 HttpMethod method;
39                 Version version;
40                 Dictionary<string, object> properties;
41                 Uri uri;
42                 bool is_used;
43                 bool disposed;
44
45                 public HttpRequestMessage ()
46                 {
47                         this.method = HttpMethod.Get;
48                 }
49
50                 public HttpRequestMessage (HttpMethod method, string requestUri)
51                         : this (method, string.IsNullOrEmpty (requestUri) ? (Uri) null : new Uri (requestUri))
52                 {
53                 }
54
55                 public HttpRequestMessage (HttpMethod method, Uri requestUri)
56                 {
57                         Method = method;
58                         RequestUri = requestUri;
59                 }
60
61                 public HttpContent Content {
62                         get {
63                                 return content;
64                         }
65                         set {
66                                 content = value;
67                         }
68                 }
69
70                 public HttpRequestHeaders Headers {
71                         get {
72                                 return headers ?? (headers = new HttpRequestHeaders ());
73                         }
74                 }
75
76                 public HttpMethod Method {
77                         get {
78                                 return method;
79                         }
80                         set {
81                                 if (value == null)
82                                         throw new ArgumentNullException ("method");
83
84                                 method = value;
85                         }
86                 }
87
88                 public IDictionary<string, object> Properties {
89                         get {
90                                 return properties ?? (properties = new Dictionary<string, object> ());
91                         }
92                 }
93
94                 public Uri RequestUri {
95                         get {
96                                 return uri;
97                         }
98                         set {
99                                 if (value != null && (value.Scheme != Uri.UriSchemeHttp && value.Scheme != Uri.UriSchemeHttps))
100                                         throw new ArgumentException ("Only http or https scheme is allowed");
101
102                                 uri = value;
103                         }
104                 }
105
106                 public Version Version {
107                         get {
108                                 return version ?? HttpVersion.Version11;
109                         }
110                         set {
111                                 if (value == null)
112                                         throw new ArgumentNullException ("Version");
113
114                                 version = value;
115                         }
116                 }
117
118                 public void Dispose ()
119                 {
120                         Dispose (true);
121                 }
122
123                 protected virtual void Dispose (bool disposing)
124                 {
125                         if (disposing && !disposed) {
126                                 disposed = true;
127
128                                 if (Content != null)
129                                         Content.Dispose ();
130                         }
131                 }
132
133                 internal bool SetIsUsed ()
134                 {
135                         if (is_used)
136                                 return true;
137
138                         is_used = true;
139                         return false;
140                 }
141         }
142 }