aboutsummaryrefslogtreecommitdiff
path: root/lib/Net.Http/src
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Net.Http/src')
-rw-r--r--lib/Net.Http/src/Core/Response/ResponseWriter.cs31
1 files changed, 23 insertions, 8 deletions
diff --git a/lib/Net.Http/src/Core/Response/ResponseWriter.cs b/lib/Net.Http/src/Core/Response/ResponseWriter.cs
index dcb220f..97b734a 100644
--- a/lib/Net.Http/src/Core/Response/ResponseWriter.cs
+++ b/lib/Net.Http/src/Core/Response/ResponseWriter.cs
@@ -35,6 +35,8 @@ using System.Threading;
using System.Threading.Tasks;
using System.Runtime.CompilerServices;
+using VNLib.Utils.IO;
+using VNLib.Utils.Memory;
using VNLib.Net.Http.Core.Response;
using VNLib.Net.Http.Core.Compression;
@@ -200,6 +202,8 @@ namespace VNLib.Net.Http.Core
}
}
+ ForwardOnlyMemoryReader<byte> _streamReader;
+
///<inheritdoc/>
async Task IHttpResponseBody.WriteEntityAsync(IResponseCompressor comp, IResponseDataWriter writer, Memory<byte> buffer)
{
@@ -229,7 +233,7 @@ namespace VNLib.Net.Http.Core
buffer = buffer[..comp.BlockSize];
}
- //Read in loop
+ //Process in loop
do
{
//read
@@ -241,12 +245,19 @@ namespace VNLib.Net.Http.Core
break;
}
- //Compress the buffered data and flush if required
- if (CompressNextSegment(buffer, read, comp, writer))
+ //Track read bytes and loop uil all bytes are read
+ _streamReader = new(buffer[..read]);
+
+ do
{
- //Time to flush
- await writer.FlushAsync(false);
- }
+ //Compress the buffered data and flush if required
+ if (CompressNextSegment(ref _streamReader, comp, writer))
+ {
+ //Time to flush
+ await writer.FlushAsync(false);
+ }
+
+ } while (_streamReader.WindowSize > 0);
} while (true);
@@ -309,13 +320,16 @@ namespace VNLib.Net.Http.Core
return writer.Advance(res.BytesWritten) == 0;
}
- private static bool CompressNextSegment(Memory<byte> readSegment, int read, IResponseCompressor comp, IResponseDataWriter writer)
+ private static bool CompressNextSegment(ref ForwardOnlyMemoryReader<byte> reader, IResponseCompressor comp, IResponseDataWriter writer)
{
//Get output buffer
Memory<byte> output = writer.GetMemory();
//Compress the trimmed block
- CompressionResult res = comp.CompressBlock(readSegment[..read], output);
+ CompressionResult res = comp.CompressBlock(reader.Window, output);
+
+ //Commit input bytes
+ reader.Advance(res.BytesRead);
return writer.Advance(res.BytesWritten) == 0;
}
@@ -329,6 +343,7 @@ namespace VNLib.Net.Http.Core
HasData = false;
Length = 0;
_readSegment = default;
+ _streamReader = default;
//Clear rseponse containers
_streamResponse?.Dispose();