Make HttpHandler and HttpRoutingHandler take ownership of fragmented messages, and discard messages that don't broadcast the entire headers first

This commit is contained in:
Alexandru Macocian
2020-04-08 16:15:41 +02:00
parent 4e09c18787
commit a1672079c2
4 changed files with 24 additions and 26 deletions
+11 -11
View File
@@ -110,11 +110,11 @@ namespace MTSC.UnitTests
request.Headers[HttpMessage.EntityHeaders.ContentLength] = request.BodyString.Length.ToString();
byte[] message = request.GetPackedRequest();
client.QueueMessage(message.Take(5).ToArray());
client.QueueMessage(message.Take(message.Length - request.BodyString.Length).ToArray());
Thread.Sleep(300);
client.QueueMessage(message.Skip(5).Take(message.Length - request.BodyString.Length - 5).ToArray());
client.QueueMessage(message.Skip(message.Length - request.BodyString.Length).Take(10).ToArray());
Thread.Sleep(300);
client.QueueMessage(message.Skip(message.Length - request.BodyString.Length).ToArray());
client.QueueMessage(message.Skip(message.Length - request.BodyString.Length + 10).Take(request.BodyString.Length - 10).ToArray());
Stopwatch sw = new Stopwatch();
sw.Start();
while (receivedMessage == null)
@@ -150,11 +150,11 @@ namespace MTSC.UnitTests
request.Headers[HttpMessage.EntityHeaders.ContentLength] = request.BodyString.Length.ToString();
byte[] message = request.GetPackedRequest();
client.QueueMessage(message.Take(5).ToArray());
client.QueueMessage(message.Take(message.Length - request.BodyString.Length).ToArray());
Thread.Sleep(300);
client.QueueMessage(message.Skip(5).Take(message.Length - request.BodyString.Length - 5).ToArray());
client.QueueMessage(message.Skip(message.Length - request.BodyString.Length).Take(10).ToArray());
Thread.Sleep(3300);
client.QueueMessage(message.Skip(message.Length - request.BodyString.Length).ToArray());
client.QueueMessage(message.Skip(message.Length - request.BodyString.Length + 10).Take(request.BodyString.Length - 10).ToArray());
Stopwatch sw = new Stopwatch();
sw.Start();
while (receivedMessage == null)
@@ -189,11 +189,11 @@ namespace MTSC.UnitTests
Array.Fill<byte>(request.Body, 50);
byte[] message = request.GetPackedRequest();
client.QueueMessage(message.Take(5).ToArray());
Thread.Sleep(50);
client.QueueMessage(message.Skip(5).Take(message.Length - request.BodyString.Length - 5).ToArray());
Thread.Sleep(50);
client.QueueMessage(message.Skip(message.Length - request.BodyString.Length).ToArray());
client.QueueMessage(message.Take(message.Length - request.BodyString.Length).ToArray());
Thread.Sleep(5);
client.QueueMessage(message.Skip(message.Length - request.BodyString.Length).Take(10).ToArray());
Thread.Sleep(5);
client.QueueMessage(message.Skip(message.Length - request.BodyString.Length + 10).Take(request.BodyString.Length - 10).ToArray());
Stopwatch sw = new Stopwatch();
sw.Start();
while (receivedMessage == null)
+3 -3
View File
@@ -5,12 +5,12 @@
<TargetFrameworks>netcoreapp2.1;net48;netstandard2.0;netcoreapp3.0;netcoreapp3.1</TargetFrameworks>
<ApplicationIcon />
<StartupObject />
<Version>2.5</Version>
<Version>2.5.1</Version>
<Authors>Alexandru-Victor Macocian</Authors>
<Product>MTSC</Product>
<Description>Modular TCP Server and Client</Description>
<AssemblyVersion>0.2.5</AssemblyVersion>
<FileVersion>0.2.5</FileVersion>
<AssemblyVersion>0.2.5.1</AssemblyVersion>
<FileVersion>0.2.5.1</FileVersion>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Platforms>AnyCPU;x64</Platforms>
<PackageProjectUrl>https://github.com/AlexMacocian/MTSC</PackageProjectUrl>
+5 -6
View File
@@ -105,7 +105,7 @@ namespace MTSC.ServerSide.Handlers
server.LogDebug($"Discarded message. Message size [{previousBytes.Length + trimmedMessageBytes.Length}] > [{MaximumRequestSize}]");
client.Resources.RemoveResource<FragmentedMessage>();
QueueResponse(client, new HttpResponse { StatusCode = StatusCodes.BadRequest, BodyString = $"Request disallowed because it exceeds [{MaximumRequestSize}] bytes!" });
return false;
return true;
}
byte[] repackagingBuffer = new byte[previousBytes.Length + trimmedMessageBytes.Length];
Array.Copy(previousBytes, 0, repackagingBuffer, 0, previousBytes.Length);
@@ -119,7 +119,7 @@ namespace MTSC.ServerSide.Handlers
// Discard the message if it is too big
server.LogDebug($"Discarded message. Message size [{message.MessageBytes.Length}] > [{MaximumRequestSize}]");
QueueResponse(client, new HttpResponse { StatusCode = StatusCodes.BadRequest, BodyString = $"Request disallowed because it exceeds [{MaximumRequestSize}] bytes!" });
return false;
return true;
}
messageBytes = trimmedMessageBytes;
}
@@ -130,7 +130,7 @@ namespace MTSC.ServerSide.Handlers
else
{
HandleIncompleteRequest(client, server, messageBytes, partialRequest);
return false;
return true;
}
}
catch (Exception ex) when (
@@ -144,9 +144,8 @@ namespace MTSC.ServerSide.Handlers
ex is IncompleteRequestException ||
ex is InvalidPostFormException)
{
server.LogDebug(ex.Message);
server.LogDebug(ex.StackTrace);
HandleIncompleteRequest(client, server, messageBytes);
server.LogDebug("Malformed request, not saving!");
server.LogDebug(ex.Message + "\n" + ex.StackTrace);
return false;
}
catch (Exception e)
@@ -102,7 +102,7 @@ namespace MTSC.ServerSide.Handlers
server.LogDebug($"Discarded message. Message size [{previousBytes.Length + trimmedMessageBytes.Length}] > [{MaximumRequestSize}]");
client.Resources.RemoveResource<FragmentedMessage>();
QueueResponse(client, new HttpResponse { StatusCode = StatusCodes.BadRequest, BodyString = $"Request disallowed because it exceeds [{MaximumRequestSize}] bytes!" });
return false;
return true;
}
byte[] repackagingBuffer = new byte[previousBytes.Length + trimmedMessageBytes.Length];
Array.Copy(previousBytes, 0, repackagingBuffer, 0, previousBytes.Length);
@@ -116,7 +116,7 @@ namespace MTSC.ServerSide.Handlers
// Discard the message if it is too big
server.LogDebug($"Discarded message. Message size [{trimmedMessageBytes.Length}] > [{MaximumRequestSize}]");
QueueResponse(client, new HttpResponse { StatusCode = StatusCodes.BadRequest, BodyString = $"Request disallowed because it exceeds [{MaximumRequestSize}] bytes!" });
return false;
return true;
}
messageBytes = trimmedMessageBytes;
}
@@ -126,7 +126,7 @@ namespace MTSC.ServerSide.Handlers
else
{
HandleIncompleteRequest(client, server, messageBytes, partialRequest);
return false;
return true;
}
}
catch (Exception ex) when (
@@ -140,9 +140,8 @@ namespace MTSC.ServerSide.Handlers
ex is IncompleteRequestException ||
ex is InvalidPostFormException)
{
server.LogDebug(ex.Message);
server.LogDebug(ex.StackTrace);
HandleIncompleteRequest(client, server, messageBytes);
server.LogDebug("Malformed request, not saving!");
server.LogDebug(ex.Message + "\n" + ex.StackTrace);
return false;
}
catch (Exception e)