4
4
using System . Collections . Generic ;
5
5
using System . Globalization ;
6
6
using System . Text ;
7
+ using System . Text . Encodings . Web ;
8
+ using System . Text . Unicode ;
7
9
using System . Threading . Tasks ;
8
10
9
11
namespace PlatformBenchmarks
@@ -17,18 +19,35 @@ public partial class HttpHandler
17
19
private readonly static AsciiString _fortunesRowEnd = "</td></tr>" ;
18
20
private readonly static AsciiString _fortunesTableEnd = "</table></body></html>" ;
19
21
22
+ [ ThreadStatic ]
23
+ private static char [ ] mHtmlEncodeBuffer ;
24
+
25
+ protected HtmlEncoder HtmlEncoder { get ; } = CreateHtmlEncoder ( ) ;
26
+
27
+ private static HtmlEncoder CreateHtmlEncoder ( )
28
+ {
29
+ var settings = new TextEncoderSettings ( UnicodeRanges . BasicLatin , UnicodeRanges . Katakana , UnicodeRanges . Hiragana ) ;
30
+ settings . AllowCharacter ( '\u2014 ' ) ; // allow EM DASH through
31
+ return HtmlEncoder . Create ( settings ) ;
32
+ }
33
+
20
34
public async Task fortunes ( PipeStream stream , HttpToken token , ISession session )
21
35
{
22
36
try
23
37
{
38
+
24
39
var data = await token . Db . LoadFortunesRows ( ) ;
25
40
stream . Write ( _fortunesTableStart . Data , 0 , _fortunesTableStart . Length ) ;
26
41
foreach ( var item in data )
27
42
{
28
43
stream . Write ( _fortunesRowStart . Data , 0 , _fortunesRowStart . Length ) ;
29
44
stream . Write ( item . Id . ToString ( CultureInfo . InvariantCulture ) ) ;
30
45
stream . Write ( _fortunesColumn . Data , 0 , _fortunesColumn . Length ) ;
31
- stream . Write ( System . Web . HttpUtility . HtmlEncode ( item . Message ) ) ;
46
+ if ( mHtmlEncodeBuffer == null )
47
+ mHtmlEncodeBuffer = new char [ 1024 ] ;
48
+ HtmlEncoder . Encode ( item . Message , mHtmlEncodeBuffer , out int consumed , out int writtens ) ;
49
+ //stream.Write(HtmlEncoder.Encode(item.Message));
50
+ stream . Write ( new ArraySegment < char > ( mHtmlEncodeBuffer , 0 , writtens ) ) ;
32
51
stream . Write ( _fortunesRowEnd . Data , 0 , _fortunesRowEnd . Length ) ;
33
52
}
34
53
stream . Write ( _fortunesTableEnd . Data , 0 , _fortunesTableEnd . Length ) ;
0 commit comments