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); break;
\r
525 case "POST": _method = new PostMethod(uriString); break;
\r
526 case "HEAD": _method = new HeadMethod(uriString); break;
\r
527 case "TRACE": _method = new TraceMethod(uriString);break;
\r
528 case "DELETE": _method = new DeleteMethod(uriString);break;
\r
529 case "OPTIONS": _method = new OptionsMethod(uriString);break;
\r
530 default: _method = new GenericMethod(uriString, MethodName); break;
\r
536 private void InitHostConfiguration()
\r
540 if(_hostConfig == null)
\r
542 _hostConfig = new HostConfiguration();
\r
549 public override Stream GetRequestStream()
\r
551 bool isPutPost = String.Compare("post", MethodName, true) == 0
\r
552 || String.Compare("put", MethodName, true) == 0;
\r
554 throw new ProtocolViolationException();
\r
558 throw new WebException ("The operation has been aborted.", WebExceptionStatus.RequestCanceled);
\r
559 if(_writeStream != null)
\r
560 return _writeStream;
\r
561 this.OpenConnection();
\r
563 //java.io.PipedInputStream inJavaStream = new java.io.PipedInputStream();
\r
564 //java.io.PipedOutputStream outJavaStream = new java.io.PipedOutputStream(inJavaStream);
\r
566 long contLen = _contentLength;
\r
568 OutputStreamRequestEntity reqEntity = new OutputStreamRequestEntity(contLen);
\r
570 _writeStream = new VMWRequestStream(reqEntity, contLen);
\r
572 EntityEnclosingMethod method = (EntityEnclosingMethod)_method;
\r
573 if(AllowWriteStreamBuffering )
\r
574 method.setRequestEntity(reqEntity);
\r
575 else if(!AllowWriteStreamBuffering && contLen < 0 && !SendChunked)
\r
576 throw new ProtocolViolationException();
\r
578 method.setRequestEntity(reqEntity);
\r
580 _hasRequest = true;
\r
581 return _writeStream;
\r
584 private static bool isRedirectNeeded(HttpMethod method)
\r
586 switch (method.getStatusCode())
\r
598 private void synchHeaders()
\r
600 foreach(string k in Headers)
\r
602 if (String.Compare (k, "connection", StringComparison.InvariantCultureIgnoreCase) == 0)
\r
604 string val = Headers[k];
\r
605 val = (val == null) ? "" : val;
\r
606 _method.setRequestHeader(k, val);
\r
610 delegate WebResponse GetResponseDelegate();
\r
611 private sealed class AsyncContext
\r
613 public readonly AsyncCallback AsyncCallback;
\r
614 public readonly Delegate AsyncDelegate;
\r
615 public readonly object AsyncState;
\r
616 public readonly DelegateAsyncResult DelegateAsyncResult;
\r
618 public AsyncContext (Delegate @delegate, DelegateAsyncResult delegateAsyncResult, AsyncCallback asyncCallback, object userState) {
\r
619 AsyncDelegate = @delegate;
\r
620 AsyncCallback = asyncCallback;
\r
621 AsyncState = userState;
\r
622 DelegateAsyncResult = delegateAsyncResult;
\r
625 private sealed class DelegateAsyncResult : IAsyncResult
\r
628 IAsyncResult _asyncResult;
\r
630 public IAsyncResult AsyncResult {
\r
631 get { return _asyncResult; }
\r
632 set { _asyncResult = value; }
\r
635 AsyncContext AsyncContext {
\r
636 get { return (AsyncContext) _asyncResult.AsyncState; }
\r
639 public static void Callback (IAsyncResult result) {
\r
640 AsyncContext context = (AsyncContext) result.AsyncState;
\r
641 context.AsyncCallback.Invoke (context.DelegateAsyncResult);
\r
644 public Delegate AsyncDelegate {
\r
645 get { return AsyncContext.AsyncDelegate; }
\r
648 #region IAsyncResult Members
\r
650 public object AsyncState {
\r
651 get { return AsyncContext.AsyncState; }
\r
654 public WaitHandle AsyncWaitHandle {
\r
655 get { return _asyncResult.AsyncWaitHandle; }
\r
658 public bool CompletedSynchronously {
\r
659 get { return _asyncResult.CompletedSynchronously; }
\r
662 public bool IsCompleted {
\r
663 get { return _asyncResult.IsCompleted; }
\r
669 WebResponse GetAsyncResponse()
\r
672 return GetResponse ();
\r
679 public override WebResponse GetResponse()
\r
684 throw new WebException ("The operation has been aborted.", WebExceptionStatus.RequestCanceled);
\r
685 if(!_isConnectionOpened)
\r
687 if(_response == null)
\r
692 InternalExecuteMethod ();
\r
693 int numOfRedirects = 0;
\r
694 while (isRedirectNeeded (_method) && _allowAutoRedirect && numOfRedirects < MaxAutoRedirections) {
\r
695 if (!HandleManualyRedirect ())
\r
700 //todo right place to re-put all headers again...
\r
701 mainsoft.apache.commons.httpclient.Header hostHeader =
\r
702 _method.getRequestHeader("Host");
\r
703 if(hostHeader != null)
\r
704 Headers.SetInternal("Host", hostHeader.getValue());
\r
706 _response = new HttpWebResponse(_method, _state, _stateCache, GetAddress(), this.MethodName);
\r
708 if(_response != null &&
\r
709 _response.Cookies != null &&
\r
710 _response.Cookies.Count > 0)
\r
712 if(CookieContainer != null)
\r
714 foreach(Cookie cooky in _response.Cookies)
\r
716 CookieContainer.Add(GetAddress(), cooky);
\r
721 _hasResponse = true;
\r
722 int respCodeAsInt = (int) _response.StatusCode;
\r
723 if(respCodeAsInt >= 400)
\r
725 // The WebException contains the readable (not closed) response stream.
\r
726 // So, in case of WebException, we should read all data from the
\r
727 // network response stream into the memory stream, and after that
\r
728 // close the underlying network stream. The following requests to read
\r
729 // from the stream will actually read from the memory stream.
\r
730 // So, the this.Abort() should not be called in this case.
\r
731 _response.ReadAllAndClose();
\r
733 throw new WebException("The remote server returned an error: (" + respCodeAsInt +") " +_response.StatusCode, null, WebExceptionStatus.ProtocolError, _response);
\r
735 Header location = _method.getResponseHeader ("location");
\r
736 if (isRedirectNeeded (_method) && location == null && _method.getFollowRedirects ())
\r
738 // See comments above for the error >= 400
\r
739 _response.ReadAllAndClose();
\r
741 throw new WebException("Got response code "+_response.StatusCode+", but no location provided", null, WebExceptionStatus.ProtocolError, _response);
\r
744 catch(ProtocolException e)
\r
746 throw new WebException("", e);
\r
748 catch(java.net.ConnectException e)
\r
750 throw new WebException("Unable to connect to the remote server.", e);
\r
752 catch(java.net.SocketTimeoutException e)
\r
754 throw new WebException("Timeout exceeded", e);
\r
756 catch(java.io.IOException e)
\r
758 throw new WebException("", e);
\r
766 private void InternalExecuteMethod () {
\r
767 _client.executeMethod (_hostConfig, _method, _state);
\r
770 private bool HandleManualyRedirect () {
\r
771 Header redirectHeader = _method.getResponseHeader ("location");
\r
772 if (redirectHeader == null) {
\r
773 // See comments above for the error >= 400
\r
774 _response.ReadAllAndClose ();
\r
776 throw new WebException ("Got response code " + _response.StatusCode + ", but no location provided", null, WebExceptionStatus.ProtocolError, _response);
\r
779 mainsoft.apache.commons.httpclient.HttpMethod originalMethod = _method;
\r
781 string location = redirectHeader.getValue ();
\r
782 URI currentUri = _method.getURI ();
\r
783 URI redirectUri = null;
\r
785 redirectUri = new URI (location, true);
\r
786 if (redirectUri.isRelativeURI ()) {
\r
787 //location is incomplete, use current values for defaults
\r
788 redirectUri = new URI (currentUri, redirectUri);
\r
791 _method = new GetMethod ();
\r
792 foreach(Header h in originalMethod.getRequestHeaders())
\r
793 _method.addRequestHeader(h);
\r
794 _method.setURI (redirectUri);
\r
795 InternalExecuteMethod ();
\r
798 catch (URIException e) {
\r
799 _method = originalMethod;
\r
804 public override void Abort()
\r
811 if (_hasResponse) {
\r
812 _response.Close ();
\r
816 if (_method != null)
\r
817 _method.releaseConnection ();
\r
819 _hasResponse = false;
\r
825 public override IAsyncResult BeginGetRequestStream(AsyncCallback callback, object state)
\r
829 if(_asyncWrite != null)
\r
831 throw new InvalidOperationException ("Cannot re-call start of asynchronous " +
\r
832 "method while a previous call is still in progress.");
\r
835 _asyncWrite = new GHWebAsyncResult (this, callback, state);
\r
838 if (_writeStream != null)
\r
840 _asyncWrite.SetCompleted (true, _writeStream);
\r
841 _asyncWrite.DoCallback ();
\r
842 return _asyncWrite;
\r
849 this.GetRequestStream();
\r
853 _asyncWrite.SetCompleted(false, e);
\r
854 _asyncWrite.DoCallback ();
\r
855 return _asyncWrite;
\r
858 _asyncWrite.SetCompleted (true, _writeStream);
\r
859 _asyncWrite.DoCallback ();
\r
860 return _asyncWrite;
\r
865 public override Stream EndGetRequestStream(IAsyncResult asyncResult)
\r
867 if (asyncResult == null)
\r
868 throw new ArgumentNullException ("asyncResult");
\r
870 GHWebAsyncResult result = asyncResult as GHWebAsyncResult;
\r
871 if (result == null)
\r
872 throw new ArgumentException ("Invalid IAsyncResult");
\r
874 _asyncWrite = result;
\r
876 result.WaitUntilComplete ();
\r
878 Exception e = result.Exception;
\r
883 return result.WriteStream;
\r
886 public override IAsyncResult BeginGetResponse(AsyncCallback callback, object state)
\r
888 GetResponseDelegate d = new GetResponseDelegate (GetAsyncResponse);
\r
889 DelegateAsyncResult result = new DelegateAsyncResult ();
\r
890 AsyncContext userContext = new AsyncContext (d, result, callback, state);
\r
891 result.AsyncResult = d.BeginInvoke (new AsyncCallback (DelegateAsyncResult.Callback), userContext);
\r
895 public override WebResponse EndGetResponse(IAsyncResult asyncResult)
\r
898 throw new WebException ("The operation has been aborted.", WebExceptionStatus.RequestCanceled);
\r
899 if (asyncResult == null)
\r
900 throw new ArgumentNullException ("asyncResult");
\r
902 DelegateAsyncResult result = asyncResult as DelegateAsyncResult;
\r
903 if (result == null)
\r
904 throw new ArgumentException ("Invalid IAsyncResult", "asyncResult");
\r
906 return ((GetResponseDelegate) result.AsyncDelegate).EndInvoke (result.AsyncResult);
\r
920 #region VMWRequestStream class
\r
921 internal class VMWRequestStream : Stream, IDisposable
\r
924 private java.io.OutputStream _javaOutput;
\r
926 private long _contentLength;
\r
928 internal VMWRequestStream (java.io.OutputStream stream) :
\r
933 internal VMWRequestStream (java.io.OutputStream stream, long contentLength)
\r
935 _javaOutput = stream;
\r
936 _contentLength = contentLength;
\r
939 public override bool CanRead
\r
941 get {return false;}
\r
944 public override bool CanWrite
\r
949 public override bool CanSeek
\r
951 get { return false;}
\r
954 public override long Length
\r
959 public override long Position
\r
968 throw new NotSupportedException();
\r
972 private volatile bool _closed = false;
\r
974 public override void Close()
\r
984 _javaOutput.close ();
\r
986 catch (Exception e) {
\r
987 throw new WebException ("The request was aborted: The request was canceled.",
\r
988 e, WebExceptionStatus.RequestCanceled, null);
\r
995 public override void Flush()
\r
997 _javaOutput.flush();
\r
1000 public override int ReadByte()
\r
1002 throw new NotSupportedException();
\r
1005 public override int Read(byte[] buffer, int offset, int count)
\r
1007 throw new NotSupportedException();
\r
1010 public override void Write(byte[] buffer, int offset, int count)
\r
1012 if(_contentLength >= 0)
\r
1015 if(_len > _contentLength)
\r
1017 throw new System.Net.ProtocolViolationException(
\r
1018 "Bytes to be written to the stream exceed Content-Length bytes size specified.");
\r
1021 _javaOutput.write(vmw.common.TypeUtils.ToSByteArray(buffer), offset, count);
\r
1023 if(_contentLength == _len)
\r
1025 _javaOutput.flush();
\r
1026 _javaOutput.close();
\r
1030 public override long Seek(long offset, SeekOrigin origin)
\r
1032 throw new NotSupportedException();
\r
1035 public override void SetLength(long length)
\r
1037 throw new NotSupportedException();
\r
1040 void IDisposable.Dispose()
\r
1048 #region GHWebAsyncResult
\r
1049 internal class GHWebAsyncResult : IAsyncResult
\r
1051 private object _state;
\r
1052 private AsyncCallback _callback;
\r
1053 private ManualResetEvent _handle;
\r
1054 private bool _isCompleted = false;
\r
1055 private bool _callbackDone;
\r
1056 private Stream _writeStream;
\r
1057 private HttpProvider _provider;
\r
1059 private Exception _exception;
\r
1061 #region Constructors
\r
1063 public GHWebAsyncResult(HttpProvider provider,
\r
1064 AsyncCallback callback, object state) :
\r
1065 this(state, callback)
\r
1067 _provider = provider;
\r
1070 public GHWebAsyncResult(object state, AsyncCallback callback)
\r
1073 _callback = callback;
\r
1077 #region IAsyncResult Members
\r
1079 public object AsyncState
\r
1087 public bool CompletedSynchronously
\r
1091 // TODO: Add HWebAsyncResult.CompletedSynchronously getter implementation
\r
1096 public WaitHandle AsyncWaitHandle
\r
1100 if (_handle == null)
\r
1104 if (_handle == null)
\r
1105 _handle = new ManualResetEvent (_isCompleted);
\r
1113 public bool IsCompleted
\r
1117 return _isCompleted;
\r
1123 #region Internal Properties
\r
1125 internal Stream WriteStream
\r
1129 return _writeStream;
\r
1133 internal Exception Exception
\r
1137 return _exception;
\r
1141 internal HttpWebResponse Response
\r
1145 return ((VMWHttpProvider)_provider)._response;
\r
1151 #region Internal Methods
\r
1153 internal void SetCompleted(bool res, Stream writeStream)
\r
1155 _isCompleted = res;
\r
1156 _writeStream = writeStream;
\r
1157 ((ManualResetEvent) AsyncWaitHandle).Set ();
\r
1160 internal void SetCompleted(bool res, Exception exc)
\r
1162 _isCompleted = res;
\r
1164 ((ManualResetEvent) AsyncWaitHandle).Set ();
\r
1167 internal void DoCallback()
\r
1169 if (!_callbackDone && _callback != null)
\r
1171 _callbackDone = true;
\r
1176 internal void WaitUntilComplete()
\r
1180 AsyncWaitHandle.WaitOne ();
\r
1183 internal bool WaitUntilComplete (int timeout, bool exitContext)
\r
1188 return AsyncWaitHandle.WaitOne (timeout, exitContext);
\r
1196 #region OutputStreamRequestEntity
\r
1198 internal class OutputStreamRequestEntity : java.io.OutputStream, RequestEntity
\r
1200 private long _contentLength;
\r
1201 private java.io.ByteArrayOutputStream _out;
\r
1202 private sbyte[] _buffer;
\r
1204 internal OutputStreamRequestEntity(): this(-1)
\r
1208 internal OutputStreamRequestEntity(long length)
\r
1210 _contentLength = length;
\r
1211 int tmp = (int) _contentLength;
\r
1215 _out = new java.io.ByteArrayOutputStream(tmp);
\r
1218 #region RequestEntity Members
\r
1220 public bool isRepeatable()
\r
1222 return ((_out != null) || (_buffer != null));
\r
1225 public long getContentLength()
\r
1229 _buffer = _out.toByteArray();
\r
1231 if(_buffer != null)
\r
1233 _contentLength = _buffer.Length;
\r
1236 return _contentLength;
\r
1239 public void writeRequest(java.io.OutputStream output)
\r
1242 _buffer = _out.toByteArray();
\r
1243 if(_buffer != null)
\r
1245 output.write(_buffer, 0, _buffer.Length);
\r
1248 else throw new ApplicationException();
\r
1251 public string getContentType()
\r
1258 public override void write(int i)
\r
1263 public override void close ()
\r
1265 int size = _out.size ();
\r
1268 if (size < _contentLength) {
\r
1269 throw new IOException ("Cannot close stream until all bytes are written.");
\r
1284 class HTTPClientCredentialsBridge : CredentialsProvider
\r
1286 private vmw.@internal.auth.CredentialsProvider m_internalProvider;
\r
1288 public HTTPClientCredentialsBridge (vmw.@internal.auth.CredentialsProvider internalProvider) {
\r
1289 m_internalProvider = internalProvider;
\r
1292 public Credentials getCredentials (AuthScheme scheme, string __p2, int __p3, bool __p4) {
\r
1293 if (scheme.isComplete ())
\r
1295 GSSCredential creds = m_internalProvider.getCredentials ();
\r
1296 return new DelegatedCredentials (creds);
\r