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;
        }