@@ -42,8 +42,8 @@ IResponseRouter responseRouter
42
42
_responseRouter = responseRouter ;
43
43
44
44
_scheduler = new ProcessScheduler ( ) ;
45
- _inputThread = new Thread ( ProcessInputStream ) { IsBackground = true } ;
46
- }
45
+ _inputThread = new Thread ( ProcessInputStream ) { IsBackground = true , Name = "ProcessInputStream" } ;
46
+ }
47
47
48
48
public void Start ( )
49
49
{
@@ -60,10 +60,14 @@ private async void ProcessInputStream()
60
60
61
61
var buffer = new char [ 300 ] ;
62
62
var current = await _input . ReadBlockAsync ( buffer , 0 , MinBuffer ) ;
63
+ if ( current == 0 ) return ; // no more _input
64
+
63
65
while ( current < MinBuffer || buffer [ current - 4 ] != CR || buffer [ current - 3 ] != LF ||
64
66
buffer [ current - 2 ] != CR || buffer [ current - 1 ] != LF )
65
67
{
66
- current += await _input . ReadBlockAsync ( buffer , current , 1 ) ;
68
+ var n = await _input . ReadBlockAsync ( buffer , current , 1 ) ;
69
+ if ( n == 0 ) return ; // no more _input, mitigates endless loop here.
70
+ current += n ;
67
71
}
68
72
69
73
var headersContent = new string ( buffer , 0 , current ) ;
@@ -75,17 +79,28 @@ private async void ProcessInputStream()
75
79
var value = headers [ i + 1 ] . Trim ( ) ;
76
80
if ( header . Equals ( "Content-Length" , StringComparison . OrdinalIgnoreCase ) )
77
81
{
78
- length = long . Parse ( value ) ;
82
+ length = 0 ;
83
+ long . TryParse ( value , out length ) ;
79
84
}
80
85
}
81
86
82
- var requestBuffer = new char [ length ] ;
83
-
84
- await _input . ReadBlockAsync ( requestBuffer , 0 , requestBuffer . Length ) ;
85
-
86
- var payload = new string ( requestBuffer ) ;
87
-
88
- HandleRequest ( payload ) ;
87
+ if ( length == 0 || length >= int . MaxValue )
88
+ {
89
+ HandleRequest ( string . Empty ) ;
90
+ }
91
+ else
92
+ {
93
+ var requestBuffer = new char [ length ] ;
94
+ var received = 0 ;
95
+ while ( received < length )
96
+ {
97
+ var n = await _input . ReadBlockAsync ( requestBuffer , received , requestBuffer . Length - received ) ;
98
+ if ( n == 0 ) return ; // no more _input
99
+ received += n ;
100
+ }
101
+ var payload = new string ( requestBuffer ) ;
102
+ HandleRequest ( payload ) ;
103
+ }
89
104
}
90
105
}
91
106
@@ -140,7 +155,6 @@ private void HandleRequest(string request)
140
155
type ,
141
156
async ( ) => {
142
157
var result = await _requestRouter . RouteRequest ( item . Request ) ;
143
-
144
158
_outputHandler . Send ( result . Value ) ;
145
159
}
146
160
) ;
@@ -168,7 +182,7 @@ public void Dispose()
168
182
{
169
183
_outputHandler . Dispose ( ) ;
170
184
_inputThread = null ;
171
- _scheduler ? . Dispose ( ) ;
185
+ _scheduler . Dispose ( ) ;
172
186
}
173
187
}
174
188
}
0 commit comments