diff --git a/src/Servers/EffinitiveServer/EffinitiveServer.csproj b/src/Servers/EffinitiveServer/EffinitiveServer.csproj index ae94e20..1a02cca 100644 --- a/src/Servers/EffinitiveServer/EffinitiveServer.csproj +++ b/src/Servers/EffinitiveServer/EffinitiveServer.csproj @@ -7,7 +7,7 @@ - + diff --git a/src/Servers/EffinitiveServer/Program.cs b/src/Servers/EffinitiveServer/Program.cs index 210f6d5..aec4407 100644 --- a/src/Servers/EffinitiveServer/Program.cs +++ b/src/Servers/EffinitiveServer/Program.cs @@ -1,3 +1,4 @@ +using System.Buffers; using System.Text; using EffinitiveFramework.Core; using EffinitiveFramework.Core.Http; @@ -35,10 +36,23 @@ sealed class PostRoot : NoRequestEndpointBase protected override string Route => "/"; protected override string ContentType => Helpers.TextPlain; - public override ValueTask HandleAsync(CancellationToken ct = default) + public override async ValueTask HandleAsync(CancellationToken ct = default) { + if (HttpContext?.BodyDeferred == true && HttpContext.BodyStream != null) + { + using var ms = new MemoryStream(); + var buf = ArrayPool.Shared.Rent(4096); + try + { + int r; + while ((r = await HttpContext.BodyStream.ReadAsync(buf.AsMemory(), ct)) > 0) + ms.Write(buf, 0, r); + } + finally { ArrayPool.Shared.Return(buf); } + return ms.Length > 0 ? Encoding.UTF8.GetString(ms.ToArray()) : ""; + } var body = HttpContext?.Body; - return ValueTask.FromResult(body is { Length: > 0 } ? Encoding.UTF8.GetString(body.Value.Span) : ""); + return body is { Length: > 0 } ? Encoding.UTF8.GetString(body.Value.Span) : ""; } }