private void HeaderLinesCallback(IAsyncResult ar)
{
String lHeaderLine;
try
{
lHeaderLine = this.DataConnection.EndReadLine(ar);
}
catch (ConnectionClosedException)
{
Done();
return;
}
catch (SocketException)
{
Done();
return;
}
catch (ObjectDisposedException)
{
Done();
return;
}
// HTTP Request Type is already known
String lHttpMethod = this.fContext.CurrentRequest.Header.RequestType;
Boolean lRequireBody = (lHttpMethod == "POST") || (lHttpMethod == "PUT") || (lHttpMethod == "MERGE");
Boolean lHaveData = true;
while (lHaveData)
{
lHaveData = false;
if (lHeaderLine == "")
{
// we've got the last line. Process it
if (lRequireBody)
{
Int64 lContentLength;
#if FULLFRAMEWORK
if (!Int64.TryParse(fContext.CurrentRequest.Header.GetHeaderValue("Content-Length"), out lContentLength))
#else
if (!LongHelper.TryParse(fContext.CurrentRequest.Header.GetHeaderValue("Content-Length"), out lContentLength))
#endif
lContentLength = 0;
if (lContentLength > ((AsyncHttpServer)this.Owner).MaxPostSize)
{
this.SendInvalidRequest(new Exception("Content-Length too large"));
return;
}
try
{
((AsyncHttpServer)this.Owner).TriggerBeforeHaveData(new AsyncHttpRequestEventArgs(this.DataConnection, this.fContext));
}
catch (Exception ex)
{
this.SendInvalidRequest(ex);
return;
}
if (this.fContext.ResponseSent)
return; // already triggered the required functions.
try
{
Byte[] lData = new Byte[(Int32)lContentLength];
DataConnection.BeginRead(lData, 0, (Int32)lContentLength, WantBodyCallback, lData);
}
catch (SocketException)
{
Done();
}
catch (ObjectDisposedException)
{
Done();
}
return;
}
else
{
try
{
this.fOwner.TriggerHttpRequest(new AsyncHttpRequestEventArgs(this.DataConnection, this.fContext));
return;
}
catch (Exception ex)
{
this.SendInvalidRequest(ex);
return;
}
}
}
if (fContext.CurrentRequest.Header.Count >= fContext.CurrentRequest.Header.MaxHeaderLines && fContext.CurrentRequest.Header.MaxHeaderLinesEnabled)
{
SendInvalidRequest();
return;
}
Int32 lPosition = lHeaderLine.IndexOf(":", StringComparison.Ordinal);
if (lPosition == -1)
{
SendInvalidRequest();
return;
}
String lName = lHeaderLine.Substring(0, lPosition);
String lValue = null;
if (lHeaderLine.Length > lPosition + 1)
lValue = lHeaderLine.Substring(lPosition + 2);
fContext.CurrentRequest.Header.SetHeaderValue(lName, lValue);
lHeaderLine = DataConnection.BufferReadLine();
if (lHeaderLine != null)
{
lHaveData = true;
continue;
}
try
{
DataConnection.BeginReadLine(HeaderLinesCallback, null);
}
catch (SocketException)
{
Done();
}
catch (ObjectDisposedException)
{
Done();
}
}
}