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
10 namespace System.Net
\r
13 /// Summary description for VMWHttpProvider.
\r
15 internal class VMWHttpProvider : HttpProvider
\r
17 protected static HttpClient _client; //todo init it in static constructor
\r
18 protected static HttpStateCache _stateCache = new HttpStateCache();
\r
20 protected static object LOCK_OBJECT = new object();
\r
24 protected HttpMethod _method;
\r
25 protected HttpState _state;
\r
26 protected HostConfiguration _hostConfig;
\r
28 protected HttpWebResponse _response;
\r
29 protected bool _hasResponse;
\r
30 protected bool _hasRequest;
\r
31 protected Stream _writeStream;
\r
32 private GHWebAsyncResult _asyncWrite;
\r
33 private GHWebAsyncResult _asyncRead;
\r
35 private bool _isConnectionOpened;
\r
37 static VMWHttpProvider()
\r
39 if(java.lang.System.getProperty("mainsoft.apache.commons.logging.Log") == null)
\r
40 java.lang.System.setProperty("mainsoft.apache.commons.logging.Log",
\r
41 "mainsoft.apache.commons.logging.impl.SimpleLog");
\r
42 if(java.lang.System.getProperty("mainsoft.apache.commons.logging.simplelog.showdatetime") == null)
\r
43 java.lang.System.setProperty("mainsoft.apache.commons.logging.simplelog.showdatetime",
\r
45 if(java.lang.System.getProperty("mainsoft.apache.commons.logging.simplelog.log.httpclient.wire") == null)
\r
46 java.lang.System.setProperty("mainsoft.apache.commons.logging.simplelog.log.httpclient.wire",
\r
48 if(java.lang.System.getProperty("mainsoft.apache.commons.logging.simplelog.log.mainsoft.apache.commons.httpclient")
\r
50 java.lang.System.setProperty("mainsoft.apache.commons.logging.simplelog.log.mainsoft.apache.commons.httpclient",
\r
52 if(java.lang.System.getProperty("mainsoft.apache.commons.logging.simplelog.log.httpclient.wire.header")
\r
54 java.lang.System.setProperty("mainsoft.apache.commons.logging.simplelog.log.httpclient.wire.header",
\r
58 public VMWHttpProvider(Uri uri) : base (uri)
\r
62 internal override ServicePoint ServicePoint
\r
64 get {throw new NotImplementedException();}
\r
69 public override bool IsRequestStarted()
\r
73 return _method.isRequestSent();
\r
76 public override Uri GetAddress()
\r
79 return GetOriginalAddress();
\r
80 mainsoft.apache.commons.httpclient.URI javaURI = _method.getURI();
\r
81 return new Uri(javaURI.ToString());
\r
84 public override bool IsHaveResponse()
\r
86 return _hasResponse;
\r
89 private void SetJavaCredential(NetworkCredential nc, string type)
\r
91 SetJavaCredential(nc, type, false);
\r
94 private void SetJavaCredential(NetworkCredential nc, string type, bool proxyCredentials)
\r
96 type = type.ToLower();
\r
99 if(!proxyCredentials)
\r
100 host = GetOriginalAddress().Host;
\r
102 host = ((WebProxy)this.Proxy).Address.Host;
\r
104 string domain = (nc.Domain == null) ? host : nc.Domain;
\r
106 if(type.Equals("any"))
\r
108 if(!proxyCredentials)
\r
110 _state.setCredentials(AuthScope.ANY,
\r
111 new UsernamePasswordCredentials(nc.UserName, nc.Password));
\r
112 _state.setCredentials(new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT, AuthScope.ANY_REALM, "Ntlm"),
\r
113 new NTCredentials(nc.UserName, nc.Password, host, domain));
\r
117 _state.setProxyCredentials(AuthScope.ANY,
\r
118 new UsernamePasswordCredentials(nc.UserName, nc.Password));
\r
119 _state.setProxyCredentials(new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT, AuthScope.ANY_REALM, "Ntlm"),
\r
120 new NTCredentials(nc.UserName, nc.Password, host, domain));
\r
123 else if(type.Equals("basic"))
\r
125 if(!proxyCredentials)
\r
127 _state.setCredentials(new AuthScope(AuthScope.ANY_HOST,
\r
128 AuthScope.ANY_PORT, AuthScope.ANY_REALM, "basic"),
\r
129 new UsernamePasswordCredentials(nc.UserName, nc.Password));
\r
133 _state.setProxyCredentials(new AuthScope(AuthScope.ANY_HOST,
\r
134 AuthScope.ANY_PORT, AuthScope.ANY_REALM, "basic"),
\r
135 new UsernamePasswordCredentials(nc.UserName, nc.Password));
\r
138 else if(type.Equals("digest"))
\r
140 if(!proxyCredentials)
\r
142 _state.setCredentials(new AuthScope(AuthScope.ANY_HOST,
\r
143 AuthScope.ANY_PORT, AuthScope.ANY_REALM, "digest"),
\r
144 new UsernamePasswordCredentials(nc.UserName, nc.Password));
\r
148 _state.setProxyCredentials(new AuthScope(AuthScope.ANY_HOST,
\r
149 AuthScope.ANY_PORT, AuthScope.ANY_REALM, "digest"),
\r
150 new UsernamePasswordCredentials(nc.UserName, nc.Password));
\r
153 else if(type.Equals("ntlm"))
\r
155 if(!proxyCredentials)
\r
157 _state.setCredentials(new AuthScope(AuthScope.ANY_HOST,
\r
158 AuthScope.ANY_PORT, AuthScope.ANY_REALM, "ntlm"),
\r
159 new NTCredentials(nc.UserName, nc.Password, host, domain));
\r
163 _state.setProxyCredentials(new AuthScope(AuthScope.ANY_HOST,
\r
164 AuthScope.ANY_PORT, AuthScope.ANY_REALM, "ntlm"),
\r
165 new NTCredentials(nc.UserName, nc.Password, host, domain));
\r
170 if(!proxyCredentials)
\r
172 _state.setCredentials(new AuthScope(AuthScope.ANY_HOST,
\r
173 AuthScope.ANY_PORT, AuthScope.ANY_REALM, type),
\r
174 new UsernamePasswordCredentials(nc.UserName, nc.Password));
\r
178 _state.setProxyCredentials(new AuthScope(AuthScope.ANY_HOST,
\r
179 AuthScope.ANY_PORT, AuthScope.ANY_REALM, type),
\r
180 new UsernamePasswordCredentials(nc.UserName, nc.Password));
\r
185 private void InitProxyCredentials()
\r
187 if(this.Proxy == null)
\r
190 if(!(this.Proxy is WebProxy))
\r
193 WebProxy proxy = (WebProxy)this.Proxy;
\r
194 ICredentials creds = proxy.Credentials;
\r
199 if(creds is CredentialCache)
\r
201 string type = "basic";
\r
202 NetworkCredential nc = ((CredentialCache)creds).GetCredential(proxy.Address, "basic");
\r
206 nc = ((CredentialCache)creds).GetCredential(proxy.Address, "digest");
\r
210 nc = ((CredentialCache)creds).GetCredential(proxy.Address, "ntlm");
\r
215 SetJavaCredential(nc, type, true);
\r
218 else if (creds is NetworkCredential)
\r
220 SetJavaCredential((NetworkCredential)creds, "any", true);
\r
223 _method.setDoAuthentication(true);
\r
226 private void InitCredentials()
\r
228 if(_credentials == null)
\r
230 if(_credentials is CredentialCache)
\r
232 NetworkCredential nc = ((CredentialCache)_credentials).GetCredential(GetOriginalAddress(), "basic");
\r
233 string type = "basic";
\r
236 nc = ((CredentialCache)_credentials).GetCredential(GetOriginalAddress(), "digest");
\r
240 nc = ((CredentialCache)_credentials).GetCredential(GetOriginalAddress(), "ntlm");
\r
246 SetJavaCredential(nc, type);
\r
249 else if(_credentials is NetworkCredential)
\r
251 SetJavaCredential((NetworkCredential)_credentials, "any");
\r
254 _method.setDoAuthentication(true);
\r
257 private void InitHostConfig()
\r
259 if(this.Proxy == null)
\r
261 if(this.Proxy.IsBypassed(GetOriginalAddress()))
\r
264 _hostConfig = new HostConfiguration();
\r
265 _hostConfig.setHost(new HttpHost(_method.getURI()));
\r
268 if(this.Proxy is WebProxy)
\r
270 WebProxy wp = (WebProxy) this.Proxy;
\r
271 _hostConfig.setProxyHost(new ProxyHost(wp.Address.Host, wp.Address.Port));
\r
274 throw new NotImplementedException("Cannot accept Proxy which is not System.Net.WebProxy instance");
\r
279 private void SetConnectionHeader(string val)
\r
281 string connectionHeader = (this.Proxy != null) ? "Proxy-Connection" : "Connection";
\r
282 Headers.RemoveInternal ((this.Proxy != null) ? "Proxy-Connection" : "Connection");
\r
285 _method.setRequestHeader(connectionHeader, val);
\r
289 _method.addRequestHeader (connectionHeader, "keep-alive");
\r
290 Headers.SetInternal(connectionHeader,"keep-alive");
\r
292 else if (!_keepAlive && _version == HttpVersion.Version11)
\r
294 _method.addRequestHeader (connectionHeader, "close");
\r
295 Headers.SetInternal(connectionHeader,"close");
\r
299 private bool OpenConnection()
\r
303 if(_isConnectionOpened)
\r
305 _isConnectionOpened = true;
\r
310 _state = _stateCache.GetHttpState();
\r
312 //todo insert needed Authontication, Cookies info to state!
\r
313 _method.setDoAuthentication(this.PreAuthenticate);
\r
317 InitProxyCredentials();
\r
319 if(this.ProtocolVersion == HttpVersion.Version11)
\r
320 _method.getParams().setVersion(mainsoft.apache.commons.httpclient.HttpVersion.HTTP_1_1);
\r
321 else if(ProtocolVersion == HttpVersion.Version10)
\r
322 _method.getParams().setVersion(mainsoft.apache.commons.httpclient.HttpVersion.HTTP_1_0);
\r
324 throw new ProtocolViolationException("Unsupported protocol version: " + ProtocolVersion);
\r
326 if(!(_method is mainsoft.apache.commons.httpclient.methods.EntityEnclosingMethod))
\r
328 _method.setFollowRedirects(this.AllowAutoRedirect);
\r
332 if(!AllowWriteStreamBuffering && _contentLength < 0 && !SendChunked)
\r
333 throw new ProtocolViolationException();
\r
335 ((EntityEnclosingMethod)_method).setContentChunked(SendChunked);
\r
337 if(MaxAutoRedirections != _defaultMaxRedirectsNum)
\r
339 _method.getParams().setParameter(HttpClientParams.MAX_REDIRECTS,
\r
340 new java.lang.Integer(MaxAutoRedirections));
\r
345 foreach(string k in Headers)
\r
347 if(k.ToLower().Equals("connection"))
\r
349 string val = Headers[k];
\r
350 val = (val == null) ? "" : val;
\r
351 _method.setRequestHeader(k, val);
\r
354 if (this.CookieContainer != null)
\r
356 string cookieHeader = this.CookieContainer.GetCookieHeader (this.GetOriginalAddress());
\r
357 if (cookieHeader != "")
\r
358 _method.setRequestHeader("Cookie", cookieHeader);
\r
360 SetConnectionHeader(Headers["Connection"]);
\r
362 _method.getParams().setSoTimeout(ReadWriteTimeout);
\r
368 private static void InitClient()
\r
372 if(_client == null)
\r
374 mainsoft.apache.commons.httpclient.MultiThreadedHttpConnectionManager manager =
\r
375 new mainsoft.apache.commons.httpclient.MultiThreadedHttpConnectionManager();
\r
376 manager.setConnectionStaleCheckingEnabled(true);
\r
377 manager.setMaxTotalConnections(200);
\r
378 //by some reasons RFC something - the default
\r
379 //value will be 2 , so we need to change it ...
\r
380 manager.setMaxConnectionsPerHost(20);
\r
381 _client = new HttpClient(manager);
\r
382 _client.getParams().setIntParameter(HttpClientParams.MAX_REDIRECTS, _defaultMaxRedirectsNum);
\r
383 _client.getParams().setParameter(HttpClientParams.ALLOW_CIRCULAR_REDIRECTS, new java.lang.Boolean(true));
\r
384 _client.getParams().setParameter(HttpClientParams.CONNECTION_MANAGER_TIMEOUT, new java.lang.Long(30000));
\r
385 _client.getParams().setParameter(HttpClientParams.USER_AGENT,
\r
386 "VMW4J HttpClient (based on Jakarta Commons HttpClient)");
\r
391 private void InitMethod()
\r
395 if(_method == null)
\r
397 string uriString = this.GetOriginalAddress().AbsoluteUri;
\r
399 if(this.MethodName == null || this.MethodName == "")
\r
401 this.MethodName = "GET";
\r
404 string name = this.MethodName.ToUpper().Trim();
\r
408 case "GET" : _method = new GetMethod(uriString); break;
\r
409 case "PUT" : _method = new PutMethod(uriString); break;
\r
410 case "POST": _method = new PostMethod(uriString); break;
\r
411 case "HEAD": _method = new HeadMethod(uriString); break;
\r
412 case "TRACE": _method = new TraceMethod(uriString);break;
\r
413 case "DELETE": _method = new DeleteMethod(uriString);break;
\r
414 case "OPTIONS": _method = new OptionsMethod(uriString);break;
\r
415 default: _method = new GenericMethod(uriString, MethodName); break;
\r
421 private void InitHostConfiguration()
\r
425 if(_hostConfig == null)
\r
427 _hostConfig = new HostConfiguration();
\r
434 public override Stream GetRequestStream()
\r
436 bool isPutPost = String.Compare("post", MethodName, true) == 0
\r
437 || String.Compare("put", MethodName, true) == 0;
\r
439 throw new ProtocolViolationException();
\r
442 if(_writeStream != null)
\r
443 return _writeStream;
\r
444 this.OpenConnection();
\r
446 //java.io.PipedInputStream inJavaStream = new java.io.PipedInputStream();
\r
447 //java.io.PipedOutputStream outJavaStream = new java.io.PipedOutputStream(inJavaStream);
\r
449 long contLen = _contentLength;
\r
451 OutputStreamRequestEntity reqEntity = new OutputStreamRequestEntity(contLen);
\r
453 _writeStream = new VMWRequestStream(reqEntity, contLen);
\r
455 EntityEnclosingMethod method = (EntityEnclosingMethod)_method;
\r
456 if(AllowWriteStreamBuffering )
\r
457 method.setRequestEntity(reqEntity);
\r
458 else if(!AllowWriteStreamBuffering && contLen < 0 && !SendChunked)
\r
459 throw new ProtocolViolationException();
\r
461 method.setRequestEntity(reqEntity);
\r
463 _hasRequest = true;
\r
464 return _writeStream;
\r
467 private bool isRedirectNeeded(HttpMethod method)
\r
469 switch (method.getStatusCode())
\r
475 if (method.getFollowRedirects())
\r
484 private void synchHeaders()
\r
486 foreach(string k in Headers)
\r
488 if(k.ToLower().Equals("connection"))
\r
490 string val = Headers[k];
\r
491 val = (val == null) ? "" : val;
\r
492 _method.setRequestHeader(k, val);
\r
496 public override WebResponse GetResponse()
\r
500 if(!_isConnectionOpened)
\r
502 if(_response == null)
\r
507 _client.executeMethod(_hostConfig, _method, _state);
\r
508 //todo right place to re-put all headers again...
\r
509 mainsoft.apache.commons.httpclient.Header hostHeader =
\r
510 _method.getRequestHeader("Host");
\r
511 if(hostHeader != null)
\r
512 Headers.SetInternal("Host", hostHeader.getValue());
\r
514 _response = new HttpWebResponse(_method, _state, _stateCache, GetAddress(), this.MethodName);
\r
516 if(_response != null &&
\r
517 _response.Cookies != null &&
\r
518 _response.Cookies.Count > 0)
\r
520 if(CookieContainer != null)
\r
522 foreach(Cookie cooky in _response.Cookies)
\r
524 CookieContainer.Add(GetAddress(), cooky);
\r
529 _hasResponse = true;
\r
530 int respCodeAsInt = (int) _response.StatusCode;
\r
531 if(respCodeAsInt >= 400)
\r
533 // The WebException contains the readable (not closed) response stream.
\r
534 // So, in case of WebException, we should read all data from the
\r
535 // network response stream into the memory stream, and after that
\r
536 // close the underlying network stream. The following requests to read
\r
537 // from the stream will actually read from the memory stream.
\r
538 // So, the this.Abort() should not be called in this case.
\r
539 _response.ReadAllAndClose();
\r
541 throw new WebException("The remote server returned an error: (" + respCodeAsInt +") " +_response.StatusCode, null, WebExceptionStatus.ProtocolError, _response);
\r
543 if(isRedirectNeeded(_method) && _method.getResponseHeader("location") == null)
\r
545 // See comments above for the error >= 400
\r
546 _response.ReadAllAndClose();
\r
548 throw new WebException("Got response code "+_response.StatusCode+", but no location provided", null, WebExceptionStatus.ProtocolError, _response);
\r
551 catch(ProtocolException e)
\r
553 throw new WebException("", e);
\r
555 catch(java.net.ConnectException e)
\r
557 throw new WebException("Unable to connect to the remote server.", e);
\r
559 catch(java.net.SocketTimeoutException e)
\r
561 throw new WebException("Timeout exceeded", e);
\r
563 catch(java.io.IOException e)
\r
565 throw new WebException("", e);
\r
573 public override void Abort()
\r
585 _method.releaseConnection();
\r
589 public override IAsyncResult BeginGetRequestStream(AsyncCallback callback, object state)
\r
593 if(_asyncWrite != null)
\r
595 throw new InvalidOperationException ("Cannot re-call start of asynchronous " +
\r
596 "method while a previous call is still in progress.");
\r
599 _asyncWrite = new GHWebAsyncResult (this, callback, state);
\r
602 if (_writeStream != null)
\r
604 _asyncWrite.SetCompleted (true, _writeStream);
\r
605 _asyncWrite.DoCallback ();
\r
606 return _asyncWrite;
\r
613 this.GetRequestStream();
\r
617 _asyncWrite.SetCompleted(false, e);
\r
620 _asyncWrite.SetCompleted (true, _writeStream);
\r
621 _asyncWrite.DoCallback ();
\r
622 return _asyncWrite;
\r
627 public override Stream EndGetRequestStream(IAsyncResult asyncResult)
\r
629 if (asyncResult == null)
\r
630 throw new ArgumentNullException ("asyncResult");
\r
632 GHWebAsyncResult result = asyncResult as GHWebAsyncResult;
\r
633 if (result == null)
\r
634 throw new ArgumentException ("Invalid IAsyncResult");
\r
636 _asyncWrite = result;
\r
638 result.WaitUntilComplete ();
\r
640 Exception e = result.Exception;
\r
645 return result.WriteStream;
\r
648 public override IAsyncResult BeginGetResponse(AsyncCallback callback, object state)
\r
652 if(_asyncRead != null && !_hasResponse)
\r
654 throw new InvalidOperationException ("Cannot re-call start of asynchronous " +
\r
655 "method while a previous call is still in progress.");
\r
658 _asyncRead = new GHWebAsyncResult (this, callback, state);
\r
661 if (_response != null)
\r
663 _asyncRead.SetCompleted (true, _writeStream);
\r
664 _asyncRead.DoCallback ();
\r
676 _asyncRead.SetCompleted(false, e);
\r
678 _asyncRead.SetCompleted (true, _writeStream);
\r
679 _asyncRead.DoCallback ();
\r
685 public override WebResponse EndGetResponse(IAsyncResult asyncResult)
\r
687 if (asyncResult == null)
\r
688 throw new ArgumentNullException ("asyncResult");
\r
690 GHWebAsyncResult result = asyncResult as GHWebAsyncResult;
\r
691 if (result == null)
\r
692 throw new ArgumentException ("Invalid IAsyncResult", "asyncResult");
\r
695 _asyncRead = result;
\r
696 if (!result.WaitUntilComplete (_timeout, false))
\r
699 throw new WebException("The request timed out", WebExceptionStatus.Timeout);
\r
702 return result.Response;
\r
716 #region VMWRequestStream class
\r
717 internal class VMWRequestStream : Stream, IDisposable
\r
720 private java.io.OutputStream _javaOutput;
\r
722 private long _contentLength;
\r
724 internal VMWRequestStream (java.io.OutputStream stream) :
\r
729 internal VMWRequestStream (java.io.OutputStream stream, long contentLength)
\r
731 _javaOutput = stream;
\r
732 _contentLength = contentLength;
\r
735 public override bool CanRead
\r
737 get {return false;}
\r
740 public override bool CanWrite
\r
745 public override bool CanSeek
\r
747 get { return false;}
\r
750 public override long Length
\r
755 public override long Position
\r
764 throw new NotSupportedException();
\r
768 private volatile bool _closed = false;
\r
770 public override void Close()
\r
779 _javaOutput.flush();
\r
780 _javaOutput.close();
\r
786 public override void Flush()
\r
788 _javaOutput.flush();
\r
791 public override int ReadByte()
\r
793 throw new NotSupportedException();
\r
796 public override int Read(byte[] buffer, int offset, int count)
\r
798 throw new NotSupportedException();
\r
801 public override void Write(byte[] buffer, int offset, int count)
\r
803 if(_contentLength >= 0)
\r
806 if(_len > _contentLength)
\r
808 throw new System.Net.ProtocolViolationException(
\r
809 "Bytes to be written to the stream exceed Content-Length bytes size specified.");
\r
812 _javaOutput.write(vmw.common.TypeUtils.ToSByteArray(buffer), offset, count);
\r
814 if(_contentLength == _len)
\r
816 _javaOutput.flush();
\r
817 _javaOutput.close();
\r
821 public override long Seek(long offset, SeekOrigin origin)
\r
823 throw new NotSupportedException();
\r
826 public override void SetLength(long length)
\r
828 throw new NotSupportedException();
\r
831 void IDisposable.Dispose()
\r
845 #region GHWebAsyncResult
\r
846 internal class GHWebAsyncResult : IAsyncResult
\r
848 private object _state;
\r
849 private AsyncCallback _callback;
\r
850 private ManualResetEvent _handle;
\r
851 private bool _isCompleted = false;
\r
852 private bool _callbackDone;
\r
853 private Stream _writeStream;
\r
854 private HttpProvider _provider;
\r
856 private Exception _exception;
\r
858 #region Constructors
\r
860 public GHWebAsyncResult(HttpProvider provider,
\r
861 AsyncCallback callback, object state) :
\r
862 this(state, callback)
\r
864 _provider = provider;
\r
867 public GHWebAsyncResult(object state, AsyncCallback callback)
\r
870 _callback = callback;
\r
874 #region IAsyncResult Members
\r
876 public object AsyncState
\r
884 public bool CompletedSynchronously
\r
888 // TODO: Add HWebAsyncResult.CompletedSynchronously getter implementation
\r
893 public WaitHandle AsyncWaitHandle
\r
897 if (_handle == null)
\r
901 if (_handle == null)
\r
902 _handle = new ManualResetEvent (_isCompleted);
\r
910 public bool IsCompleted
\r
914 return _isCompleted;
\r
920 #region Internal Properties
\r
922 internal Stream WriteStream
\r
926 return _writeStream;
\r
930 internal Exception Exception
\r
938 internal HttpWebResponse Response
\r
942 return ((VMWHttpProvider)_provider)._response;
\r
948 #region Internal Methods
\r
950 internal void SetCompleted(bool res, Stream writeStream)
\r
952 _isCompleted = res;
\r
953 _writeStream = writeStream;
\r
954 ((ManualResetEvent) AsyncWaitHandle).Set ();
\r
957 internal void SetCompleted(bool res, Exception exc)
\r
959 _isCompleted = res;
\r
961 ((ManualResetEvent) AsyncWaitHandle).Set ();
\r
964 internal void DoCallback()
\r
966 if (!_callbackDone && _callback != null)
\r
968 _callbackDone = true;
\r
973 internal void WaitUntilComplete()
\r
977 AsyncWaitHandle.WaitOne ();
\r
980 internal bool WaitUntilComplete (int timeout, bool exitContext)
\r
985 return AsyncWaitHandle.WaitOne (timeout, exitContext);
\r
993 #region OutputStreamRequestEntity
\r
995 internal class OutputStreamRequestEntity : java.io.OutputStream, RequestEntity
\r
997 private long _contentLength;
\r
998 private java.io.ByteArrayOutputStream _out;
\r
999 private sbyte[] _buffer;
\r
1001 internal OutputStreamRequestEntity(): this(-1)
\r
1005 internal OutputStreamRequestEntity(long length)
\r
1007 _contentLength = length;
\r
1008 int tmp = (int) _contentLength;
\r
1012 _out = new java.io.ByteArrayOutputStream(tmp);
\r
1015 #region RequestEntity Members
\r
1017 public bool isRepeatable()
\r
1019 return ((_out != null) || (_buffer != null));
\r
1022 public long getContentLength()
\r
1026 _buffer = _out.toByteArray();
\r
1028 if(_buffer != null)
\r
1030 _contentLength = _buffer.Length;
\r
1033 return _contentLength;
\r
1036 public void writeRequest(java.io.OutputStream output)
\r
1039 _buffer = _out.toByteArray();
\r
1040 if(_buffer != null)
\r
1042 output.write(_buffer, 0, _buffer.Length);
\r
1045 else throw new ApplicationException();
\r
1048 public string getContentType()
\r
1055 public override void write(int i)
\r