From 0ae689c8a8b43d8b1e61ee652f4b0505a9f43730 Mon Sep 17 00:00:00 2001 From: Daniel Gasparotto Date: Fri, 12 Jul 2019 23:27:28 +0200 Subject: [PATCH] Handle chunks containing multiple EOL (#6146) Credit to @EEParker https://github.com/EEParker/aspnetcore-vueclimiddleware/commit/a169dd6d39912d7e6ecbb13e5fa349860c26af0b#diff-6d394759c0a824a137b47986d0cce571R158 Co-Authored-By: Jeff Parker, PE --- .../src/Util/EventedStreamReader.cs | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/Middleware/SpaServices.Extensions/src/Util/EventedStreamReader.cs b/src/Middleware/SpaServices.Extensions/src/Util/EventedStreamReader.cs index 95e018a590..298d5289d6 100644 --- a/src/Middleware/SpaServices.Extensions/src/Util/EventedStreamReader.cs +++ b/src/Middleware/SpaServices.Extensions/src/Util/EventedStreamReader.cs @@ -89,17 +89,23 @@ namespace Microsoft.AspNetCore.NodeServices.Util OnChunk(new ArraySegment(buf, 0, chunkLength)); - var lineBreakPos = Array.IndexOf(buf, '\n', 0, chunkLength); - if (lineBreakPos < 0) + int lineBreakPos = -1; + int startPos = 0; + + // get all the newlines + while ((lineBreakPos = Array.IndexOf(buf, '\n', startPos, chunkLength - startPos)) >= 0 && startPos < chunkLength) { - _linesBuffer.Append(buf, 0, chunkLength); - } - else - { - _linesBuffer.Append(buf, 0, lineBreakPos + 1); + var length = (lineBreakPos + 1) - startPos; + _linesBuffer.Append(buf, startPos, length); OnCompleteLine(_linesBuffer.ToString()); _linesBuffer.Clear(); - _linesBuffer.Append(buf, lineBreakPos + 1, chunkLength - (lineBreakPos + 1)); + startPos = lineBreakPos + 1; + } + + // get the rest + if (lineBreakPos < 0 && startPos < chunkLength) + { + _linesBuffer.Append(buf, startPos, chunkLength); } } }