In corlib/System.Runtime.InteropServices:
[mono.git] / mcs / class / System / System.Net / HttpWebRequest.jvm.cs
1 \r
2 using System;\r
3 using System.Collections;\r
4 using System.Collections.Specialized;\r
5 using System.Configuration;\r
6 using System.Globalization;\r
7 using System.IO;\r
8 using System.Runtime;\r
9 using System.Runtime.CompilerServices;\r
10 using System.Runtime.Serialization;\r
11 using System.Security;\r
12 using System.Security.Cryptography.X509Certificates;\r
13 using System.Security.Permissions;\r
14 using System.Text;\r
15 using System.Threading;\r
16 using System.Net;\r
17 \r
18 namespace System.Net\r
19 {\r
20         [Serializable]\r
21         public class HttpWebRequest : WebRequest\r
22         {\r
23                 #region Fields\r
24 \r
25 \r
26                 private static readonly int DEFAULT_MAX_RESP_HEADER_LEN = 64;\r
27 \r
28                 private static int _defaultMaxResponseHeadersLength = DEFAULT_MAX_RESP_HEADER_LEN;\r
29 \r
30 \r
31                 private HttpProvider _provider;\r
32 \r
33                 #endregion\r
34 \r
35                 #region Constructors\r
36 \r
37                 internal HttpWebRequest(Uri uri)\r
38                 {\r
39                         _provider = HttpProvider.GetHttpProvider(uri);\r
40 //                      Console.WriteLine("uri to string: " + uri.ToString());\r
41                 }\r
42 \r
43 \r
44                 #endregion\r
45 \r
46                 #region Properties\r
47 \r
48 \r
49                 public string Accept\r
50                 {\r
51                         get{return Headers["Accept"];}\r
52                         set\r
53                         {\r
54                                 if(_provider.IsRequestStarted ())\r
55                                         throw new InvalidOperationException ("request started");\r
56                                 _provider.Headers.RemoveAndAdd ("Accept", value);\r
57                         }\r
58                 }\r
59 \r
60                 public Uri Address\r
61                 {\r
62                         get{return _provider.GetAddress();}\r
63                 }\r
64 \r
65                 public bool AllowAutoRedirect\r
66                 {\r
67                         get{return _provider.AllowAutoRedirect;}\r
68                         set{_provider.AllowAutoRedirect = value;}\r
69                 }\r
70 \r
71                 public bool AllowWriteStreamBuffering\r
72                 {\r
73                         get{return _provider.AllowWriteStreamBuffering;}\r
74                         set{_provider.AllowWriteStreamBuffering = value;}\r
75                 }\r
76 \r
77                 [MonoTODO] //documentation related\r
78                 public X509CertificateCollection ClientCertificates\r
79                 {\r
80                         [MonoTODO]\r
81                         get{return _provider.GetX509Certificates();}\r
82                 }\r
83 \r
84                 public string Connection\r
85                 {\r
86                         get { return Headers["Connection"]; }\r
87                         set\r
88                         {\r
89                                 if(_provider.IsRequestStarted())\r
90                                         throw new InvalidOperationException ("request started");\r
91 \r
92                                 string val = value;\r
93                                 if (val != null)\r
94                                         val = val.Trim ().ToLower ();\r
95 \r
96                                 if (val == null || val.Length == 0)\r
97                                 {\r
98                                         Headers.RemoveInternal ("Connection");\r
99                                         return;\r
100                                 }\r
101 \r
102                                 if (val == "keep-alive" || val == "close")\r
103                                         throw new ArgumentException ("Keep-Alive and Close may not be set with this property");\r
104 \r
105 //                              if (this.KeepAlive && val.IndexOf ("keep-alive") == -1)\r
106 //                                      value = value + ", Keep-Alive";\r
107 \r
108                                 Headers.RemoveAndAdd ("Connection", value);\r
109                         }\r
110                 }\r
111 \r
112                 public override string ConnectionGroupName\r
113                 {\r
114                         get{return _provider.ConnectionGroupName;}\r
115                         set{_provider.ConnectionGroupName = value;}\r
116                 }\r
117 \r
118                 public override long ContentLength\r
119                 {\r
120                         get{return _provider.ContentLength;}\r
121                         set\r
122                         {\r
123                                 if(_provider.IsRequestStarted())\r
124                                         throw new InvalidOperationException("Connection already opened");\r
125                                 _provider.ContentLength = value;\r
126                         }\r
127                 }\r
128 \r
129                 public override string ContentType\r
130                 {\r
131                         get { return Headers["Content-Type"]; }\r
132                         set\r
133                         {\r
134                                 if (value == null || value.Trim().Length == 0)\r
135                                 {\r
136                                         Headers.RemoveInternal ("Content-Type");\r
137                                         return;\r
138                                 }\r
139                                 Headers.RemoveAndAdd ("Content-Type", value);\r
140                         }\r
141                 }\r
142                 [MonoTODO] //needed for automatic documentation tools,\r
143                         //since currently we don't support this feature\r
144                 public HttpContinueDelegate ContinueDelegate\r
145                 {\r
146                         [MonoTODO]\r
147                         get{return _provider.ContinueDelegate;}\r
148                         [MonoTODO]\r
149                         set{_provider.ContinueDelegate = value;}\r
150                 }\r
151 \r
152                 public CookieContainer CookieContainer\r
153                 {\r
154                         get{return _provider.CookieContainer;}\r
155                         set{_provider.CookieContainer = value;}\r
156                 }\r
157 \r
158                 public override ICredentials Credentials\r
159                 {\r
160                         get{return _provider.Credentials;}\r
161                         set{_provider.Credentials = value;}\r
162                 }\r
163 \r
164                 public static int DefaultMaximumResponseHeadersLength\r
165                 {\r
166                         get{return HttpProvider.DefaultMaxResponseHeadersLength;}\r
167                         set{HttpProvider.DefaultMaxResponseHeadersLength = value;}\r
168                 }\r
169 \r
170                 public string Expect\r
171                 {\r
172                         get{return Headers["Expect"];}\r
173                         set\r
174                         {\r
175                                 if(_provider.IsRequestStarted ())\r
176                                         throw new InvalidOperationException("Connection already opened");\r
177                                 string val = value;\r
178                                 if (val != null)\r
179                                         val = val.Trim ().ToLower ();\r
180 \r
181                                 if (val == null || val.Length == 0)\r
182                                 {\r
183                                         Headers.RemoveInternal ("Expect");\r
184                                         return;\r
185                                 }\r
186 \r
187                                 if (val == "100-continue")\r
188                                         throw new ArgumentException ("100-Continue cannot be set with this property.",\r
189                                                 "value");\r
190                                 Headers.RemoveAndAdd ("Expect", value);\r
191                         }\r
192                 }\r
193 \r
194                 public bool HaveResponse\r
195                 {\r
196                         get{return _provider.IsHaveResponse();}\r
197                 }\r
198 \r
199                 public override WebHeaderCollection Headers\r
200                 {\r
201                         get{return _provider.Headers;}\r
202                         set{_provider.Headers = value;}\r
203                 }\r
204 \r
205                 public DateTime IfModifiedSince\r
206                 {\r
207                         get\r
208                         {\r
209                                 string str = Headers["If-Modified-Since"];\r
210                                 if (str == null)\r
211                                         return DateTime.Now;\r
212                                 try\r
213                                 {\r
214                                         return MonoHttpDate.Parse (str);\r
215                                 }\r
216                                 catch (Exception)\r
217                                 {\r
218                                         return DateTime.Now;\r
219                                 }\r
220                         }\r
221                         set\r
222                         {\r
223                                 if(_provider.IsRequestStarted ())\r
224                                         throw new InvalidOperationException("Connection already started");\r
225                                 // rfc-1123 pattern\r
226                                 Headers.SetInternal ("If-Modified-Since",\r
227                                         value.ToUniversalTime ().ToString ("r", null));\r
228                                 // TODO: check last param when using different locale\r
229                         }\r
230                 }\r
231 \r
232                 public bool KeepAlive\r
233                 {\r
234                         get{return _provider.KeepAlive;}\r
235                         set{_provider.KeepAlive = value;}\r
236                 }\r
237 \r
238                 public int MaximumAutomaticRedirections\r
239                 {\r
240                         get{return _provider.MaxAutoRedirections;}\r
241                         set{_provider.MaxAutoRedirections = value;}\r
242                 }\r
243 \r
244                 [MonoTODO] //documentation\r
245                 public int MaximumResponseHeadersLength\r
246                 {\r
247                         [MonoTODO]\r
248                         get{return _provider.MaximumResponseHeadersLength;}\r
249                         [MonoTODO]\r
250                         set{_provider.MaximumResponseHeadersLength = value;}\r
251                 }\r
252 \r
253                 public string MediaType\r
254                 {\r
255                         get{return _provider.MediaType;}\r
256                         set{_provider.MediaType = value;}\r
257                 }\r
258 \r
259                 public override string Method\r
260                 {\r
261                         get{return _provider.MethodName;}\r
262                         set{_provider.MethodName = value;}\r
263                 }\r
264                 [MonoTODO] //for documentation related - limited.\r
265                 public bool Pipelined\r
266                 {\r
267                         [MonoTODO]\r
268                         get{return _provider.Pipelined;}\r
269                         [MonoTODO]\r
270                         set{_provider.Pipelined = value;}\r
271                 }\r
272 \r
273                 public override bool PreAuthenticate\r
274                 {\r
275                         get{return _provider.PreAuthenticate;}\r
276                         set{_provider.PreAuthenticate = value;}\r
277                 }\r
278 \r
279                 public Version ProtocolVersion\r
280                 {\r
281                         get{return _provider.ProtocolVersion;}\r
282                         set{_provider.ProtocolVersion = value;}\r
283                 }\r
284 \r
285                 public override IWebProxy Proxy\r
286                 {\r
287                         get{return _provider.Proxy;}\r
288                         set{_provider.Proxy = value;}\r
289                 }\r
290 \r
291                 public int ReadWriteTimeout\r
292                 {\r
293                         get{return _provider.ReadWriteTimeout;}\r
294                         set{_provider.ReadWriteTimeout = value;}\r
295                 }\r
296 \r
297                 public string Referer\r
298                 {\r
299                         get {return Headers["Referer"];}\r
300                         set\r
301                         {\r
302                                 if(_provider.IsRequestStarted ())\r
303                                         throw new InvalidOperationException("Connection already opened");\r
304                                 if (value == null || value.Trim().Length == 0)\r
305                                 {\r
306                                         Headers.RemoveInternal ("Referer");\r
307                                         return;\r
308                                 }\r
309                                 Headers.SetInternal ("Referer", value);\r
310                         }\r
311                 }\r
312                 internal Uri AuthUri\r
313                 {\r
314                         get { return RequestUri; }\r
315                 }\r
316                 public override Uri RequestUri\r
317                 {\r
318                         get{return _provider.GetOriginalAddress();}\r
319                 }\r
320 \r
321                 public bool SendChunked\r
322                 {\r
323                         get{return _provider.SendChunked;}\r
324                         set{_provider.SendChunked = value;}\r
325                 }\r
326 \r
327                 public ServicePoint ServicePoint\r
328                 {\r
329                         get{return _provider.ServicePoint;}\r
330                 }\r
331                 [MonoTODO] //once again - needed since our impl. still\r
332                         //doesn't support this feature we need document it..\r
333                 public override int Timeout\r
334                 {\r
335                         [MonoTODO]\r
336                         get{return _provider.Timeout;}\r
337                         [MonoTODO]\r
338                         set{_provider.Timeout = value;}\r
339                 }\r
340 \r
341 \r
342                 public string TransferEncoding\r
343                 {\r
344                         get { return Headers ["Transfer-Encoding"]; }\r
345                         set\r
346                         {\r
347                                 if(_provider.IsRequestStarted ())\r
348                                 {\r
349                                         throw new InvalidOperationException("Connection has been already opened");\r
350                                 }\r
351                                 string val = value;\r
352                                 if (val != null)\r
353                                         val = val.Trim ().ToLower ();\r
354 \r
355                                 if (val == null || val.Length == 0)\r
356                                 {\r
357                                         Headers.RemoveInternal ("Transfer-Encoding");\r
358                                         return;\r
359                                 }\r
360 \r
361                                 if (val == "chunked")\r
362                                         throw new ArgumentException ("Chunked encoding must be set with the SendChunked property");\r
363 \r
364                                 if (!this.SendChunked)\r
365                                         throw new InvalidOperationException ("SendChunked must be True");\r
366 \r
367                                 Headers.RemoveAndAdd ("Transfer-Encoding", value);\r
368                         }\r
369                 }\r
370 \r
371 \r
372                 public bool UnsafeAuthenticatedConnectionSharing\r
373                 {\r
374                         get { throw new NotImplementedException (); }\r
375                         set { throw new NotImplementedException (); }\r
376                 }\r
377 \r
378                 public string UserAgent\r
379                 {\r
380                         get { return Headers ["User-Agent"]; }\r
381                         set { Headers.SetInternal ("User-Agent", value); }\r
382                 }\r
383 \r
384 \r
385 \r
386 \r
387                 #endregion\r
388 \r
389                 #region Methods\r
390 \r
391                 //todo\r
392                 public override void Abort()\r
393                 {\r
394                         _provider.Abort();\r
395 //                      _connection.disconnect();\r
396 //                      _haveResponse = true;\r
397 //                      //aborted = true;\r
398 //                      if (_asyncWrite != null)\r
399 //                      {\r
400 //                              GHWebAsyncResult r = _asyncWrite;\r
401 //                              WebException wexc = new WebException ("Aborted.", WebExceptionStatus.RequestCanceled);\r
402 //                              r.SetCompleted (false, wexc);\r
403 //                              r.DoCallback ();\r
404 //                              _asyncWrite = null;\r
405 //                      }\r
406 //\r
407 //                      if (_asyncRead != null)\r
408 //                      {\r
409 //                              GHWebAsyncResult r = _asyncRead;\r
410 //                              WebException wexc = new WebException ("Aborted.", WebExceptionStatus.RequestCanceled);\r
411 //                              r.SetCompleted (false, wexc);\r
412 //                              r.DoCallback ();\r
413 //                              _asyncRead = null;\r
414 //                      }\r
415 //\r
416 ////                    if (abortHandler != null)\r
417 ////                    {\r
418 ////                            try\r
419 ////                            {\r
420 ////                                    abortHandler (this, EventArgs.Empty);\r
421 ////                            }\r
422 ////                            catch {}\r
423 ////                            abortHandler = null;\r
424 ////                    }\r
425 //\r
426 //                      if (_writeStream != null)\r
427 //                      {\r
428 //                              try\r
429 //                              {\r
430 //                                      _writeStream.Close ();\r
431 //                                      _writeStream = null;\r
432 //                              }\r
433 //                              catch {}\r
434 //                      }\r
435 //\r
436 //                      if (_response != null)\r
437 //                      {\r
438 //                              try\r
439 //                              {\r
440 //                                      _response.Close ();\r
441 //                                      _response = null;\r
442 //                              }\r
443 //                              catch {}\r
444 //                      }\r
445                 }\r
446 \r
447                 public void AddRange (int range)\r
448                 {\r
449                         AddRange ("bytes", range);\r
450                 }\r
451 \r
452                 public void AddRange (int from, int to)\r
453                 {\r
454                         AddRange ("bytes", from, to);\r
455                 }\r
456 \r
457                 public void AddRange (string rangeSpecifier, int range)\r
458                 {\r
459                         if (rangeSpecifier == null)\r
460                                 throw new ArgumentNullException ("rangeSpecifier");\r
461                         string value = Headers ["Range"];\r
462                         if (value == null || value.Length == 0)\r
463                                 value = rangeSpecifier + "=";\r
464                         else if (value.ToLower ().StartsWith (rangeSpecifier.ToLower () + "="))\r
465                                 value += ",";\r
466                         else\r
467                                 throw new InvalidOperationException ("rangeSpecifier");\r
468                         Headers.RemoveAndAdd ("Range", value + range + "-");\r
469                 }\r
470 \r
471                 public void AddRange (string rangeSpecifier, int from, int to)\r
472                 {\r
473                         if (rangeSpecifier == null)\r
474                                 throw new ArgumentNullException ("rangeSpecifier");\r
475                         if (from < 0 || to < 0 || from > to)\r
476                                 throw new ArgumentOutOfRangeException ();\r
477                         string value = Headers ["Range"];\r
478                         if (value == null || value.Length == 0)\r
479                                 value = rangeSpecifier + "=";\r
480                         else if (value.ToLower ().StartsWith (rangeSpecifier.ToLower () + "="))\r
481                                 value += ",";\r
482                         else\r
483                                 throw new InvalidOperationException ("rangeSpecifier");\r
484                         Headers.RemoveAndAdd ("Range", value + from + "-" + to);\r
485                 }\r
486 \r
487                 public override Stream GetRequestStream()\r
488                 {\r
489                         return _provider.GetRequestStream();\r
490 //                      lock(this)\r
491 //                      {\r
492 //                              Type t = Type.GetType("System.IO.ConsoleWriteStream", true);\r
493 //                              _connection.setDoOutput(true);\r
494 //\r
495 //\r
496 ////                            Console.WriteLine("Request is sent with following headers:");\r
497 ////                            java.util.Map map = _connection.getRequestProperties();\r
498 ////                            for(java.util.Iterator iter = map.keySet().iterator(); iter.hasNext();)\r
499 ////                            {\r
500 ////                                    string key = (string) iter.next();\r
501 ////                                    Console.WriteLine(key + ": " + map.get(key));\r
502 ////                            }\r
503 //\r
504 //                              foreach(string k in Headers)\r
505 //                              {\r
506 //                                      string val = Headers[k];\r
507 //                                      val = (val == null) ? "" : val;\r
508 //                                      _connection.setRequestProperty(k, val);\r
509 //                              }\r
510 //\r
511 //                              _writeStream = (Stream) Activator.CreateInstance(t, new object[]{_connection.getOutputStream()});\r
512 //                              _haveRequest = true;\r
513 //                              return _writeStream;\r
514 //                      }\r
515                 }\r
516 \r
517                 public override WebResponse GetResponse()\r
518                 {\r
519                         return _provider.GetResponse();\r
520                 }\r
521                 /*\r
522                 private void CommonChecks (bool putpost)\r
523                 {\r
524                         string method = _connection.getRequestMethod();\r
525 \r
526                         if (method == null)\r
527                                 throw new ProtocolViolationException ("Method is null.");\r
528 \r
529                         bool keepAlive = _headers["Keep-Alive"] == null;\r
530                         bool allowBuffering = true;\r
531                         bool sendChunked = true;\r
532                         long contentLength = _connection.getContentLength();\r
533 \r
534                         if (putpost && ((!keepAlive || (contentLength == -1 && !sendChunked)) && !allowBuffering))\r
535                                 throw new ProtocolViolationException ("Content-Length not set");\r
536 \r
537                         string transferEncoding = TransferEncoding;\r
538                         if (!sendChunked && transferEncoding != null && transferEncoding.Trim () != "")\r
539                                 throw new ProtocolViolationException ("SendChunked should be true.");\r
540                 }\r
541                 */\r
542 \r
543                 public override IAsyncResult BeginGetRequestStream(AsyncCallback callback, object state)\r
544                 {\r
545                         return _provider.BeginGetRequestStream(callback, state);\r
546                 }\r
547 \r
548                 public override Stream EndGetRequestStream(IAsyncResult asyncResult)\r
549                 {\r
550                         return _provider.EndGetRequestStream(asyncResult);\r
551                 }\r
552 \r
553                 public override IAsyncResult BeginGetResponse(AsyncCallback callback, object state)\r
554                 {\r
555                         //todo check input, http headers etc.\r
556 \r
557                         return  _provider.BeginGetResponse(callback, state);\r
558                 }\r
559 \r
560                 public override WebResponse EndGetResponse(IAsyncResult asyncResult)\r
561                 {\r
562                         return _provider.EndGetResponse(asyncResult);\r
563                 }\r
564 \r
565 \r
566 \r
567 \r
568                 #endregion\r
569 \r
570                 #region Inner Classes\r
571 \r
572 //              #region JavaHeaders class\r
573 //              [Serializable]\r
574 //                      internal sealed class JavaHeaders  : WebHeaderCollection\r
575 //              {\r
576 //                      private java.net.HttpURLConnection _connection;\r
577 //\r
578 //                      internal JavaHeaders(java.net.HttpURLConnection con)\r
579 //                      {\r
580 //                              _connection = con;\r
581 //                      }\r
582 //\r
583 //                      public string this[string key]\r
584 //                      {\r
585 //                              get\r
586 //                              {\r
587 //                                      return _connection.getHeaderField(key);\r
588 //                              }\r
589 //                              set\r
590 //                              {\r
591 //                                      _connection.addRequestProperty(key, value);\r
592 //                              }\r
593 //                      }\r
594 //              }\r
595 //              #endregion\r
596 \r
597 \r
598 \r
599 \r
600                 #endregion\r
601 \r
602         }\r
603 }