Skip to content

Commit 24d6241

Browse files
committed
Write to Pipe
1 parent cef8841 commit 24d6241

File tree

1 file changed

+13
-16
lines changed

1 file changed

+13
-16
lines changed

src/Benchmarks/Middleware/MiddlewareHelpers.cs

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.Buffers;
66
using System.Collections.Generic;
77
using System.Globalization;
8+
using System.IO.Pipelines;
89
using System.Text;
910
using System.Text.Encodings.Web;
1011
using System.Threading.Tasks;
@@ -32,39 +33,35 @@ public static int GetMultipleQueriesQueryCount(HttpContext httpContext)
3233
: 1;
3334
}
3435

35-
public static Task RenderFortunesHtml(IEnumerable<Fortune> model, HttpContext httpContext, HtmlEncoder htmlEncoder)
36+
public static async Task RenderFortunesHtml(IEnumerable<Fortune> model, HttpContext httpContext, HtmlEncoder htmlEncoder)
3637
{
3738
httpContext.Response.StatusCode = StatusCodes.Status200OK;
3839
httpContext.Response.ContentType = "text/html; charset=UTF-8";
3940

40-
var sb = StringBuilderCache.Acquire();
41-
sb.Append("<!DOCTYPE html><html><head><title>Fortunes</title></head><body><table><tr><th>id</th><th>message</th></tr>");
41+
Encoding.UTF8.GetBytes("<!DOCTYPE html><html><head><title>Fortunes</title></head><body><table><tr><th>id</th><th>message</th></tr>", httpContext.Response.BodyWriter);
4242

43-
Span<char> buffer = stackalloc char[256];
4443
foreach (var item in model)
4544
{
46-
sb.Append("<tr><td>");
47-
sb.Append(CultureInfo.InvariantCulture, $"{item.Id}");
48-
sb.Append("</td><td>");
49-
Encode(sb, htmlEncoder, item.Message);
50-
sb.Append("</td></tr>");
45+
Encoding.UTF8.GetBytes("<tr><td>", httpContext.Response.BodyWriter);
46+
Encoding.UTF8.GetBytes(item.Id.ToString(CultureInfo.InvariantCulture), httpContext.Response.BodyWriter);
47+
Encoding.UTF8.GetBytes("</td><td>", httpContext.Response.BodyWriter);
48+
EncodeToPipe(httpContext.Response.BodyWriter, htmlEncoder, item.Message);
49+
Encoding.UTF8.GetBytes("</td></tr>", httpContext.Response.BodyWriter);
5150
}
5251

53-
sb.Append("</table></body></html>");
54-
var response = StringBuilderCache.GetStringAndRelease(sb);
55-
// fortunes includes multibyte characters so response.Length is incorrect
56-
httpContext.Response.ContentLength = Encoding.UTF8.GetByteCount(response);
57-
return httpContext.Response.WriteAsync(response);
52+
Encoding.UTF8.GetBytes("</table></body></html>", httpContext.Response.BodyWriter);
5853

59-
static void Encode(StringBuilder sb, HtmlEncoder htmlEncoder, string item)
54+
await httpContext.Response.BodyWriter.FlushAsync();
55+
56+
static void EncodeToPipe(PipeWriter writer, HtmlEncoder htmlEncoder, string item)
6057
{
6158
Span<char> buffer = stackalloc char[256];
6259
int remaining = item.Length;
6360
do
6461
{
6562
htmlEncoder.Encode(item.AsSpan()[..remaining], buffer, out var consumed, out var written, isFinalBlock: true);
6663
remaining -= consumed;
67-
sb.Append(buffer.Slice(0, written));
64+
Encoding.UTF8.GetBytes(buffer.Slice(0, written), writer);
6865
} while (remaining != 0);
6966
}
7067
}

0 commit comments

Comments
 (0)