Commit d7ece16d authored by FlorianHockmann's avatar FlorianHockmann

HTTP validity checks don't override CalculateIsValid()

Instead of overriding CalculateIsValid, a new property IsValidStart is introduced for HTTP datagrams - as proposed by Boaz Brickner.
The validity checks only validate the header of an HTTP datagram. Since a datagram can be transmitted in multiple packets (due to TCP segmentation and IP fragmentation), a HTTP datagram can be valid without having a header at all.
parent 6bf2a9e6
......@@ -475,7 +475,7 @@ namespace PcapDotNet.Packets.Test
{
var packet = BuildPacket("UnknownMethod / HTTP/1.0\r\n\r\n");
Assert.IsTrue(packet.Ethernet.IpV4.Tcp.Http.IsValid);
Assert.IsTrue(packet.Ethernet.IpV4.Tcp.Http.IsValidStart);
}
[TestMethod]
......@@ -483,7 +483,7 @@ namespace PcapDotNet.Packets.Test
{
var packet = BuildPacket("GET HTTP/1.1\r\n\r\n");
Assert.IsFalse(packet.Ethernet.IpV4.Tcp.Http.IsValid);
Assert.IsFalse(packet.Ethernet.IpV4.Tcp.Http.IsValidStart);
}
[TestMethod]
......@@ -491,7 +491,7 @@ namespace PcapDotNet.Packets.Test
{
var packet = BuildPacket("GET / HTTP/\r\n\r\n");
Assert.IsFalse(packet.Ethernet.IpV4.Tcp.Http.IsValid);
Assert.IsFalse(packet.Ethernet.IpV4.Tcp.Http.IsValidStart);
}
[TestMethod]
......@@ -499,7 +499,7 @@ namespace PcapDotNet.Packets.Test
{
var packet = BuildPacket("GET /\r\n\r\n");
Assert.IsFalse(packet.Ethernet.IpV4.Tcp.Http.IsValid);
Assert.IsFalse(packet.Ethernet.IpV4.Tcp.Http.IsValidStart);
}
[TestMethod]
......@@ -507,7 +507,7 @@ namespace PcapDotNet.Packets.Test
{
var packet = BuildPacket(" / HTTP/1.0\r\n\r\n");
Assert.IsFalse(packet.Ethernet.IpV4.Tcp.Http.IsValid);
Assert.IsFalse(packet.Ethernet.IpV4.Tcp.Http.IsValidStart);
}
[TestMethod]
......@@ -515,7 +515,7 @@ namespace PcapDotNet.Packets.Test
{
var packet = BuildPacket("HTTP/1.0 200 OK\r\n\r\n");
Assert.IsTrue(packet.Ethernet.IpV4.Tcp.Http.IsValid);
Assert.IsTrue(packet.Ethernet.IpV4.Tcp.Http.IsValidStart);
}
[TestMethod]
......@@ -523,7 +523,7 @@ namespace PcapDotNet.Packets.Test
{
var packet = BuildPacket("HTTP/1.0 200 \r\n\r\n");
Assert.IsTrue(packet.Ethernet.IpV4.Tcp.Http.IsValid);
Assert.IsTrue(packet.Ethernet.IpV4.Tcp.Http.IsValidStart);
}
[TestMethod]
......@@ -531,7 +531,7 @@ namespace PcapDotNet.Packets.Test
{
var packet = BuildPacket("HTTP/ 200 OK\r\n\r\n");
Assert.IsFalse(packet.Ethernet.IpV4.Tcp.Http.IsValid);
Assert.IsFalse(packet.Ethernet.IpV4.Tcp.Http.IsValidStart);
}
[TestMethod]
......@@ -539,7 +539,7 @@ namespace PcapDotNet.Packets.Test
{
var packet = BuildPacket(" 200 OK\r\n\r\n");
Assert.IsFalse(packet.Ethernet.IpV4.Tcp.Http.IsValid);
Assert.IsFalse(packet.Ethernet.IpV4.Tcp.Http.IsValidStart);
}
[TestMethod]
......@@ -547,7 +547,7 @@ namespace PcapDotNet.Packets.Test
{
var packet = BuildPacket("HTTP/1.0 OK \r\n\r\n");
Assert.IsFalse(packet.Ethernet.IpV4.Tcp.Http.IsValid);
Assert.IsFalse(packet.Ethernet.IpV4.Tcp.Http.IsValidStart);
}
private static void TestHttpRequest(string httpString, string expectedMethodString = null, string expectedUri = null, HttpVersion expectedVersion = null, HttpHeader expectedHeader = null, string expectedBodyString = null)
......
......@@ -239,6 +239,8 @@ namespace PcapDotNet.Packets.Http
/// </summary>
public Datagram Body { get; private set; }
public virtual bool IsValidStart => false;
internal static HttpDatagram CreateDatagram(byte[] buffer, int offset, int length)
{
if (length >= _httpSlash.Length && buffer.SequenceEqual(offset, _httpSlash, 0, _httpSlash.Length))
......
......@@ -48,15 +48,18 @@ namespace PcapDotNet.Packets.Http
}
/// <summary>
/// An HTTP Request is valid if it contains a method, an URI, and a version.
/// An HTTP Request has a valid start if it contains a method, an URI, and a version.
/// </summary>
protected override bool CalculateIsValid()
public override bool IsValidStart
{
if (_isValid == null)
get
{
_isValid = Method != null && !string.IsNullOrEmpty(Uri) && Version != null;
if (_isValidStart == null)
{
_isValidStart = Method != null && !string.IsNullOrEmpty(Uri) && Version != null;
}
return _isValidStart.Value;
}
return _isValid.Value;
}
internal HttpRequestDatagram(byte[] buffer, int offset, int length)
......@@ -112,6 +115,6 @@ namespace PcapDotNet.Packets.Http
return header.ContentLength != null;
}
private bool? _isValid;
private bool? _isValidStart;
}
}
\ No newline at end of file
......@@ -51,15 +51,18 @@ namespace PcapDotNet.Packets.Http
}
/// <summary>
/// A HTTP response is valid if it contains a version and a status code.
/// A HTTP response has a valid start if it contains a version and a status code.
/// </summary>
protected override bool CalculateIsValid()
public override bool IsValidStart
{
if (_isValid == null)
get
{
_isValid = Version != null && StatusCode != null;
if (_isValidStart == null)
{
_isValidStart = Version != null && StatusCode != null;
}
return _isValidStart.Value;
}
return _isValid.Value;
}
internal HttpResponseDatagram(byte[] buffer, int offset, int length)
......@@ -117,6 +120,6 @@ namespace PcapDotNet.Packets.Http
return true;
}
private bool? _isValid;
private bool? _isValidStart;
}
}
\ 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