public void SendResponse()
{
try
{
fContext.CurrentResponse.KeepAlive = ((AsyncHttpServer)AsyncOwner).KeepAlive;
Byte[] lHeader = Encoding.ASCII.GetBytes(fContext.CurrentResponse.Header.ToString());
if (lHeader.Length >= 4096 || fContext.CurrentResponse.ContentSource == ContentSource.ContentNone)
{
fBodyOffset = 0;
switch (fContext.CurrentResponse.ContentSource)
{
case ContentSource.ContentBytes:
DataConnection.BeginWrite(lHeader, 0, fBodyOffset, ResponseBodyCallback, fContext.CurrentResponse.ContentBytes);
break;
case ContentSource.ContentString:
Byte[] lBuffer = fContext.CurrentResponse.Encoding.GetBytes(fContext.CurrentResponse.ContentString);
DataConnection.BeginWrite(lHeader, 0, fBodyOffset, ResponseBodyCallback, lBuffer);
break;
case ContentSource.ContentStream:
fContext.CurrentResponse.ContentStream.Position = 0;
DataConnection.BeginWrite(lHeader, 0, fBodyOffset, ResponseBodyCallback, fContext.CurrentResponse.ContentStream);
break;
default:
DataConnection.BeginWrite(lHeader, 0, fBodyOffset, ResponseBodyCallback, null);
break;
}
}
else
{
if (fBodyBuffer == null)
fBodyBuffer = new Byte[4096];
Array.Copy(lHeader, 0, fBodyBuffer, 0, lHeader.Length);
fBodyOffset = fBodyBuffer.Length - lHeader.Length;
switch (fContext.CurrentResponse.ContentSource)
{
case ContentSource.ContentBytes:
if (fBodyOffset > fContext.CurrentResponse.ContentBytes.Length)
fBodyOffset = fContext.CurrentResponse.ContentBytes.Length;
Array.Copy(fContext.CurrentResponse.ContentBytes, 0, fBodyBuffer, lHeader.Length, fBodyOffset);
DataConnection.BeginWrite(fBodyBuffer, 0, fBodyOffset + lHeader.Length, ResponseBodyCallback, fContext.CurrentResponse.ContentBytes);
break;
case ContentSource.ContentString:
Byte[] lBuffer = fContext.CurrentResponse.Encoding.GetBytes(fContext.CurrentResponse.ContentString);
if (fBodyOffset > lBuffer.Length)
fBodyOffset = lBuffer.Length;
Array.Copy(lBuffer, 0, fBodyBuffer, lHeader.Length, fBodyOffset);
DataConnection.BeginWrite(fBodyBuffer, 0, fBodyOffset + lHeader.Length, ResponseBodyCallback, lBuffer);
break;
case ContentSource.ContentStream:
fContext.CurrentResponse.ContentStream.Position = 0;
fBodyOffset = fContext.CurrentResponse.ContentStream.Read(fBodyBuffer, lHeader.Length, fBodyOffset);
DataConnection.BeginWrite(fBodyBuffer, 0, fBodyOffset + lHeader.Length, ResponseBodyCallback, fContext.CurrentResponse.ContentStream);
break;
default:
DataConnection.BeginWrite(lHeader, 0, fBodyOffset, ResponseBodyCallback, null);
break;
}
}
}
catch (ConnectionClosedException)
{
this.fOwner.TriggerHttpResponseFailed(new AsyncHttpRequestEventArgs(this.DataConnection, this.fContext));
Done();
}
catch (SocketException)
{
this.fOwner.TriggerHttpResponseFailed(new AsyncHttpRequestEventArgs(this.DataConnection, this.fContext));
Done();
}
catch (ObjectDisposedException)
{
this.fOwner.TriggerHttpResponseFailed(new AsyncHttpRequestEventArgs(this.DataConnection, this.fContext));
Done();
}
}