private static void WriteHeadersCallback(IAsyncResult ar)
{
if(ar.CompletedSynchronously){
return;
}
WriteHeadersCallbackState state = (WriteHeadersCallbackState)ar.AsyncState;
ConnectStream stream = state.stream;
HttpWebRequest request = state.request;
WebExceptionStatus error = WebExceptionStatus.SendFailure;
//m_Request.writebuffer may be set to null on resubmit before method exits
byte[] writeBuffer = request.WriteBuffer;
GlobalLog.Enter("ConnectStream#" + ValidationHelper.HashString(stream) + "::WriteHeadersCallback", "Connection#" + ValidationHelper.HashString(stream.m_Connection) + ", " + writeBuffer.Length.ToString());
try{
stream.m_Connection.EndWrite(ar);
stream.m_Connection.CheckStartReceive(request);
error = WebExceptionStatus.Success;
}
catch (Exception e){
if (NclUtilities.IsFatal(e)) throw;
GlobalLog.Print("ConnectStream#" + ValidationHelper.HashString(stream) + "::WriteHeaders Exception: "+e.ToString());
if (e is IOException || e is ObjectDisposedException)
{
//new connection but reset from server on inital send
if(!stream.m_Connection.AtLeastOneResponseReceived && !request.BodyStarted){
e = new WebException(
NetRes.GetWebStatusString("net_connclosed", error),
error,
WebExceptionInternalStatus.Recoverable,
e);
}
else{
e = new WebException(
NetRes.GetWebStatusString("net_connclosed", error),
error,
stream.m_Connection.AtLeastOneResponseReceived ? WebExceptionInternalStatus.Isolated : WebExceptionInternalStatus.RequestFatal,
e);
}
}
stream.IOError(e, false);
}
stream.ExchangeCallNesting(Nesting.Idle, Nesting.InternalIO);
request.WriteHeadersCallback(error, stream, true);
GlobalLog.Leave("ConnectStream#" + ValidationHelper.HashString(stream) + "::WriteHeadersCallback",writeBuffer.Length.ToString());
}