private void HandleControlFrame(WebSocketFrame frame) { if (frame.Header.OpCode == WebSocketOpcodes.ConnectionCloseFrame) { try { SendMessage(WebSocketOpcodes.ConnectionCloseFrame, frame.Content); } catch (IOException) { //todo: use more general approach for exception handling } isClosed = true; } if (frame.Header.OpCode == WebSocketOpcodes.PingFrame) { //todo: send pong } if (frame.Header.OpCode == WebSocketOpcodes.PongFrame) { //todo: check pong } }
private WebSocketFrame ReadFrame() { WebSocketFrameHeader frameHeader = ReadFrameHeader(); if (frameHeader.PayloadLength > int.MaxValue) { throw new HcduServerException("Long messages are not supported."); } if (frameHeader.Mask == null) { throw new HcduServerException("Client messages should be masked."); } byte[] content = HttpUtils.ReadBlock(stream, (int) frameHeader.PayloadLength); if (frameHeader.Mask != null) { for (int i = 0; i < content.Length; i++) { content[i] = (byte) (content[i] ^ frameHeader.Mask[i%4]); } } WebSocketFrame frame = new WebSocketFrame(); frame.Header = frameHeader; frame.Content = content; return frame; }