@@ -72,52 +72,59 @@ private void ProcessInputStream()
72
72
// content is encoded in UTF-8
73
73
while ( true )
74
74
{
75
- if ( _inputThread == null ) return ;
76
-
77
- var buffer = new byte [ 300 ] ;
78
- var current = _input . Read ( buffer , 0 , MinBuffer ) ;
79
- if ( current == 0 ) return ; // no more _input
80
- while ( current < MinBuffer ||
81
- buffer [ current - 4 ] != CR || buffer [ current - 3 ] != LF ||
82
- buffer [ current - 2 ] != CR || buffer [ current - 1 ] != LF )
83
- {
84
- var n = _input . Read ( buffer , current , 1 ) ;
85
- if ( n == 0 ) return ; // no more _input, mitigates endless loop here.
86
- current += n ;
87
- }
75
+ try {
76
+ if ( _inputThread == null ) return ;
77
+
78
+ var buffer = new byte [ 300 ] ;
79
+ var current = _input . Read ( buffer , 0 , MinBuffer ) ;
80
+ if ( current == 0 ) return ; // no more _input
81
+ while ( current < MinBuffer ||
82
+ buffer [ current - 4 ] != CR || buffer [ current - 3 ] != LF ||
83
+ buffer [ current - 2 ] != CR || buffer [ current - 1 ] != LF )
84
+ {
85
+ var n = _input . Read ( buffer , current , 1 ) ;
86
+ if ( n == 0 ) return ; // no more _input, mitigates endless loop here.
87
+ current += n ;
88
+ }
88
89
89
- var headersContent = System . Text . Encoding . ASCII . GetString ( buffer , 0 , current ) ;
90
- var headers = headersContent . Split ( HeaderKeys , StringSplitOptions . RemoveEmptyEntries ) ;
91
- long length = 0 ;
92
- for ( var i = 1 ; i < headers . Length ; i += 2 )
93
- {
94
- // starting at i = 1 instead of 0 won't throw, if we have uneven headers' length
95
- var header = headers [ i - 1 ] ;
96
- var value = headers [ i ] . Trim ( ) ;
97
- if ( header . Equals ( "Content-Length" , StringComparison . OrdinalIgnoreCase ) )
90
+ var headersContent = System . Text . Encoding . ASCII . GetString ( buffer , 0 , current ) ;
91
+ var headers = headersContent . Split ( HeaderKeys , StringSplitOptions . RemoveEmptyEntries ) ;
92
+ long length = 0 ;
93
+ for ( var i = 1 ; i < headers . Length ; i += 2 )
98
94
{
99
- length = 0 ;
100
- long . TryParse ( value , out length ) ;
95
+ // starting at i = 1 instead of 0 won't throw, if we have uneven headers' length
96
+ var header = headers [ i - 1 ] ;
97
+ var value = headers [ i ] . Trim ( ) ;
98
+ if ( header . Equals ( "Content-Length" , StringComparison . OrdinalIgnoreCase ) )
99
+ {
100
+ length = 0 ;
101
+ long . TryParse ( value , out length ) ;
102
+ }
101
103
}
102
- }
103
104
104
- if ( length == 0 || length >= int . MaxValue )
105
- {
106
- HandleRequest ( string . Empty ) ;
107
- }
108
- else
109
- {
110
- var requestBuffer = new byte [ length ] ;
111
- var received = 0 ;
112
- while ( received < length )
105
+ if ( length == 0 || length >= int . MaxValue )
106
+ {
107
+ HandleRequest ( string . Empty ) ;
108
+ }
109
+ else
113
110
{
114
- var n = _input . Read ( requestBuffer , received , requestBuffer . Length - received ) ;
115
- if ( n == 0 ) return ; // no more _input
116
- received += n ;
111
+ var requestBuffer = new byte [ length ] ;
112
+ var received = 0 ;
113
+ while ( received < length )
114
+ {
115
+ var n = _input . Read ( requestBuffer , received , requestBuffer . Length - received ) ;
116
+ if ( n == 0 ) return ; // no more _input
117
+ received += n ;
118
+ }
119
+ // TODO sometimes: encoding should be based on the respective header (including the wrong "utf8" value)
120
+ var payload = System . Text . Encoding . UTF8 . GetString ( requestBuffer ) ;
121
+ HandleRequest ( payload ) ;
117
122
}
118
- // TODO sometimes: encoding should be based on the respective header (including the wrong "utf8" value)
119
- var payload = System . Text . Encoding . UTF8 . GetString ( requestBuffer ) ;
120
- HandleRequest ( payload ) ;
123
+ }
124
+ catch ( IOException )
125
+ {
126
+ _logger . LogError ( "Input stream has been closed." ) ;
127
+ break ;
121
128
}
122
129
}
123
130
}
@@ -229,9 +236,10 @@ private void HandleRequest(string request)
229
236
230
237
public void Dispose ( )
231
238
{
239
+ _scheduler . Dispose ( ) ;
232
240
_outputHandler . Dispose ( ) ;
233
241
_inputThread = null ;
234
- _scheduler . Dispose ( ) ;
242
+ _input ? . Dispose ( ) ;
235
243
}
236
244
}
237
245
}
0 commit comments