diff --git a/websocket-sharp/WebSocketFrame.cs b/websocket-sharp/WebSocketFrame.cs index 5657f935..25bcaff2 100644 --- a/websocket-sharp/WebSocketFrame.cs +++ b/websocket-sharp/WebSocketFrame.cs @@ -425,6 +425,57 @@ Extended Payload Length: {7} payload); } + private static WebSocketFrame processHeader (byte[] header) + { + if (header.Length != 2) + throw new WebSocketException ( + "The header part of a frame cannot be read from the data source."); + + // FIN + var fin = (header[0] & 0x80) == 0x80 ? Fin.Final : Fin.More; + + // RSV1 + var rsv1 = (header[0] & 0x40) == 0x40 ? Rsv.On : Rsv.Off; + + // RSV2 + var rsv2 = (header[0] & 0x20) == 0x20 ? Rsv.On : Rsv.Off; + + // RSV3 + var rsv3 = (header[0] & 0x10) == 0x10 ? Rsv.On : Rsv.Off; + + // Opcode + var opcode = (Opcode) (header[0] & 0x0f); + + // MASK + var mask = (header[1] & 0x80) == 0x80 ? Mask.Mask : Mask.Unmask; + + // Payload Length + var payloadLen = (byte) (header[1] & 0x7f); + + // Check if valid header. + var err = isControl (opcode) && payloadLen > 125 + ? "A control frame has payload data which is greater than the allowable max length." + : isControl (opcode) && fin == Fin.More + ? "A control frame is fragmented." + : !isData (opcode) && rsv1 == Rsv.On + ? "A non data frame is compressed." + : null; + + if (err != null) + throw new WebSocketException (CloseStatusCode.ProtocolError, err); + + var frame = new WebSocketFrame (); + frame._fin = fin; + frame._rsv1 = rsv1; + frame._rsv2 = rsv2; + frame._rsv3 = rsv3; + frame._opcode = opcode; + frame._mask = mask; + frame._payloadLength = payloadLen; + + return frame; + } + private static WebSocketFrame read (byte[] header, Stream stream, bool unmask) { /* Header */ @@ -550,58 +601,7 @@ Extended Payload Length: {7} private static void readHeaderAsync ( Stream stream, Action completed, Action error) { - stream.ReadBytesAsync ( - 2, - header => { - if (header.Length != 2) - throw new WebSocketException ( - "The header part of a frame cannot be read from the data source."); - - // FIN - var fin = (header[0] & 0x80) == 0x80 ? Fin.Final : Fin.More; - - // RSV1 - var rsv1 = (header[0] & 0x40) == 0x40 ? Rsv.On : Rsv.Off; - - // RSV2 - var rsv2 = (header[0] & 0x20) == 0x20 ? Rsv.On : Rsv.Off; - - // RSV3 - var rsv3 = (header[0] & 0x10) == 0x10 ? Rsv.On : Rsv.Off; - - // Opcode - var opcode = (Opcode) (header[0] & 0x0f); - - // MASK - var mask = (header[1] & 0x80) == 0x80 ? Mask.Mask : Mask.Unmask; - - // Payload Length - var payloadLen = (byte) (header[1] & 0x7f); - - // Check if valid header. - var err = isControl (opcode) && payloadLen > 125 - ? "A control frame has payload data which is greater than the allowable max length." - : isControl (opcode) && fin == Fin.More - ? "A control frame is fragmented." - : !isData (opcode) && rsv1 == Rsv.On - ? "A non data frame is compressed." - : null; - - if (err != null) - throw new WebSocketException (CloseStatusCode.ProtocolError, err); - - var frame = new WebSocketFrame (); - frame._fin = fin; - frame._rsv1 = rsv1; - frame._rsv2 = rsv2; - frame._rsv3 = rsv3; - frame._opcode = opcode; - frame._mask = mask; - frame._payloadLength = payloadLen; - - completed (frame); - }, - error); + stream.ReadBytesAsync (2, header => completed (processHeader (header)), error); } private static void readMaskingKeyAsync (