[System.Net] Add support for .pac proxy config scripts on mac
[mono.git] / mcs / class / System / System.Net / HttpProvider.jvm.cs
1 using System;\r
2 using System.Security.Cryptography.X509Certificates;\r
3 using System.IO;\r
4 \r
5 namespace System.Net\r
6 {\r
7         [Serializable]\r
8         internal abstract class HttpProvider\r
9         {\r
10                 #region Fields\r
11 \r
12                 protected static int _defaultMaxResponseHeadersLength;\r
13                 protected static int _defaultMaxRedirectsNum = 50;\r
14                 \r
15                 protected Uri _originalUri;\r
16                 protected WebHeaderCollection _headers;\r
17                 protected bool _allowAutoRedirect;\r
18                 protected bool _allowWriteStreamBuffering = true;\r
19                 protected X509CertificateCollection _certificates;\r
20                 protected string _connectionGroupName;\r
21                 protected HttpContinueDelegate _continueDelegate;\r
22                 protected CookieContainer _cookieContainer;\r
23                 protected ICredentials _credentials;\r
24                 protected bool _keepAlive = true;\r
25                 protected int _maxResponseHeadersLength = _defaultMaxResponseHeadersLength;\r
26                 protected int _maxAutoRedirections = _defaultMaxRedirectsNum;\r
27                 protected int _readWriteTimeout = 300000;\r
28                 protected string _mediaType = string.Empty;\r
29                 protected string _methodName = "GET";\r
30                 protected bool _pipelined = true;\r
31                 protected bool _preAuthenticate;\r
32                 protected Version _version = HttpVersion.Version11;\r
33                 protected IWebProxy _proxy;\r
34                 protected bool _sendChunked;\r
35                 protected ServicePoint _servicePoint;\r
36                 protected int _timeout = 100000;\r
37 \r
38                 protected bool _isAborted;\r
39                 protected long _contentLength = -1L;\r
40 \r
41                 \r
42                 \r
43 \r
44                 #endregion /* Fields */\r
45 \r
46                 #region Constructors and Factory Methods\r
47                 protected HttpProvider(Uri uri)\r
48                 {\r
49                         _originalUri = uri;\r
50                         _headers = new WebHeaderCollection(true);\r
51                         _allowAutoRedirect = true;\r
52                         _proxy = GlobalProxySelection.Select;\r
53                 }\r
54 \r
55                 public static HttpProvider GetHttpProvider(Uri uri)\r
56                 {\r
57                         return new VMWHttpProvider(uri);\r
58                 }\r
59 \r
60                 public static HttpProvider  GetHttpProvider(string provider, Uri uri)\r
61                 {\r
62                         Type type = Type.GetType(provider, true);\r
63                         if(type != null)\r
64                                 return GetHttpProvider(type, uri);\r
65                         //log it as an error\r
66                         return new VMWHttpProvider(uri);\r
67                 }\r
68 \r
69                 public static HttpProvider GetHttpProvider(Type provider, Uri uri)\r
70                 {\r
71                         try\r
72                         {\r
73                                 return (HttpProvider)Activator.CreateInstance(provider, \r
74                                         new object[]{uri});                     \r
75                         }\r
76                         catch\r
77                         {\r
78                                 //log it as an error\r
79                                 return new VMWHttpProvider(uri);\r
80                         }\r
81                 }\r
82 \r
83                 #endregion\r
84 \r
85                 #region Properties\r
86                 internal virtual WebHeaderCollection Headers\r
87                 {\r
88                         get{return _headers;}\r
89                         set\r
90                         {\r
91                                 if(IsRequestStarted ())\r
92                                         throw new InvalidOperationException("Connection already opened");\r
93                                 WebHeaderCollection newHeaders = new WebHeaderCollection (true);\r
94                                 int count = value.Count;\r
95                                 for (int i = 0; i < count; i++) \r
96                                         newHeaders.Add (value.GetKey (i), value.Get (i));\r
97 \r
98                                 _headers = newHeaders;\r
99                         }\r
100                 }\r
101 \r
102                 internal virtual bool AllowAutoRedirect\r
103                 {\r
104                         get{return _allowAutoRedirect;}\r
105                         set{_allowAutoRedirect = value;}\r
106                 }\r
107 \r
108                 internal virtual bool AllowWriteStreamBuffering\r
109                 {\r
110                         get{return _allowWriteStreamBuffering;}\r
111                         set{_allowWriteStreamBuffering = value;}\r
112                 }\r
113 \r
114                 internal virtual string ConnectionGroupName\r
115                 {\r
116                         get{return _connectionGroupName;}\r
117                         set{_connectionGroupName = value;}\r
118                 }\r
119 \r
120                 internal virtual HttpContinueDelegate ContinueDelegate\r
121                 {\r
122                         get{return _continueDelegate;}\r
123                         set{_continueDelegate = value;}\r
124                 }\r
125 \r
126                 internal virtual CookieContainer CookieContainer\r
127                 {\r
128                         get{return _cookieContainer;}\r
129                         set{_cookieContainer = value;}\r
130                 }\r
131 \r
132                 internal virtual ICredentials Credentials\r
133                 {\r
134                         get{return _credentials;}\r
135                         set{_credentials = value;}\r
136                 }\r
137                 internal static int DefaultMaxResponseHeadersLength\r
138                 {\r
139                         get{return _defaultMaxResponseHeadersLength;}\r
140                         set\r
141                         {\r
142                                 if (value < 0 && value != -1)\r
143                                         throw new ArgumentOutOfRangeException("Argument should be positive");\r
144                                 _defaultMaxResponseHeadersLength = value;\r
145                         }\r
146                 }\r
147 \r
148                 internal virtual bool KeepAlive\r
149                 {\r
150                         get{return _keepAlive;}\r
151                         set{_keepAlive = value;}\r
152                 }\r
153 \r
154                 internal virtual int MaxAutoRedirections\r
155                 {\r
156                         get{return _maxAutoRedirections;}\r
157                         set\r
158                         {\r
159                                 if (value <= 0)\r
160                                         throw new ArgumentException("Must be > 0", "value");\r
161                                 _maxAutoRedirections = value;\r
162                         }\r
163                 }\r
164 \r
165                 internal virtual int MaximumResponseHeadersLength\r
166                 {\r
167                         get{return _maxResponseHeadersLength;}\r
168                         set\r
169                         {\r
170                                 if (IsRequestStarted())\r
171                                 {\r
172                                         throw new InvalidOperationException("Request has been already submitted.");\r
173                                 }\r
174                                 if (value < 0 && value != -1)\r
175                                         throw new ArgumentOutOfRangeException("The argument must be positive or -1");\r
176                                 _maxResponseHeadersLength = value;\r
177                         }\r
178                 }\r
179                 \r
180                 internal virtual string MediaType\r
181                 {\r
182                         get{return _mediaType;}\r
183                         set{_mediaType = value;}\r
184                 }\r
185 \r
186                 internal virtual string MethodName\r
187                 {\r
188                         get{return _methodName;}\r
189                         set\r
190                         {\r
191                                 if (value == null || value.Trim () == "")\r
192                                         throw new ArgumentException ("not a valid method");\r
193 \r
194                                 _methodName = value;\r
195                         }\r
196                 }\r
197                 internal virtual bool Pipelined\r
198                 {\r
199                         get{return _pipelined;}\r
200                         set{_pipelined = value;}\r
201                 }\r
202 \r
203                 internal virtual bool PreAuthenticate \r
204                 { \r
205                         get { return _preAuthenticate; }\r
206                         set { _preAuthenticate = value; }\r
207                 }\r
208 \r
209                 internal virtual Version ProtocolVersion\r
210                 {\r
211                         get{return _version;}\r
212                         set\r
213                         {\r
214                                 if (value != HttpVersion.Version10 && value != HttpVersion.Version11)\r
215                                         throw new ArgumentException ("value");\r
216 \r
217                                 _version = value; \r
218                         }\r
219                 }\r
220                 internal virtual IWebProxy Proxy\r
221                 {\r
222                         get{return _proxy;}\r
223                         set\r
224                         {\r
225                                 if(IsRequestStarted())\r
226                                         throw new InvalidOperationException("Request already has been submitted");\r
227                                 if(value == null)\r
228                                         throw new ArgumentNullException("value");\r
229                                 if(!(value is WebProxy))\r
230                                         throw new NotImplementedException("The supported proxy objects only of type System.Net.WebProxy");\r
231                                 _proxy = value;\r
232                         }\r
233                 }\r
234                 internal virtual int ReadWriteTimeout\r
235                 {\r
236                         get{return _readWriteTimeout;}\r
237                         set\r
238                         {\r
239                                 if (IsRequestStarted())\r
240                                         throw new InvalidOperationException("Request has been submitted.");\r
241 \r
242                                 if (value < 0 && value != -1)\r
243                                         throw new ArgumentOutOfRangeException("value");\r
244 \r
245                                 _readWriteTimeout = value;\r
246                         }\r
247                 }\r
248 \r
249                 internal virtual bool SendChunked\r
250                 {\r
251                         get{return _sendChunked;}\r
252                         set\r
253                         {\r
254                                 if(IsRequestStarted ())\r
255                                         throw new InvalidOperationException("Request has been submitted.");\r
256                                 _sendChunked = value;\r
257                         }\r
258                 }\r
259 \r
260                 internal virtual ServicePoint ServicePoint\r
261                 {\r
262                         get{return _servicePoint;}\r
263                 }\r
264 \r
265                 internal virtual int Timeout\r
266                 {\r
267                         get{return _timeout;}\r
268                         set\r
269                         {\r
270                                 if (value < -1)\r
271                                         throw new ArgumentOutOfRangeException ("value");\r
272 \r
273                                 _timeout = value;\r
274                         }\r
275                 }\r
276 \r
277                 internal virtual long ContentLength\r
278                 {\r
279                         get{return _contentLength;}\r
280                         set\r
281                         {\r
282                                 if(value < 0)\r
283                                         throw new ArgumentOutOfRangeException("value", "The Content-Length property value must be positive");\r
284                                 _contentLength = value;\r
285                         }\r
286                 }\r
287 \r
288 \r
289 \r
290                 #endregion\r
291 \r
292                 #region Methods\r
293 \r
294                 public virtual Uri GetOriginalAddress()\r
295                 {\r
296                         return _originalUri;\r
297                 }\r
298 \r
299                 public virtual X509CertificateCollection GetX509Certificates()\r
300                 {\r
301                         if(_certificates == null)\r
302                                 _certificates = new X509CertificateCollection();\r
303                         return _certificates;\r
304                 }\r
305 \r
306                 public abstract bool IsRequestStarted();\r
307 \r
308                 public abstract Uri GetAddress();\r
309 \r
310                 public abstract bool IsHaveResponse();\r
311 \r
312                 public abstract void Abort();\r
313 \r
314                 public abstract Stream GetRequestStream();\r
315 \r
316                 public abstract WebResponse GetResponse();\r
317 \r
318                 public abstract IAsyncResult BeginGetRequestStream(AsyncCallback callback, object state);\r
319 \r
320                 public abstract Stream EndGetRequestStream(IAsyncResult asyncResult);\r
321 \r
322                 public abstract IAsyncResult BeginGetResponse(AsyncCallback callback, object state);\r
323 \r
324                 public abstract WebResponse EndGetResponse(IAsyncResult asyncResult);\r
325 \r
326 \r
327                 #endregion\r
328 \r
329 \r
330         }\r
331 }\r