private void CompleteStartRequest(bool onSubmitThread, HttpWebRequest request, TriState needReConnect) {
GlobalLog.Enter("Connection#" + ValidationHelper.HashString(this) + "::CompleteStartRequest", ValidationHelper.HashString(request));
GlobalLog.ThreadContract(ThreadKinds.Unknown, "Connection#" + ValidationHelper.HashString(this) + "::CompleteStartRequest");
if (needReConnect == TriState.True) {
// Socket is not alive.
GlobalLog.Print("Connection#" + ValidationHelper.HashString(this) + "::CompleteStartRequest() Queue StartConnection Delegate ");
try {
if (request.Async) {
CompleteStartConnection(true, request);
}
else if (onSubmitThread) {
CompleteStartConnection(false, request);
}
// else - fall through and wake up other thread
}
catch (Exception exception) {
GlobalLog.Print("Connection#" + ValidationHelper.HashString(this) + "::CompleteStartRequest(): exception: " + exception.ToString());
if (NclUtilities.IsFatal(exception)) throw;
//
// Should not be here because CompleteStartConnection and below tries to catch everything
//
GlobalLog.Assert(exception.ToString());
}
// If neeeded wake up other thread where SubmitRequest was called
if (!request.Async) {
GlobalLog.Print("Connection#" + ValidationHelper.HashString(this) + "::CompleteStartRequest() Invoking Async Result");
request.ConnectionAsyncResult.InvokeCallback(new AsyncTriState(needReConnect));
}
GlobalLog.Leave("Connection#" + ValidationHelper.HashString(this) + "::CompleteStartRequest", "needReConnect");
return;
}
//
// From now on the request.SetRequestSubmitDone must be called or it may hang
// For a sync request the write side reponse windowwas opened in HttpWebRequest.SubmitRequest
if (request.Async)
request.OpenWriteSideResponseWindow();
ConnectStream writeStream = new ConnectStream(this, request);
// Call the request to let them know that we have a write-stream, this might invoke Send() call
if (request.Async || onSubmitThread) {
request.SetRequestSubmitDone(writeStream);
}
else {
GlobalLog.Print("Connection#" + ValidationHelper.HashString(this) + "::CompleteStartRequest() Invoking Async Result");
request.ConnectionAsyncResult.InvokeCallback(writeStream);
}
GlobalLog.Leave("Connection#" + ValidationHelper.HashString(this) + "::CompleteStartRequest");
}