@@ -40,24 +40,26 @@ public static async Task RenderFortunesHtml(IEnumerable<Fortune> model, HttpCont
40
40
41
41
await httpContext . Response . StartAsync ( ) ;
42
42
43
+ var writer = new BufferWriter < byte > ( httpContext . Response . BodyWriter ) ;
44
+
43
45
Encoding . UTF8 . GetBytes (
44
46
"<!DOCTYPE html><html><head><title>Fortunes</title></head><body><table><tr><th>id</th><th>message</th></tr>" ,
45
- httpContext . Response . BodyWriter ) ;
47
+ writer ) ;
46
48
47
49
foreach ( var item in model )
48
50
{
49
- Encoding . UTF8 . GetBytes ( "<tr><td>" , httpContext . Response . BodyWriter ) ;
50
- Encoding . UTF8 . GetBytes ( item . Id . ToString ( CultureInfo . InvariantCulture ) , httpContext . Response . BodyWriter ) ;
51
- Encoding . UTF8 . GetBytes ( "</td><td>" , httpContext . Response . BodyWriter ) ;
52
- EncodeToPipe ( httpContext . Response . BodyWriter , htmlEncoder , item . Message ) ;
53
- Encoding . UTF8 . GetBytes ( "</td></tr>" , httpContext . Response . BodyWriter ) ;
51
+ Encoding . UTF8 . GetBytes ( "<tr><td>" , writer ) ;
52
+ Encoding . UTF8 . GetBytes ( item . Id . ToString ( CultureInfo . InvariantCulture ) , writer ) ;
53
+ Encoding . UTF8 . GetBytes ( "</td><td>" , writer ) ;
54
+ EncodeToPipe ( writer , htmlEncoder , item . Message ) ;
55
+ Encoding . UTF8 . GetBytes ( "</td></tr>" , writer ) ;
54
56
}
55
57
56
- Encoding . UTF8 . GetBytes ( "</table></body></html>" , httpContext . Response . BodyWriter ) ;
58
+ Encoding . UTF8 . GetBytes ( "</table></body></html>" , writer ) ;
57
59
58
60
await httpContext . Response . BodyWriter . FlushAsync ( ) ;
59
61
60
- static void EncodeToPipe ( PipeWriter writer , HtmlEncoder htmlEncoder , string item )
62
+ static void EncodeToPipe ( IBufferWriter < byte > writer , HtmlEncoder htmlEncoder , string item )
61
63
{
62
64
Span < char > buffer = stackalloc char [ 256 ] ;
63
65
int remaining = item . Length ;
@@ -70,4 +72,35 @@ static void EncodeToPipe(PipeWriter writer, HtmlEncoder htmlEncoder, string item
70
72
}
71
73
}
72
74
}
75
+
76
+ internal class BufferWriter < T > : IBufferWriter < T >
77
+ {
78
+ private readonly IBufferWriter < T > _inner ;
79
+ private Memory < T > _memory ;
80
+
81
+ public BufferWriter ( IBufferWriter < T > writer )
82
+ {
83
+ _inner = writer ;
84
+ }
85
+
86
+ public void Advance ( int count )
87
+ {
88
+ _memory = _memory . Slice ( count ) ;
89
+ _inner . Advance ( count ) ;
90
+ }
91
+
92
+ public Memory < T > GetMemory ( int sizeHint = 0 )
93
+ {
94
+ if ( _memory . Length == 0 || _memory . Length < sizeHint )
95
+ {
96
+ _memory = _inner . GetMemory ( sizeHint ) ;
97
+ }
98
+ return _memory ;
99
+ }
100
+
101
+ public Span < T > GetSpan ( int sizeHint = 0 )
102
+ {
103
+ return GetMemory ( sizeHint ) . Span ;
104
+ }
105
+ }
73
106
}
0 commit comments