private void ResponseBodyCallback(IAsyncResult ar)
{
try
{
DataConnection.EndWrite(ar);
if (ar.AsyncState is Stream)
{
Stream lData = (Stream)ar.AsyncState;
Int32 lLen = lData.Read(fBodyBuffer, 0, fBodyBuffer.Length);
if (lLen != 0)
{
DataConnection.BeginWrite(fBodyBuffer, 0, lLen, ResponseBodyCallback, lData);
return;
}
}
else if (ar.AsyncState is Byte[])
{
Byte[] lData = (Byte[])ar.AsyncState;
Int32 lLen = fBodyBuffer.Length;
if (fBodyOffset + lLen > lData.Length)
lLen = lData.Length - fBodyOffset;
if (lLen != 0)
{
Array.Copy(lData, fBodyOffset, fBodyBuffer, 0, lLen);
fBodyOffset += lLen;
DataConnection.BeginWrite(fBodyBuffer, 0, lLen, ResponseBodyCallback, lData);
return;
}
}
}
catch (ConnectionClosedException)
{
this.fOwner.TriggerHttpResponseFailed(new AsyncHttpRequestEventArgs(this.DataConnection, this.fContext));
Done();
return;
}
catch (SocketException)
{
this.fOwner.TriggerHttpResponseFailed(new AsyncHttpRequestEventArgs(this.DataConnection, this.fContext));
Done();
return;
}
catch (ObjectDisposedException)
{
this.fOwner.TriggerHttpResponseFailed(new AsyncHttpRequestEventArgs(this.DataConnection, this.fContext));
Done();
return;
}
//AsyncHttpContext lOldContext = fContext;
fContext = this.fOwner.NewContext(this);
try
{
DataConnection.BeginReadLine(HeaderFirstLineCallback, null);
}
catch (SocketException)
{
this.fOwner.TriggerHttpResponseFailed(new AsyncHttpRequestEventArgs(this.DataConnection, this.fContext));
Done();
return;
}
catch (ObjectDisposedException)
{
this.fOwner.TriggerHttpResponseFailed(new AsyncHttpRequestEventArgs(this.DataConnection, this.fContext));
Done();
return;
}
this.fOwner.TriggerHttpResponseSent(new AsyncHttpRequestEventArgs(this.DataConnection, this.fContext));
}
}