Commit 55dce1dd authored by Brickner_cp's avatar Brickner_cp

HTTP

parent e18d30c8
...@@ -4,9 +4,10 @@ namespace PcapDotNet.Packets.Http ...@@ -4,9 +4,10 @@ namespace PcapDotNet.Packets.Http
{ {
public class HttpRequestDatagram : HttpDatagram public class HttpRequestDatagram : HttpDatagram
{ {
internal HttpRequestDatagram(byte[] buffer, int offset, int length) private class ParseInfo : ParseInfoBase
: base(buffer, offset, length)
{ {
public string Method { get; set; }
public string Uri { get; set; }
} }
public override bool IsRequest public override bool IsRequest
...@@ -14,37 +15,60 @@ namespace PcapDotNet.Packets.Http ...@@ -14,37 +15,60 @@ namespace PcapDotNet.Packets.Http
get { return true; } get { return true; }
} }
public string Method public string Method { get; private set; }
public string Uri { get; private set; }
internal HttpRequestDatagram(byte[] buffer, int offset, int length)
: this(buffer, offset, Parse(buffer, offset, length))
{ {
get
{
ParseFirstLine();
return _method;
}
} }
public string Uri private HttpRequestDatagram(byte[] buffer, int offset, ParseInfo parseInfo)
:base(buffer, offset, parseInfo.Length, parseInfo.Version, parseInfo.Header, parseInfo.Body)
{ {
get Method = parseInfo.Method;
{ Uri = parseInfo.Uri;
ParseFirstLine();
return _uri;
}
} }
protected override bool IsBodyPossible private static ParseInfo Parse(byte[] buffer, int offset, int length)
{ {
get { return Header.ContentLength != null; } // First Line
HttpParser parser = new HttpParser(buffer, offset, length);
string method;
string uri;
HttpVersion version;
parser.Token(out method).Space().RequestUri(out uri).Space().Version(out version).CarriageReturnLineFeed();
ParseInfo parseInfo = new ParseInfo
{
Length = length,
Version = version,
Method = method,
Uri = uri,
};
if (!parser.Success)
return parseInfo;
int firstLineLength = parser.Offset - offset;
// Header
int? endHeaderOffset;
HttpHeader header = new HttpHeader(GetHeaderFields(out endHeaderOffset, buffer, offset + firstLineLength, length - firstLineLength));
parseInfo.Header = header;
if (endHeaderOffset == null)
return parseInfo;
int headerLength = endHeaderOffset.Value - offset - firstLineLength;
// Body
Datagram body = ParseBody(buffer, offset + firstLineLength + headerLength, length - firstLineLength - headerLength, IsBodyPossible(header), header);
parseInfo.Body = body;
parseInfo.Length = firstLineLength + headerLength + body.Length;
return parseInfo;
} }
internal override void ParseSpecificFirstLine(out HttpVersion version, out int? headerOffset) private static bool IsBodyPossible(HttpHeader header)
{ {
HttpParser parser = new HttpParser(Buffer, StartOffset, Length); return header.ContentLength != null;
parser.Token(out _method).Space().RequestUri(out _uri).Space().Version(out version).CarriageReturnLineFeed();
headerOffset = parser.Success ? (int?)(parser.Offset - StartOffset) : null;
} }
private string _uri;
private string _method;
} }
} }
\ No newline at end of file
...@@ -5,9 +5,10 @@ namespace PcapDotNet.Packets.Http ...@@ -5,9 +5,10 @@ namespace PcapDotNet.Packets.Http
{ {
public class HttpResponseDatagram : HttpDatagram public class HttpResponseDatagram : HttpDatagram
{ {
internal HttpResponseDatagram(byte[] buffer, int offset, int length) private class ParseInfo : ParseInfoBase
: base(buffer, offset, length)
{ {
public Datagram ReasonPhrase { get; set; }
public uint? StatusCode{ get; set;}
} }
public override bool IsRequest public override bool IsRequest
...@@ -15,45 +16,65 @@ namespace PcapDotNet.Packets.Http ...@@ -15,45 +16,65 @@ namespace PcapDotNet.Packets.Http
get { return false; } get { return false; }
} }
public uint? StatusCode public uint? StatusCode{get; private set;}
public Datagram ReasonPhrase { get; private set;}
internal HttpResponseDatagram(byte[] buffer, int offset, int length)
: this(buffer, offset, Parse(buffer, offset, length))
{ {
get
{
ParseFirstLine();
return _statusCode;
}
} }
public Datagram ReasonPhrase private HttpResponseDatagram(byte[] buffer, int offset, ParseInfo parseInfo)
:base(buffer, offset, parseInfo.Length, parseInfo.Version, parseInfo.Header, parseInfo.Body)
{ {
get StatusCode = parseInfo.StatusCode;
{ ReasonPhrase = parseInfo.ReasonPhrase;
ParseFirstLine();
return _reasonPhrase;
}
} }
protected override bool IsBodyPossible private static ParseInfo Parse(byte[] buffer, int offset, int length)
{ {
get // First Line
{ HttpParser parser = new HttpParser(buffer, offset, length);
uint statusCodeValue = StatusCode.Value; HttpVersion version;
if (statusCodeValue >= 100 && statusCodeValue <= 199 || statusCodeValue == 204 || statusCodeValue == 205 || statusCodeValue == 304) uint? statusCode;
return false; Datagram reasonPhrase;
// if (IsResponseToHeadRequest) parser.Version(out version).Space().DecimalNumber(3, out statusCode).Space().ReasonPhrase(out reasonPhrase).CarriageReturnLineFeed();
// return false; ParseInfo parseInfo = new ParseInfo
return true; {
} Length = length,
Version = version,
StatusCode = statusCode,
ReasonPhrase = reasonPhrase
};
if (!parser.Success)
return parseInfo;
int firstLineLength = parser.Offset - offset;
// Header
int? endHeaderOffset;
HttpHeader header = new HttpHeader(GetHeaderFields(out endHeaderOffset, buffer, offset + firstLineLength, length - firstLineLength));
parseInfo.Header = header;
if (endHeaderOffset == null)
return parseInfo;
int headerLength = endHeaderOffset.Value - offset - firstLineLength;
// Body
Datagram body = ParseBody(buffer, offset + firstLineLength + headerLength, length - firstLineLength - headerLength, IsBodyPossible(statusCode.Value), header);
parseInfo.Body = body;
parseInfo.Length = firstLineLength + headerLength + body.Length;
return parseInfo;
} }
internal override void ParseSpecificFirstLine(out HttpVersion version, out int? headerOffset) private static bool IsBodyPossible(uint statusCode)
{ {
HttpParser parser = new HttpParser(Buffer, StartOffset, Length); if (statusCode >= 100 && statusCode <= 199 || statusCode == 204 || statusCode == 205 || statusCode == 304)
parser.Version(out version).Space().DecimalNumber(3, out _statusCode).Space().ReasonPhrase(out _reasonPhrase).CarriageReturnLineFeed(); return false;
headerOffset = parser.Success ? (int?)(parser.Offset - StartOffset) : null; // if (IsResponseToHeadRequest)
// return false;
return true;
} }
private uint? _statusCode;
private Datagram _reasonPhrase;
} }
} }
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment