@@ -251,44 +251,35 @@ internal static InboundFrame ReadFrom(Stream reader)
251
251
ProcessProtocolHeader ( reader ) ;
252
252
}
253
253
254
- byte [ ] headerBytes = null ;
254
+ Span < byte > headerBytes = stackalloc byte [ 6 ] ;
255
+ reader . Read ( headerBytes ) ;
256
+ int channel = NetworkOrderDeserializer . ReadUInt16 ( headerBytes ) ;
257
+ int payloadSize = NetworkOrderDeserializer . ReadInt32 ( headerBytes . Slice ( 2 ) ) ; // FIXME - throw exn on unreasonable value
258
+ byte [ ] payloadBytes = ArrayPool < byte > . Shared . Rent ( payloadSize ) ;
259
+ Memory < byte > payload = new Memory < byte > ( payloadBytes , 0 , payloadSize ) ;
260
+ int bytesRead = 0 ;
255
261
try
256
262
{
257
- headerBytes = ArrayPool < byte > . Shared . Rent ( 6 ) ;
258
- Memory < byte > headerSlice = new Memory < byte > ( headerBytes , 0 , 6 ) ;
259
- reader . Read ( headerSlice ) ;
260
- int channel = NetworkOrderDeserializer . ReadUInt16 ( headerSlice ) ;
261
- int payloadSize = NetworkOrderDeserializer . ReadInt32 ( headerSlice . Slice ( 2 ) ) ; // FIXME - throw exn on unreasonable value
262
- byte [ ] payloadBytes = ArrayPool < byte > . Shared . Rent ( payloadSize ) ;
263
- Memory < byte > payload = new Memory < byte > ( payloadBytes , 0 , payloadSize ) ;
264
- int bytesRead = 0 ;
265
- try
263
+ while ( bytesRead < payloadSize )
266
264
{
267
- while ( bytesRead < payloadSize )
268
- {
269
- bytesRead += reader . Read ( payload . Slice ( bytesRead , payloadSize - bytesRead ) ) ;
270
- }
265
+ bytesRead += reader . Read ( payload . Slice ( bytesRead , payloadSize - bytesRead ) ) ;
271
266
}
272
- catch ( Exception )
273
- {
274
- // Early EOF.
275
- ArrayPool < byte > . Shared . Return ( payloadBytes ) ;
276
- throw new MalformedFrameException ( $ "Short frame - expected to read { payloadSize } bytes, only got { bytesRead } bytes") ;
277
- }
278
-
279
- int frameEndMarker = reader . ReadByte ( ) ;
280
- if ( frameEndMarker != Constants . FrameEnd )
281
- {
282
- ArrayPool < byte > . Shared . Return ( payloadBytes ) ;
283
- throw new MalformedFrameException ( "Bad frame end marker: " + frameEndMarker ) ;
284
- }
285
-
286
- return new InboundFrame ( ( FrameType ) type , channel , payload ) ;
287
267
}
288
- finally
268
+ catch ( Exception )
289
269
{
290
- ArrayPool < byte > . Shared . Return ( headerBytes ) ;
270
+ // Early EOF.
271
+ ArrayPool < byte > . Shared . Return ( payloadBytes ) ;
272
+ throw new MalformedFrameException ( $ "Short frame - expected to read { payloadSize } bytes, only got { bytesRead } bytes") ;
291
273
}
274
+
275
+ int frameEndMarker = reader . ReadByte ( ) ;
276
+ if ( frameEndMarker != Constants . FrameEnd )
277
+ {
278
+ ArrayPool < byte > . Shared . Return ( payloadBytes ) ;
279
+ throw new MalformedFrameException ( "Bad frame end marker: " + frameEndMarker ) ;
280
+ }
281
+
282
+ return new InboundFrame ( ( FrameType ) type , channel , payload ) ;
292
283
}
293
284
294
285
public void Dispose ( )
0 commit comments