private void ParseHeader()
{
_headerData.Position = 0;
string header = Encoding.UTF8.GetString( _headerData.ToArray() );
WebLog.Logger.Verbose( "Original HTTP header\r\n " + header );
string[] headerLines = header.Split( new[]
{
"\r\n"
},
StringSplitOptions.RemoveEmptyEntries );
var headers = CreateHeaders( headerLines );
bool parseOk = false;
string httpVersion = null;
const int TokensInHttpVersionString = 2;
// Response?
if (headerLines[0].StartsWith("HTTP"))
{
// Typical line will look like "HTTP/1.1 200 OK somthing else"
string[] tokens = headerLines[0].Split( ' ' );
const int MinTokensInResponse = 2;
if (tokens.Length >= MinTokensInResponse)
{
int statusCode;
if (int.TryParse(tokens[1], out statusCode))
{
string[] versionTokens = tokens[0].Split('/');
if (versionTokens.Length == TokensInHttpVersionString)
{
parseOk = true;
string statusString = "";
if(tokens.Length > MinTokensInResponse )
{
for(int i = MinTokensInResponse; i< tokens.Length; i++)
{
statusString += tokens[i] + " ";
}
}
httpVersion = versionTokens[1];
_context.OnReadResponseHeaderComplete(
httpVersion,
headers,
statusCode,
statusString.Trim() );
}
}
}
}
else
{
// Typcial line will look like "GET / HTTP/1.1"
string[] tokens = headerLines[0].Split( ' ' );
const int TokensInValidHttpRequestLine = 3;
if (tokens.Length == TokensInValidHttpRequestLine)
{
string[] versionTokens = tokens[2].Split( '/' );
if(versionTokens.Length == TokensInHttpVersionString)
{
parseOk = true;
httpVersion = versionTokens[1];
_context.OnReadRequestHeaderComplete(
httpVersion,
headers,
tokens[0],
tokens[1]);
}
}
}
if(!parseOk)
{
throw new ArgumentException(
"The HTTP data could not be identified as a request or response.");
}
InterpretHttpHeaders( headers, httpVersion );
}