private void OnReceive(IAsyncResult ar)
{
// been closed by our side.
if (Stream == null)
return;
_context = this;
HttpFactory.Current = HttpFactory;
try
{
int bytesLeft = Stream.EndRead(ar);
if (bytesLeft == 0)
{
_logger.Trace("Client disconnected.");
Close();
return;
}
_logger.Debug(Socket.RemoteEndPoint + " received " + bytesLeft + " bytes.");
if (bytesLeft < 5000)
{
string temp = Encoding.Default.GetString(_buffer, 0, bytesLeft);
_logger.Trace(temp);
}
int offset = ParseBuffer(bytesLeft);
bytesLeft -= offset;
if (bytesLeft > 0)
{
_logger.Warning("Moving " + bytesLeft + " from " + offset + " to beginning of array.");
Buffer.BlockCopy(_buffer, offset, _buffer, 0, bytesLeft);
}
Stream.BeginRead(_buffer, 0, _buffer.Length - offset, OnReceive, null);
}
catch (ParserException err)
{
_logger.Warning(err.ToString());
var response = new Response("HTTP/1.0", HttpStatusCode.BadRequest, err.Message);
var generator = HttpFactory.Current.Get<ResponseWriter>();
generator.SendErrorPage(this, response, err);
Close();
}
catch (Exception err)
{
if (!(err is IOException))
{
_logger.Error("Failed to read from stream: " + err);
var responseWriter = HttpFactory.Current.Get<ResponseWriter>();
var response = new Response("HTTP/1.0", HttpStatusCode.InternalServerError, err.Message);
responseWriter.SendErrorPage(this, response, err);
}
Close();
}
}