private void CheckDeferredCallDone(ConnectStream stream) { object returnResult = Interlocked.Exchange(ref m_PendingReturnResult, DBNull.Value); if (returnResult == NclConstants.Sentinel) { #if DEBUG if (!Async) { using (GlobalLog.SetThreadKind(ThreadKinds.Sync)) { EndSubmitRequest(); } } else #endif EndSubmitRequest(); } else if (returnResult != null && returnResult != DBNull.Value) { // It could still be Missing.Value, which indicates ProcessWriteCallDone() should be called with null. stream.ProcessWriteCallDone(returnResult as ConnectionReturnResult); } }
internal void WriteCallDone(ConnectStream stream, ConnectionReturnResult returnResult) { GlobalLog.Print("HttpWebRequest#" + ValidationHelper.HashString(this) + "::WriteCallDone()"); // Make sure this is the user stream. if (!object.ReferenceEquals(stream, _OldSubmitWriteStream != null ? _OldSubmitWriteStream : _SubmitWriteStream)) { GlobalLog.Assert(object.ReferenceEquals(stream, _SubmitWriteStream), "HttpWebRequest#{0}::CallDone|Called from invalid stream.", ValidationHelper.HashString(this)); GlobalLog.Print("HttpWebRequest#" + ValidationHelper.HashString(this) + "::WriteCallDone() - called for resubmit stream"); stream.ProcessWriteCallDone(returnResult); return; } // If we're still writing headers in GetRequestStream, don't delay, or GetRequestStream will hang. if (!UserRetrievedWriteStream) { GlobalLog.Print("HttpWebRequest#" + ValidationHelper.HashString(this) + "::WriteCallDone() - called during headers"); stream.ProcessWriteCallDone(returnResult); return; } // In some cases such as redirects, we do not expect a response from the server after we finish writing. if (stream.FinishedAfterWrite) { stream.ProcessWriteCallDone(returnResult); return; } object pendResult = returnResult == null ? (object) Missing.Value : returnResult; object oldResult = Interlocked.CompareExchange(ref m_PendingReturnResult, pendResult, null); if (oldResult == DBNull.Value) { stream.ProcessWriteCallDone(returnResult); } #if TRAVE else if (oldResult == null) { GlobalLog.Print("HttpWebRequest#" + ValidationHelper.HashString(this) + "::WriteCallDone() - deferring processing"); } else { GlobalLog.Print("HttpWebRequest#" + ValidationHelper.HashString(this) + "::WriteCallDone() - ignoring duplicate call. typeof(oldResult):" + oldResult.GetType().ToString()); } #endif }
internal void WriteCallDone(ConnectStream stream, ConnectionReturnResult returnResult) { GlobalLog.Print("HttpWebRequest#" + ValidationHelper.HashString(this) + "::WriteCallDone()"); // Make sure this is the user stream. if (!object.ReferenceEquals(stream, _OldSubmitWriteStream != null ? _OldSubmitWriteStream : _SubmitWriteStream)) { GlobalLog.Assert(object.ReferenceEquals(stream, _SubmitWriteStream), "HttpWebRequest#{0}::CallDone|Called from invalid stream.", ValidationHelper.HashString(this)); GlobalLog.Print("HttpWebRequest#" + ValidationHelper.HashString(this) + "::WriteCallDone() - called for resubmit stream"); stream.ProcessWriteCallDone(returnResult); return; } // If we're still writing headers in GetRequestStream, don't delay, or GetRequestStream will hang. if (!UserRetrievedWriteStream) { GlobalLog.Print("HttpWebRequest#" + ValidationHelper.HashString(this) + "::WriteCallDone() - called during headers"); stream.ProcessWriteCallDone(returnResult); return; } object pendResult = returnResult == null ? (object) Missing.Value : returnResult; object oldResult = Interlocked.CompareExchange(ref m_PendingReturnResult, pendResult, null); if (oldResult == DBNull.Value) { stream.ProcessWriteCallDone(returnResult); } }