1- using GenHTTP . Modules . IO . Streaming ;
1+ using GenHTTP . Engine . Internal . Utilities ;
22
33namespace GenHTTP . Engine . Internal . Protocol ;
44
@@ -11,18 +11,8 @@ namespace GenHTTP.Engine.Internal.Protocol;
1111/// soon as there is no known content length. To avoid this overhead,
1212/// specify the length of your content whenever possible.
1313/// </remarks>
14- public sealed class ChunkedStream : Stream
14+ public sealed class ChunkedStream ( PoolBufferedStream target ) : Stream
1515{
16- private static readonly string NL = "\r \n " ;
17-
18- #region Initialization
19-
20- public ChunkedStream ( Stream target )
21- {
22- Target = target ;
23- }
24-
25- #endregion
2616
2717 #region Get-/Setters
2818
@@ -36,7 +26,7 @@ public ChunkedStream(Stream target)
3626
3727 public override long Position { get => throw new NotSupportedException ( ) ; set => throw new NotSupportedException ( ) ; }
3828
39- private Stream Target { get ; }
29+ private Stream Target { get ; } = target ;
4030
4131 #endregion
4232
@@ -59,37 +49,37 @@ public override void Write(byte[] buffer, int offset, int count)
5949
6050 Target . Write ( buffer , offset , count ) ;
6151
62- NL . Write ( Target ) ;
52+ Target . Write ( " \r \n "u8 ) ;
6353 }
6454 }
6555
6656 public override async Task WriteAsync ( byte [ ] buffer , int offset , int count , CancellationToken cancellationToken )
6757 {
6858 if ( count > 0 )
6959 {
70- await WriteAsync ( count ) ;
60+ Write ( count ) ;
7161
7262 await Target . WriteAsync ( buffer . AsMemory ( offset , count ) , cancellationToken ) ;
7363
74- await WriteAsync ( NL ) ;
64+ Target . Write ( " \r \n "u8 ) ;
7565 }
7666 }
7767
7868 public override async ValueTask WriteAsync ( ReadOnlyMemory < byte > buffer , CancellationToken cancellationToken = default )
7969 {
8070 if ( ! buffer . IsEmpty )
8171 {
82- await WriteAsync ( buffer . Length ) ;
72+ Write ( buffer . Length ) ;
8373
8474 await Target . WriteAsync ( buffer , cancellationToken ) ;
8575
86- await WriteAsync ( NL ) ;
76+ Target . Write ( " \r \n "u8 ) ;
8777 }
8878 }
8979
90- public async ValueTask FinishAsync ( )
80+ public void Finish ( )
9181 {
92- await WriteAsync ( "0\r \n \r \n " ) ;
82+ Target . Write ( "0\r \n \r \n "u8 ) ;
9383 }
9484
9585 public override void Flush ( )
@@ -99,11 +89,22 @@ public override void Flush()
9989
10090 public override Task FlushAsync ( CancellationToken cancellationToken ) => Target . FlushAsync ( cancellationToken ) ;
10191
102- private void Write ( int value ) => $ "{ value : X} \r \n ". Write ( Target ) ;
92+ private void Write ( int value )
93+ {
94+ Span < byte > buffer = stackalloc byte [ 8 + 2 ] ;
10395
104- private ValueTask WriteAsync ( string text ) => text . WriteAsync ( Target ) ;
96+ if ( value . TryFormat ( buffer , out var written , "X" ) )
97+ {
98+ buffer [ written ++ ] = ( byte ) '\r ' ;
99+ buffer [ written ++ ] = ( byte ) '\n ' ;
105100
106- private ValueTask WriteAsync ( int value ) => $ "{ value : X} \r \n ". WriteAsync ( Target ) ;
101+ Target . Write ( buffer [ ..written ] ) ;
102+ }
103+ else
104+ {
105+ throw new InvalidOperationException ( "Failed to format chunk size" ) ;
106+ }
107+ }
107108
108109 #endregion
109110
0 commit comments