1
1
using System ;
2
2
using System . Buffers ;
3
3
using System . IO ;
4
- using System . Net . Sockets ;
5
4
using System . Text ;
6
5
using System . Threading . Tasks ;
7
6
@@ -30,20 +29,17 @@ internal sealed class ResponseHandler
30
29
31
30
private Stream OutputStream { get ; }
32
31
33
- private Socket Socket { get ; }
34
-
35
32
internal NetworkConfiguration Configuration { get ; }
36
33
37
34
#endregion
38
35
39
36
#region Initialization
40
37
41
- internal ResponseHandler ( IServer server , Stream outputstream , Socket socket , NetworkConfiguration configuration )
38
+ internal ResponseHandler ( IServer server , Stream outputstream , NetworkConfiguration configuration )
42
39
{
43
40
Server = server ;
44
41
45
42
OutputStream = outputstream ;
46
- Socket = socket ;
47
43
48
44
Configuration = configuration ;
49
45
}
@@ -52,11 +48,11 @@ internal ResponseHandler(IServer server, Stream outputstream, Socket socket, Net
52
48
53
49
#region Functionality
54
50
55
- internal async ValueTask < bool > Handle ( IRequest request , IResponse response , bool keepAlive )
51
+ internal async ValueTask < bool > Handle ( IRequest request , IResponse response , bool keepAlive , bool dataRemaining )
56
52
{
57
53
try
58
54
{
59
- await WriteStatus ( request , response ) . ConfigureAwait ( false ) ;
55
+ await WriteStatus ( request , response ) ;
60
56
61
57
await WriteHeader ( response , keepAlive ) ;
62
58
@@ -67,11 +63,12 @@ internal async ValueTask<bool> Handle(IRequest request, IResponse response, bool
67
63
await WriteBody ( response ) ;
68
64
}
69
65
70
- Socket . NoDelay = true ;
71
-
72
- await OutputStream . FlushAsync ( ) ;
73
-
74
- Socket . NoDelay = false ;
66
+ // flush if the client waits for this response
67
+ // otherwise save flushes for improved performance when pipelining
68
+ if ( ! dataRemaining )
69
+ {
70
+ await OutputStream . FlushAsync ( ) ;
71
+ }
75
72
76
73
Server . Companion ? . OnRequestHandled ( request , response ) ;
77
74
@@ -104,11 +101,11 @@ private async ValueTask WriteHeader(IResponse response, bool keepAlive)
104
101
{
105
102
if ( response . Headers . TryGetValue ( SERVER_HEADER , out var server ) )
106
103
{
107
- await WriteHeaderLine ( SERVER_HEADER , server ) . ConfigureAwait ( false ) ;
104
+ await WriteHeaderLine ( SERVER_HEADER , server ) ;
108
105
}
109
106
else
110
107
{
111
- await Write ( "Server: GenHTTP/" , Server . Version , NL ) . ConfigureAwait ( false ) ;
108
+ await Write ( "Server: GenHTTP/" , Server . Version , NL ) ;
112
109
}
113
110
114
111
await WriteHeaderLine ( "Date" , DateHeader . GetValue ( ) ) ;
@@ -183,13 +180,13 @@ private async ValueTask WriteBody(IResponse response)
183
180
{
184
181
using var chunked = new ChunkedStream ( OutputStream ) ;
185
182
186
- await response . Content . WriteAsync ( chunked , Configuration . TransferBufferSize ) . ConfigureAwait ( false ) ;
183
+ await response . Content . WriteAsync ( chunked , Configuration . TransferBufferSize ) ;
187
184
188
185
await chunked . FinishAsync ( ) ;
189
186
}
190
187
else
191
188
{
192
- await response . Content . WriteAsync ( OutputStream , Configuration . TransferBufferSize ) . ConfigureAwait ( false ) ;
189
+ await response . Content . WriteAsync ( OutputStream , Configuration . TransferBufferSize ) ;
193
190
}
194
191
}
195
192
}
@@ -204,7 +201,7 @@ private async ValueTask WriteBody(IResponse response)
204
201
205
202
private async ValueTask WriteCookie ( Cookie cookie )
206
203
{
207
- await Write ( "Set-Cookie: " , cookie . Name , "=" , cookie . Value ) . ConfigureAwait ( false ) ;
204
+ await Write ( "Set-Cookie: " , cookie . Name , "=" , cookie . Value ) ;
208
205
209
206
if ( cookie . MaxAge is not null )
210
207
{
@@ -264,7 +261,7 @@ private async ValueTask Write(string part1, string? part2 = null, string? part3
264
261
ASCII . GetBytes ( part7 , 0 , part7 . Length , buffer , index ) ;
265
262
}
266
263
267
- await OutputStream . WriteAsync ( buffer . AsMemory ( 0 , length ) ) . ConfigureAwait ( false ) ;
264
+ await OutputStream . WriteAsync ( buffer . AsMemory ( 0 , length ) ) ;
268
265
}
269
266
finally
270
267
{
0 commit comments