@@ -151,20 +151,28 @@ internal static Task<int> IsPriMethod(ICustomStreamReader clientStreamReader, IB
151
151
/// </returns>
152
152
private static async Task < int > startsWith ( ICustomStreamReader clientStreamReader , IBufferPool bufferPool , string expectedStart , CancellationToken cancellationToken = default )
153
153
{
154
- int iRet = - 1 ;
155
154
const int lengthToCheck = 10 ;
156
155
byte [ ] buffer = null ;
157
156
try
158
157
{
159
- buffer = bufferPool . GetBuffer ( Math . Max ( bufferPool . BufferSize , lengthToCheck ) ) ;
158
+ if ( bufferPool . BufferSize < lengthToCheck )
159
+ {
160
+ throw new Exception ( $ "Buffer is too small. Minimum size is { lengthToCheck } bytes") ;
161
+ }
160
162
161
- int peeked = await clientStreamReader . PeekBytesAsync ( buffer , 0 , 0 , lengthToCheck , cancellationToken ) ;
163
+ buffer = bufferPool . GetBuffer ( bufferPool . BufferSize ) ;
162
164
163
- if ( peeked > 0 )
165
+ bool isExpected = true ;
166
+ int i = 0 ;
167
+ while ( i < lengthToCheck )
164
168
{
165
- bool isExpected = true ;
169
+ int peeked = await clientStreamReader . PeekBytesAsync ( buffer , i , i , lengthToCheck - i , cancellationToken ) ;
170
+ if ( peeked == 0 )
171
+ return - 1 ;
172
+
173
+ peeked += i ;
166
174
167
- for ( int i = 0 ; i < lengthToCheck ; i ++ )
175
+ while ( i < peeked )
168
176
{
169
177
int b = buffer [ i ] ;
170
178
@@ -173,23 +181,23 @@ private static async Task<int> startsWith(ICustomStreamReader clientStreamReader
173
181
else
174
182
{
175
183
char ch = ( char ) b ;
176
- if ( ! char . IsLetter ( ch ) )
184
+ if ( ch < 'A' || ch > 'z' || ( ch > 'Z' && ch < 'a' ) ) // ASCII letter
177
185
return - 1 ;
178
186
else if ( i >= expectedStart . Length || ch != expectedStart [ i ] )
179
- isExpected = false ;
187
+ isExpected = false ;
180
188
}
181
- }
182
189
183
- // only letters
184
- iRet = isExpected ? 1 : 0 ;
190
+ i ++ ;
191
+ }
185
192
}
193
+
194
+ // only letters
195
+ return 0 ;
186
196
}
187
197
finally
188
198
{
189
199
bufferPool . ReturnBuffer ( buffer ) ;
190
- buffer = null ;
191
200
}
192
- return iRet ;
193
201
}
194
202
}
195
203
}
0 commit comments