private void CompleteConnection(bool async, HttpWebRequest request) { GlobalLog.Enter("Connection#" + ValidationHelper.HashString(this) + "::CompleteConnection", "async:" + async.ToString() + " request:" + ValidationHelper.HashString(request)); GlobalLog.ThreadContract(ThreadKinds.Unknown, "Connection#" + ValidationHelper.HashString(this) + "::CompleteConnection"); WebExceptionStatus ws = WebExceptionStatus.ConnectFailure; // // From now on the request.SetRequestSubmitDone must be called or it may hang // For a [....] request the write side reponse windowwas opened in HttpWebRequest.SubmitRequest if (request.Async) request.OpenWriteSideResponseWindow(); try { try { #if !FEATURE_PAL if (request.Address.Scheme == Uri.UriSchemeHttps) { TlsStream tlsStream = new TlsStream(request.GetRemoteResourceUri().IdnHost, NetworkStream, request.ClientCertificates, ServicePoint, request, request.Async ? request.GetConnectingContext().ContextCopy : null); NetworkStream = tlsStream; } #endif ws = WebExceptionStatus.Success; } catch { // The TLS stream could not be created. Close the current non-TLS stream immediately // to prevent any future use of it. Due to race conditions, the error handling will sometimes // try to write (flush) out some of the HTTP headers to the stream as it is closing down the failed // HttpWebRequest. This would cause plain text to go on the wire even though the stream should // have been TLS encrypted. NetworkStream.Close(); throw; } finally { // // There is a ---- with Abort so TlsStream ctor may throw. // SetRequestSubmitDone will deal with this kind of errors. // m_ReadState = ReadState.Start; ClearReaderState(); request.SetRequestSubmitDone(new ConnectStream(this, request)); } } catch (Exception exception) { if (m_InnerException == null) m_InnerException = exception; WebException webException = exception as WebException; if (webException != null) { ws = webException.Status; } } if (ws != WebExceptionStatus.Success) { ConnectionReturnResult returnResult = null; HandleError(false, false, ws, ref returnResult); ConnectionReturnResult.SetResponses(returnResult); if (Logging.On) Logging.PrintError(Logging.Web, this, "CompleteConnection", "on error"); GlobalLog.Leave("Connection#" + ValidationHelper.HashString(this) + "::CompleteConnection", "on error"); } else { GlobalLog.Leave("Connection#" + ValidationHelper.HashString(this) + "::CompleteConnection"); } }
private void CompleteConnection(bool async, HttpWebRequest request) { WebExceptionStatus connectFailure = WebExceptionStatus.ConnectFailure; if (request.Async) { request.OpenWriteSideResponseWindow(); } try { try { if (request.Address.Scheme == Uri.UriSchemeHttps) { TlsStream stream = new TlsStream(request.GetRemoteResourceUri().Host, base.NetworkStream, request.ClientCertificates, this.ServicePoint, request, request.Async ? request.GetConnectingContext().ContextCopy : null); base.NetworkStream = stream; } } finally { this.m_ReadState = ReadState.Start; this.ClearReaderState(); request.SetRequestSubmitDone(new ConnectStream(this, request)); connectFailure = WebExceptionStatus.Success; } } catch (Exception exception) { if (this.m_InnerException == null) { this.m_InnerException = exception; } WebException exception2 = exception as WebException; if (exception2 != null) { connectFailure = exception2.Status; } } if (connectFailure != WebExceptionStatus.Success) { ConnectionReturnResult returnResult = null; this.HandleError(false, false, connectFailure, ref returnResult); ConnectionReturnResult.SetResponses(returnResult); } }