3 using System.Threading;
\r
5 using mainsoft.apache.commons.httpclient;
\r
6 using mainsoft.apache.commons.httpclient.methods;
\r
7 using mainsoft.apache.commons.httpclient.@params;
\r
8 using mainsoft.apache.commons.httpclient.auth;
\r
9 using mainsoft.apache.commons.httpclient.auth.negotiate;
\r
10 using javax.security.auth;
\r
11 using org.ietf.jgss;
\r
12 using java.security;
\r
13 using System.Collections.Specialized;
\r
14 using System.Collections;
\r
15 using mainsoft.apache.commons.httpclient.cookie;
\r
17 namespace System.Net
\r
20 /// Summary description for VMWHttpProvider.
\r
22 internal class VMWHttpProvider : HttpProvider
\r
24 protected static HttpClient _sclient;
\r
25 protected static HttpStateCache _stateCache = new HttpStateCache();
\r
27 protected static object LOCK_OBJECT = new object();
\r
29 protected HttpClient _client;
\r
30 protected bool _disableHttpConnectionPooling = false;
\r
32 protected HttpMethod _method;
\r
33 protected HttpState _state;
\r
34 protected HostConfiguration _hostConfig;
\r
36 protected HttpWebResponse _response;
\r
37 protected bool _hasResponse;
\r
38 protected bool _hasRequest;
\r
39 protected Stream _writeStream;
\r
40 private GHWebAsyncResult _asyncWrite;
\r
42 private bool _isConnectionOpened;
\r
44 static VMWHttpProvider()
\r
46 if(java.lang.System.getProperty("mainsoft.apache.commons.logging.Log") == null)
\r
47 java.lang.System.setProperty("mainsoft.apache.commons.logging.Log",
\r
48 "mainsoft.apache.commons.logging.impl.SimpleLog");
\r
49 if(java.lang.System.getProperty("mainsoft.apache.commons.logging.simplelog.showdatetime") == null)
\r
50 java.lang.System.setProperty("mainsoft.apache.commons.logging.simplelog.showdatetime",
\r
52 if(java.lang.System.getProperty("mainsoft.apache.commons.logging.simplelog.log.httpclient.wire") == null)
\r
53 java.lang.System.setProperty("mainsoft.apache.commons.logging.simplelog.log.httpclient.wire",
\r
55 if(java.lang.System.getProperty("mainsoft.apache.commons.logging.simplelog.log.mainsoft.apache.commons.httpclient")
\r
57 java.lang.System.setProperty("mainsoft.apache.commons.logging.simplelog.log.mainsoft.apache.commons.httpclient",
\r
59 if(java.lang.System.getProperty("mainsoft.apache.commons.logging.simplelog.log.httpclient.wire.header")
\r
61 java.lang.System.setProperty("mainsoft.apache.commons.logging.simplelog.log.httpclient.wire.header",
\r
65 public VMWHttpProvider(Uri uri) : base (uri)
\r
67 string s = System.Configuration.ConfigurationSettings.AppSettings["disableHttpConnectionPooling"];
\r
70 _disableHttpConnectionPooling = bool.Parse(s);
\r
72 InitDefaultCredentialsProvider ();
\r
73 InitSPNProviders ();
\r
76 internal override ServicePoint ServicePoint
\r
78 get {throw new NotImplementedException();}
\r
83 public override bool IsRequestStarted()
\r
87 return _method.isRequestSent();
\r
90 public override Uri GetAddress()
\r
93 return GetOriginalAddress();
\r
94 mainsoft.apache.commons.httpclient.URI javaURI = _method.getURI();
\r
95 return new Uri(javaURI.ToString());
\r
98 public override bool IsHaveResponse()
\r
100 return _hasResponse;
\r
103 private void SetJavaCredential(NetworkCredential nc, string type)
\r
105 SetJavaCredential(nc, type, false);
\r
108 private void SetJavaCredential(NetworkCredential nc, string type, bool proxyCredentials)
\r
110 string host = null;
\r
112 if(!proxyCredentials)
\r
113 host = GetOriginalAddress().Host;
\r
115 host = ((WebProxy)this.Proxy).Address.Host;
\r
117 string domain = (nc.Domain == null) ? host : nc.Domain;
\r
119 if(String.Compare (type, "any", StringComparison.InvariantCultureIgnoreCase) == 0)
\r
121 if(!proxyCredentials)
\r
123 _state.setCredentials(AuthScope.ANY,
\r
124 new UsernamePasswordCredentials(nc.UserName, nc.Password));
\r
125 _state.setCredentials(new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT, AuthScope.ANY_REALM, "Ntlm"),
\r
126 new NTCredentials(nc.UserName, nc.Password, host, domain));
\r
130 _state.setProxyCredentials(AuthScope.ANY,
\r
131 new UsernamePasswordCredentials(nc.UserName, nc.Password));
\r
132 _state.setProxyCredentials(new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT, AuthScope.ANY_REALM, "Ntlm"),
\r
133 new NTCredentials(nc.UserName, nc.Password, host, domain));
\r
136 else if(String.Compare (type, "basic", StringComparison.InvariantCultureIgnoreCase) == 0)
\r
138 if(!proxyCredentials)
\r
140 _state.setCredentials(new AuthScope(AuthScope.ANY_HOST,
\r
141 AuthScope.ANY_PORT, AuthScope.ANY_REALM, "basic"),
\r
142 new UsernamePasswordCredentials(nc.UserName, nc.Password));
\r
146 _state.setProxyCredentials(new AuthScope(AuthScope.ANY_HOST,
\r
147 AuthScope.ANY_PORT, AuthScope.ANY_REALM, "basic"),
\r
148 new UsernamePasswordCredentials(nc.UserName, nc.Password));
\r
151 else if(String.Compare (type, "digest", StringComparison.InvariantCultureIgnoreCase) == 0)
\r
153 if(!proxyCredentials)
\r
155 _state.setCredentials(new AuthScope(AuthScope.ANY_HOST,
\r
156 AuthScope.ANY_PORT, AuthScope.ANY_REALM, "digest"),
\r
157 new UsernamePasswordCredentials(nc.UserName, nc.Password));
\r
161 _state.setProxyCredentials(new AuthScope(AuthScope.ANY_HOST,
\r
162 AuthScope.ANY_PORT, AuthScope.ANY_REALM, "digest"),
\r
163 new UsernamePasswordCredentials(nc.UserName, nc.Password));
\r
166 else if(String.Compare (type, "ntlm", StringComparison.InvariantCultureIgnoreCase) == 0)
\r
168 if(!proxyCredentials)
\r
170 _state.setCredentials(new AuthScope(AuthScope.ANY_HOST,
\r
171 AuthScope.ANY_PORT, AuthScope.ANY_REALM, "ntlm"),
\r
172 new NTCredentials(nc.UserName, nc.Password, host, domain));
\r
176 _state.setProxyCredentials(new AuthScope(AuthScope.ANY_HOST,
\r
177 AuthScope.ANY_PORT, AuthScope.ANY_REALM, "ntlm"),
\r
178 new NTCredentials(nc.UserName, nc.Password, host, domain));
\r
181 else if(String.Compare (type, "negotiate", StringComparison.InvariantCultureIgnoreCase) == 0)
\r
183 SetAuthenticationScheme (AuthPolicy.NEGOTIATE);
\r
187 if(!proxyCredentials)
\r
189 _state.setCredentials(new AuthScope(AuthScope.ANY_HOST,
\r
190 AuthScope.ANY_PORT, AuthScope.ANY_REALM, type),
\r
191 new UsernamePasswordCredentials(nc.UserName, nc.Password));
\r
195 _state.setProxyCredentials(new AuthScope(AuthScope.ANY_HOST,
\r
196 AuthScope.ANY_PORT, AuthScope.ANY_REALM, type),
\r
197 new UsernamePasswordCredentials(nc.UserName, nc.Password));
\r
202 private void SetAuthenticationScheme (string type) {
\r
203 _method.getHostAuthState ().setAuthScheme (AuthPolicy.getAuthScheme (type));
\r
204 if (type != null && type.ToLower () == AuthPolicy.NEGOTIATE.ToLower ()) {
\r
205 _method.getParams ().setParameter (CredentialsProvider__Finals.PROVIDER, new HTTPClientCredentialsBridge( DefaultCredentialsProvider));
\r
206 _method.getParams ().setParameter (NegotiateScheme.SPN_LIST_PARAM, SPNProviders);
\r
210 private java.util.ArrayList SPNProviders {
\r
212 return (java.util.ArrayList) AppDomain.CurrentDomain.GetData ("GH$SPNProviders");
\r
215 AppDomain.CurrentDomain.SetData ("GH$SPNProviders", value);
\r
219 private void InitSPNProviders () {
\r
220 if (SPNProviders != null)
\r
222 java.util.ArrayList spnProviders = new java.util.ArrayList ();
\r
223 NameValueCollection configAttributes = System.Configuration.ConfigurationSettings.AppSettings;
\r
224 string providersList = configAttributes ["SPNProviders"];
\r
225 if (providersList == null)
\r
227 string[] tokens = providersList.Split (',');
\r
228 foreach (string spnClass in tokens) {
\r
230 spnProviders.add (Activator.CreateInstance (Type.GetType (spnClass)));
\r
232 catch (Exception) { }
\r
234 SPNProviders = spnProviders;
\r
237 private vmw.@internal.auth.CredentialsProvider DefaultCredentialsProvider {
\r
239 return (vmw.@internal.auth.CredentialsProvider) AppDomain.CurrentDomain.GetData ("GH$DefaultCredentialsProvider");
\r
242 AppDomain.CurrentDomain.SetData ("GH$DefaultCredentialsProvider", value);
\r
246 private void InitDefaultCredentialsProvider () {
\r
247 if (DefaultCredentialsProvider != null)
\r
249 vmw.@internal.auth.CredentialsProvider defaultProvider = null;
\r
250 NameValueCollection configAttributes = System.Configuration.ConfigurationSettings.AppSettings;
\r
252 string defaultProviderClass = configAttributes ["DefaultCredentialsProvider"];
\r
253 if (defaultProviderClass != null) {
\r
255 defaultProvider = (vmw.@internal.auth.CredentialsProvider)
\r
256 Activator.CreateInstance (Type.GetType (defaultProviderClass));
\r
258 catch (Exception e) {
\r
259 Console.WriteLine ("Failed to initialize Credentials Provider: " + defaultProviderClass + " Message: " + e.Message);
\r
263 if (defaultProvider == null)
\r
264 defaultProvider = new vmw.@internal.auth.SubjectCredentialsPrvider ();
\r
266 defaultProvider.init (ConvertToTable (configAttributes));
\r
267 DefaultCredentialsProvider = defaultProvider;
\r
270 private java.util.Properties ConvertToTable (NameValueCollection col) {
\r
271 java.util.Properties table = new java.util.Properties ();
\r
272 foreach (String key in col.Keys)
\r
273 table.put (key, col [key]);
\r
277 private void InitProxyCredentials () {
\r
278 if (this.Proxy == null)
\r
281 if (!(this.Proxy is WebProxy))
\r
284 WebProxy proxy = (WebProxy) this.Proxy;
\r
285 ICredentials creds = proxy.Credentials;
\r
290 if(creds is CredentialCache)
\r
292 string type = "basic";
\r
293 NetworkCredential nc = ((CredentialCache)creds).GetCredential(proxy.Address, "basic");
\r
297 nc = ((CredentialCache)creds).GetCredential(proxy.Address, "digest");
\r
301 nc = ((CredentialCache)creds).GetCredential(proxy.Address, "ntlm");
\r
303 nc = ((CredentialCache) _credentials).GetCredential (GetOriginalAddress (), "negotiate");
\r
304 type = "negotiate";
\r
310 SetJavaCredential(nc, type, true);
\r
313 else if (creds is NetworkCredential)
\r
315 SetJavaCredential((NetworkCredential)creds, "any", true);
\r
318 _method.setDoAuthentication(true);
\r
321 private void InitCredentials()
\r
323 if(_credentials == null)
\r
325 if (_credentials == CredentialCache.DefaultCredentials) {
\r
326 SetAuthenticationScheme (AuthPolicy.NEGOTIATE);
\r
328 else if (_credentials is CredentialCache) {
\r
329 NetworkCredential nc = ((CredentialCache) _credentials).GetCredential (GetOriginalAddress (), "basic");
\r
330 string type = "basic";
\r
333 nc = ((CredentialCache)_credentials).GetCredential(GetOriginalAddress(), "digest");
\r
337 nc = ((CredentialCache)_credentials).GetCredential(GetOriginalAddress(), "ntlm");
\r
340 nc = ((CredentialCache) _credentials).GetCredential (GetOriginalAddress (), "negotiate");
\r
341 type = "negotiate";
\r
347 SetJavaCredential(nc, type);
\r
350 else if(_credentials is NetworkCredential)
\r
352 SetJavaCredential((NetworkCredential)_credentials, "any");
\r
355 _method.setDoAuthentication(true);
\r
358 private void InitHostConfig()
\r
360 if (this.Proxy == null || this.Proxy == WebRequest.DefaultWebProxy)
\r
362 if(this.Proxy.IsBypassed(GetOriginalAddress()))
\r
365 _hostConfig = new HostConfiguration();
\r
366 _hostConfig.setHost(new HttpHost(_method.getURI()));
\r
369 if(this.Proxy is WebProxy)
\r
371 WebProxy wp = (WebProxy) this.Proxy;
\r
372 _hostConfig.setProxyHost(new ProxyHost(wp.Address.Host, wp.Address.Port));
\r
375 throw new NotImplementedException("Cannot accept Proxy which is not System.Net.WebProxy instance");
\r
380 private void SetConnectionHeader(string val)
\r
382 string connectionHeader = (this.Proxy != null) ? "Proxy-Connection" : "Connection";
\r
383 Headers.RemoveInternal ((this.Proxy != null) ? "Proxy-Connection" : "Connection");
\r
386 _method.setRequestHeader(connectionHeader, val);
\r
390 _method.addRequestHeader (connectionHeader, "keep-alive");
\r
391 Headers.SetInternal(connectionHeader,"keep-alive");
\r
393 else if (!_keepAlive && _version == HttpVersion.Version11)
\r
395 _method.addRequestHeader (connectionHeader, "close");
\r
396 Headers.SetInternal(connectionHeader,"close");
\r
400 private bool OpenConnection()
\r
404 if(_isConnectionOpened)
\r
406 _isConnectionOpened = true;
\r
411 _state = _stateCache.GetHttpState();
\r
413 //todo insert needed Authontication, Cookies info to state!
\r
414 _method.setDoAuthentication(this.PreAuthenticate);
\r
418 InitProxyCredentials();
\r
420 if(this.ProtocolVersion == HttpVersion.Version11)
\r
421 _method.getParams().setVersion(mainsoft.apache.commons.httpclient.HttpVersion.HTTP_1_1);
\r
422 else if(ProtocolVersion == HttpVersion.Version10)
\r
423 _method.getParams().setVersion(mainsoft.apache.commons.httpclient.HttpVersion.HTTP_1_0);
\r
425 throw new ProtocolViolationException("Unsupported protocol version: " + ProtocolVersion);
\r
427 if(!(_method is mainsoft.apache.commons.httpclient.methods.EntityEnclosingMethod))
\r
429 _method.setFollowRedirects(this.AllowAutoRedirect);
\r
433 if(!AllowWriteStreamBuffering && _contentLength < 0 && !SendChunked)
\r
434 throw new ProtocolViolationException();
\r
436 ((EntityEnclosingMethod)_method).setContentChunked(SendChunked);
\r
438 if(MaxAutoRedirections != _defaultMaxRedirectsNum)
\r
440 _method.getParams().setParameter(HttpClientParams.MAX_REDIRECTS,
\r
441 new java.lang.Integer(MaxAutoRedirections));
\r
446 foreach(string k in Headers)
\r
448 if(String.Compare (k, "connection", StringComparison.InvariantCultureIgnoreCase) == 0)
\r
450 string val = Headers[k];
\r
451 val = (val == null) ? "" : val;
\r
452 _method.setRequestHeader(k, val);
\r
455 if (this.CookieContainer != null)
\r
457 string cookieHeader = this.CookieContainer.GetCookieHeader (this.GetOriginalAddress());
\r
458 if (cookieHeader != "")
\r
459 _method.setRequestHeader("Cookie", cookieHeader);
\r
461 SetConnectionHeader(Headers["Connection"]);
\r
463 _method.getParams().setSoTimeout(ReadWriteTimeout);
\r
469 private void InitClient()
\r
473 if((!_disableHttpConnectionPooling) && (_client == null))
\r
475 _client = _sclient;
\r
477 if(_client == null)
\r
479 mainsoft.apache.commons.httpclient.MultiThreadedHttpConnectionManager manager =
\r
480 new mainsoft.apache.commons.httpclient.MultiThreadedHttpConnectionManager();
\r
481 manager.setConnectionStaleCheckingEnabled(false);
\r
482 manager.setMaxTotalConnections(200);
\r
483 //by some reasons RFC something - the default
\r
484 //value will be 2 , so we need to change it ...
\r
485 manager.setMaxConnectionsPerHost(20);
\r
486 _client = new HttpClient(manager);
\r
487 _client.getParams().setIntParameter(HttpClientParams.MAX_REDIRECTS, _defaultMaxRedirectsNum);
\r
488 _client.getParams().setParameter(HttpClientParams.ALLOW_CIRCULAR_REDIRECTS, new java.lang.Boolean(true));
\r
489 _client.getParams().setParameter(HttpClientParams.CONNECTION_MANAGER_TIMEOUT, new java.lang.Long(30000));
\r
490 _client.getParams().setParameter(HttpClientParams.USER_AGENT,
\r
491 "VMW4J HttpClient (based on Jakarta Commons HttpClient)");
\r
492 _client.getParams ().setBooleanParameter (HttpClientParams.SINGLE_COOKIE_HEADER, true);
\r
493 java.util.ArrayList schemas = new java.util.ArrayList ();
\r
494 schemas.add ("Ntlm");
\r
495 schemas.add ("Digest");
\r
496 schemas.add ("Basic");
\r
497 schemas.add ("Negotiate");
\r
498 _client.getParams ().setParameter (AuthPolicy.AUTH_SCHEME_PRIORITY, schemas);
\r
499 if (!_disableHttpConnectionPooling) {
\r
500 _sclient = _client;
\r
506 private void InitMethod()
\r
510 if(_method == null)
\r
512 string uriString = this.GetOriginalAddress().AbsoluteUri;
\r
514 if(this.MethodName == null || this.MethodName == "")
\r
516 this.MethodName = "GET";
\r
519 string name = this.MethodName.ToUpper().Trim();
\r
523 case "GET" : _method = new GetMethod(uriString); break;
\r
524 case "PUT" : _method = new PutMethod(uriString);
\r
525 if (ServicePointManager.Expect100Continue)
\r
526 _method.getParams ().setBooleanParameter (HttpMethodParams.USE_EXPECT_CONTINUE, true);
\r
528 case "POST": _method = new PostMethod(uriString);
\r
529 if (ServicePointManager.Expect100Continue)
\r
530 _method.getParams ().setBooleanParameter (HttpMethodParams.USE_EXPECT_CONTINUE, true);
\r
532 case "HEAD": _method = new HeadMethod(uriString); break;
\r
533 case "TRACE": _method = new TraceMethod(uriString);break;
\r
534 case "DELETE": _method = new DeleteMethod(uriString);break;
\r
535 case "OPTIONS": _method = new OptionsMethod(uriString);break;
\r
536 default: _method = new GenericMethod(uriString, MethodName); break;
\r
542 private void InitHostConfiguration()
\r
546 if(_hostConfig == null)
\r
548 _hostConfig = new HostConfiguration();
\r
555 public override Stream GetRequestStream()
\r
557 bool isPutPost = String.Compare("post", MethodName, true) == 0
\r
558 || String.Compare("put", MethodName, true) == 0;
\r
560 throw new ProtocolViolationException();
\r
564 throw new WebException ("The operation has been aborted.", WebExceptionStatus.RequestCanceled);
\r
565 if(_writeStream != null)
\r
566 return _writeStream;
\r
567 this.OpenConnection();
\r
569 //java.io.PipedInputStream inJavaStream = new java.io.PipedInputStream();
\r
570 //java.io.PipedOutputStream outJavaStream = new java.io.PipedOutputStream(inJavaStream);
\r
572 long contLen = _contentLength;
\r
574 OutputStreamRequestEntity reqEntity = new OutputStreamRequestEntity(contLen);
\r
576 _writeStream = new VMWRequestStream(reqEntity, contLen);
\r
578 EntityEnclosingMethod method = (EntityEnclosingMethod)_method;
\r
579 if(AllowWriteStreamBuffering )
\r
580 method.setRequestEntity(reqEntity);
\r
581 else if(!AllowWriteStreamBuffering && contLen < 0 && !SendChunked)
\r
582 throw new ProtocolViolationException();
\r
584 method.setRequestEntity(reqEntity);
\r
586 _hasRequest = true;
\r
587 return _writeStream;
\r
590 private static bool isRedirectNeeded(HttpMethod method)
\r
592 switch (method.getStatusCode())
\r
604 private void synchHeaders()
\r
606 foreach(string k in Headers)
\r
608 if (String.Compare (k, "connection", StringComparison.InvariantCultureIgnoreCase) == 0)
\r
610 string val = Headers[k];
\r
611 val = (val == null) ? "" : val;
\r
612 _method.setRequestHeader(k, val);
\r
616 delegate WebResponse GetResponseDelegate();
\r
617 private sealed class AsyncContext
\r
619 public readonly AsyncCallback AsyncCallback;
\r
620 public readonly Delegate AsyncDelegate;
\r
621 public readonly object AsyncState;
\r
622 public readonly DelegateAsyncResult DelegateAsyncResult;
\r
624 public AsyncContext (Delegate @delegate, DelegateAsyncResult delegateAsyncResult, AsyncCallback asyncCallback, object userState) {
\r
625 AsyncDelegate = @delegate;
\r
626 AsyncCallback = asyncCallback;
\r
627 AsyncState = userState;
\r
628 DelegateAsyncResult = delegateAsyncResult;
\r
631 private sealed class DelegateAsyncResult : IAsyncResult
\r
634 IAsyncResult _asyncResult;
\r
636 public IAsyncResult AsyncResult {
\r
637 get { return _asyncResult; }
\r
638 set { _asyncResult = value; }
\r
641 AsyncContext AsyncContext {
\r
642 get { return (AsyncContext) _asyncResult.AsyncState; }
\r
645 public static void Callback (IAsyncResult result) {
\r
646 AsyncContext context = (AsyncContext) result.AsyncState;
\r
647 context.AsyncCallback.Invoke (context.DelegateAsyncResult);
\r
650 public Delegate AsyncDelegate {
\r
651 get { return AsyncContext.AsyncDelegate; }
\r
654 #region IAsyncResult Members
\r
656 public object AsyncState {
\r
657 get { return AsyncContext.AsyncState; }
\r
660 public WaitHandle AsyncWaitHandle {
\r
661 get { return _asyncResult.AsyncWaitHandle; }
\r
664 public bool CompletedSynchronously {
\r
665 get { return _asyncResult.CompletedSynchronously; }
\r
668 public bool IsCompleted {
\r
669 get { return _asyncResult.IsCompleted; }
\r
675 WebResponse GetAsyncResponse()
\r
678 return GetResponse ();
\r
685 public override WebResponse GetResponse()
\r
690 throw new WebException ("The operation has been aborted.", WebExceptionStatus.RequestCanceled);
\r
691 if(!_isConnectionOpened)
\r
693 if(_response == null)
\r
698 InternalExecuteMethod ();
\r
699 int numOfRedirects = 0;
\r
700 while (isRedirectNeeded (_method) && _allowAutoRedirect && numOfRedirects < MaxAutoRedirections) {
\r
701 if (!HandleManualyRedirect ())
\r
706 //todo right place to re-put all headers again...
\r
707 mainsoft.apache.commons.httpclient.Header hostHeader =
\r
708 _method.getRequestHeader("Host");
\r
709 if(hostHeader != null)
\r
710 Headers.SetInternal("Host", hostHeader.getValue());
\r
712 _response = new HttpWebResponse(_method, _state, _stateCache, GetAddress(), this.MethodName);
\r
714 if(_response != null &&
\r
715 _response.Cookies != null &&
\r
716 _response.Cookies.Count > 0)
\r
718 if(CookieContainer != null)
\r
720 foreach(Cookie cooky in _response.Cookies)
\r
722 CookieContainer.Add(GetAddress(), cooky);
\r
727 _hasResponse = true;
\r
728 int respCodeAsInt = (int) _response.StatusCode;
\r
729 if(respCodeAsInt >= 400)
\r
731 // The WebException contains the readable (not closed) response stream.
\r
732 // So, in case of WebException, we should read all data from the
\r
733 // network response stream into the memory stream, and after that
\r
734 // close the underlying network stream. The following requests to read
\r
735 // from the stream will actually read from the memory stream.
\r
736 // So, the this.Abort() should not be called in this case.
\r
737 _response.ReadAllAndClose();
\r
739 throw new WebException("The remote server returned an error: (" + respCodeAsInt +") " +_response.StatusCode, null, WebExceptionStatus.ProtocolError, _response);
\r
741 Header location = _method.getResponseHeader ("location");
\r
742 if (isRedirectNeeded (_method) && location == null && _method.getFollowRedirects ())
\r
744 // See comments above for the error >= 400
\r
745 _response.ReadAllAndClose();
\r
747 throw new WebException("Got response code "+_response.StatusCode+", but no location provided", null, WebExceptionStatus.ProtocolError, _response);
\r
750 catch(ProtocolException e)
\r
752 throw new WebException("", e);
\r
754 catch(java.net.ConnectException e)
\r
756 throw new WebException("Unable to connect to the remote server.", e);
\r
758 catch(java.net.SocketTimeoutException e)
\r
760 throw new WebException("Timeout exceeded", e);
\r
762 catch(java.io.IOException e)
\r
764 throw new WebException("", e);
\r
772 private void InternalExecuteMethod () {
\r
773 _client.executeMethod (_hostConfig, _method, _state);
\r
776 private bool HandleManualyRedirect () {
\r
777 Header redirectHeader = _method.getResponseHeader ("location");
\r
778 if (redirectHeader == null) {
\r
779 // See comments above for the error >= 400
\r
780 _response.ReadAllAndClose ();
\r
782 throw new WebException ("Got response code " + _response.StatusCode + ", but no location provided", null, WebExceptionStatus.ProtocolError, _response);
\r
785 mainsoft.apache.commons.httpclient.HttpMethod originalMethod = _method;
\r
787 string location = redirectHeader.getValue ();
\r
788 URI currentUri = _method.getURI ();
\r
789 URI redirectUri = null;
\r
791 redirectUri = new URI (location, true);
\r
792 if (redirectUri.isRelativeURI ()) {
\r
793 //location is incomplete, use current values for defaults
\r
794 redirectUri = new URI (currentUri, redirectUri);
\r
797 _method = new GetMethod ();
\r
798 foreach(Header h in originalMethod.getRequestHeaders())
\r
799 _method.addRequestHeader(h);
\r
800 _method.setURI (redirectUri);
\r
801 InternalExecuteMethod ();
\r
804 catch (URIException e) {
\r
805 _method = originalMethod;
\r
810 public override void Abort()
\r
817 if (_hasResponse) {
\r
818 _response.Close ();
\r
822 if (_method != null)
\r
823 _method.releaseConnection ();
\r
825 _hasResponse = false;
\r
831 public override IAsyncResult BeginGetRequestStream(AsyncCallback callback, object state)
\r
835 if(_asyncWrite != null)
\r
837 throw new InvalidOperationException ("Cannot re-call start of asynchronous " +
\r
838 "method while a previous call is still in progress.");
\r
841 _asyncWrite = new GHWebAsyncResult (this, callback, state);
\r
844 if (_writeStream != null)
\r
846 _asyncWrite.SetCompleted (true, _writeStream);
\r
847 _asyncWrite.DoCallback ();
\r
848 return _asyncWrite;
\r
855 this.GetRequestStream();
\r
859 _asyncWrite.SetCompleted(false, e);
\r
860 _asyncWrite.DoCallback ();
\r
861 return _asyncWrite;
\r
864 _asyncWrite.SetCompleted (true, _writeStream);
\r
865 _asyncWrite.DoCallback ();
\r
866 return _asyncWrite;
\r
871 public override Stream EndGetRequestStream(IAsyncResult asyncResult)
\r
873 if (asyncResult == null)
\r
874 throw new ArgumentNullException ("asyncResult");
\r
876 GHWebAsyncResult result = asyncResult as GHWebAsyncResult;
\r
877 if (result == null)
\r
878 throw new ArgumentException ("Invalid IAsyncResult");
\r
880 _asyncWrite = result;
\r
882 result.WaitUntilComplete ();
\r
884 Exception e = result.Exception;
\r
889 return result.WriteStream;
\r
892 public override IAsyncResult BeginGetResponse(AsyncCallback callback, object state)
\r
894 GetResponseDelegate d = new GetResponseDelegate (GetAsyncResponse);
\r
895 DelegateAsyncResult result = new DelegateAsyncResult ();
\r
896 AsyncContext userContext = new AsyncContext (d, result, callback, state);
\r
897 result.AsyncResult = d.BeginInvoke (new AsyncCallback (DelegateAsyncResult.Callback), userContext);
\r
901 public override WebResponse EndGetResponse(IAsyncResult asyncResult)
\r
904 throw new WebException ("The operation has been aborted.", WebExceptionStatus.RequestCanceled);
\r
905 if (asyncResult == null)
\r
906 throw new ArgumentNullException ("asyncResult");
\r
908 DelegateAsyncResult result = asyncResult as DelegateAsyncResult;
\r
909 if (result == null)
\r
910 throw new ArgumentException ("Invalid IAsyncResult", "asyncResult");
\r
912 return ((GetResponseDelegate) result.AsyncDelegate).EndInvoke (result.AsyncResult);
\r
926 #region VMWRequestStream class
\r
927 internal class VMWRequestStream : Stream, IDisposable
\r
930 private java.io.OutputStream _javaOutput;
\r
932 private long _contentLength;
\r
934 internal VMWRequestStream (java.io.OutputStream stream) :
\r
939 internal VMWRequestStream (java.io.OutputStream stream, long contentLength)
\r
941 _javaOutput = stream;
\r
942 _contentLength = contentLength;
\r
945 public override bool CanRead
\r
947 get {return false;}
\r
950 public override bool CanWrite
\r
955 public override bool CanSeek
\r
957 get { return false;}
\r
960 public override long Length
\r
965 public override long Position
\r
974 throw new NotSupportedException();
\r
978 private volatile bool _closed = false;
\r
980 public override void Close()
\r
990 _javaOutput.close ();
\r
992 catch (Exception e) {
\r
993 throw new WebException ("The request was aborted: The request was canceled.",
\r
994 e, WebExceptionStatus.RequestCanceled, null);
\r
1001 public override void Flush()
\r
1003 _javaOutput.flush();
\r
1006 public override int ReadByte()
\r
1008 throw new NotSupportedException();
\r
1011 public override int Read(byte[] buffer, int offset, int count)
\r
1013 throw new NotSupportedException();
\r
1016 public override void Write(byte[] buffer, int offset, int count)
\r
1018 if(_contentLength >= 0)
\r
1021 if(_len > _contentLength)
\r
1023 throw new System.Net.ProtocolViolationException(
\r
1024 "Bytes to be written to the stream exceed Content-Length bytes size specified.");
\r
1027 _javaOutput.write(vmw.common.TypeUtils.ToSByteArray(buffer), offset, count);
\r
1029 if(_contentLength == _len)
\r
1031 _javaOutput.flush();
\r
1032 _javaOutput.close();
\r
1036 public override long Seek(long offset, SeekOrigin origin)
\r
1038 throw new NotSupportedException();
\r
1041 public override void SetLength(long length)
\r
1043 throw new NotSupportedException();
\r
1046 void IDisposable.Dispose()
\r
1054 #region GHWebAsyncResult
\r
1055 internal class GHWebAsyncResult : IAsyncResult
\r
1057 private object _state;
\r
1058 private AsyncCallback _callback;
\r
1059 private ManualResetEvent _handle;
\r
1060 private bool _isCompleted = false;
\r
1061 private bool _callbackDone;
\r
1062 private Stream _writeStream;
\r
1063 private HttpProvider _provider;
\r
1065 private Exception _exception;
\r
1067 #region Constructors
\r
1069 public GHWebAsyncResult(HttpProvider provider,
\r
1070 AsyncCallback callback, object state) :
\r
1071 this(state, callback)
\r
1073 _provider = provider;
\r
1076 public GHWebAsyncResult(object state, AsyncCallback callback)
\r
1079 _callback = callback;
\r
1083 #region IAsyncResult Members
\r
1085 public object AsyncState
\r
1093 public bool CompletedSynchronously
\r
1097 // TODO: Add HWebAsyncResult.CompletedSynchronously getter implementation
\r
1102 public WaitHandle AsyncWaitHandle
\r
1106 if (_handle == null)
\r
1110 if (_handle == null)
\r
1111 _handle = new ManualResetEvent (_isCompleted);
\r
1119 public bool IsCompleted
\r
1123 return _isCompleted;
\r
1129 #region Internal Properties
\r
1131 internal Stream WriteStream
\r
1135 return _writeStream;
\r
1139 internal Exception Exception
\r
1143 return _exception;
\r
1147 internal HttpWebResponse Response
\r
1151 return ((VMWHttpProvider)_provider)._response;
\r
1157 #region Internal Methods
\r
1159 internal void SetCompleted(bool res, Stream writeStream)
\r
1161 _isCompleted = res;
\r
1162 _writeStream = writeStream;
\r
1163 ((ManualResetEvent) AsyncWaitHandle).Set ();
\r
1166 internal void SetCompleted(bool res, Exception exc)
\r
1168 _isCompleted = res;
\r
1170 ((ManualResetEvent) AsyncWaitHandle).Set ();
\r
1173 internal void DoCallback()
\r
1175 if (!_callbackDone && _callback != null)
\r
1177 _callbackDone = true;
\r
1182 internal void WaitUntilComplete()
\r
1186 AsyncWaitHandle.WaitOne ();
\r
1189 internal bool WaitUntilComplete (int timeout, bool exitContext)
\r
1194 return AsyncWaitHandle.WaitOne (timeout, exitContext);
\r
1202 #region OutputStreamRequestEntity
\r
1204 internal class OutputStreamRequestEntity : java.io.OutputStream, RequestEntity
\r
1206 private long _contentLength;
\r
1207 private java.io.ByteArrayOutputStream _out;
\r
1208 private sbyte[] _buffer;
\r
1210 internal OutputStreamRequestEntity(): this(-1)
\r
1214 internal OutputStreamRequestEntity(long length)
\r
1216 _contentLength = length;
\r
1217 int tmp = (int) _contentLength;
\r
1221 _out = new java.io.ByteArrayOutputStream(tmp);
\r
1224 #region RequestEntity Members
\r
1226 public bool isRepeatable()
\r
1228 return ((_out != null) || (_buffer != null));
\r
1231 public long getContentLength()
\r
1235 _buffer = _out.toByteArray();
\r
1237 if(_buffer != null)
\r
1239 _contentLength = _buffer.Length;
\r
1242 return _contentLength;
\r
1245 public void writeRequest(java.io.OutputStream output)
\r
1248 _buffer = _out.toByteArray();
\r
1249 if(_buffer != null)
\r
1251 output.write(_buffer, 0, _buffer.Length);
\r
1254 else throw new ApplicationException();
\r
1257 public string getContentType()
\r
1264 public override void write(int i)
\r
1269 public override void close ()
\r
1271 int size = _out.size ();
\r
1274 if (size < _contentLength) {
\r
1275 throw new IOException ("Cannot close stream until all bytes are written.");
\r
1290 class HTTPClientCredentialsBridge : CredentialsProvider
\r
1292 private vmw.@internal.auth.CredentialsProvider m_internalProvider;
\r
1294 public HTTPClientCredentialsBridge (vmw.@internal.auth.CredentialsProvider internalProvider) {
\r
1295 m_internalProvider = internalProvider;
\r
1298 public Credentials getCredentials (AuthScheme scheme, string __p2, int __p3, bool __p4) {
\r
1299 if (scheme.isComplete ())
\r
1301 GSSCredential creds = m_internalProvider.getCredentials ();
\r
1302 return new DelegatedCredentials (creds);
\r