@@ -251,44 +251,35 @@ internal static InboundFrame ReadFrom(Stream reader)
251251 ProcessProtocolHeader ( reader ) ;
252252 }
253253
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 ;
255261 try
256262 {
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 )
266264 {
267- while ( bytesRead < payloadSize )
268- {
269- bytesRead += reader . Read ( payload . Slice ( bytesRead , payloadSize - bytesRead ) ) ;
270- }
265+ bytesRead += reader . Read ( payload . Slice ( bytesRead , payloadSize - bytesRead ) ) ;
271266 }
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 ) ;
287267 }
288- finally
268+ catch ( Exception )
289269 {
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") ;
291273 }
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 ) ;
292283 }
293284
294285 public void Dispose ( )
0 commit comments