private void HandleMessage(WebSocketMessage message)
 {
     //todo: allow Socket to handle opcodes?
     if (message.OpCode == WebSocketOpcodes.TextFrame)
     {
         Handler.ProcessMessage(message.GetText());
     }
     else if (message.OpCode == WebSocketOpcodes.BinaryFrame)
     {
         Handler.ProcessMessage(message.Content);
     }
     //todo: close connection?
 }
        private void ListenerLoop()
        {
            WebSocketFrameHeader messageHeader = null;
            MemoryStream messageContent = new MemoryStream();
            ulong messageLength = 0;

            //todo: stop gracefully
            while (!isClosed)
            {
                WebSocketFrame frame = ReadFrame();

                if (WebSocketOpcodes.IsControlFrame(frame.Header.OpCode))
                {
                    //todo: remove magic number
                    if (!frame.Header.IsLast || frame.Header.PayloadLength > 125)
                    {
                        throw new HcduServerException(string.Format("Invalid control frame (Opcode: {0}, FIN: {1}, Length: {2}).", frame.Header.OpCode, frame.Header.IsLast, frame.Header.PayloadLength));
                    }
                    HandleControlFrame(frame);
                }

                if (messageHeader == null)
                {
                    if (frame.Header.OpCode == WebSocketOpcodes.ContinuationFrame)
                    {
                        throw new HcduServerException("Continuation frame cannot start message.");
                    }
                    messageHeader = frame.Header;
                }

                messageLength += frame.Header.PayloadLength;
                if (messageLength > int.MaxValue)
                {
                    throw new HcduServerException("Long messages are not supported.");
                }

                messageContent.Write(frame.Content, 0, frame.Content.Length);

                if (frame.Header.IsLast)
                {
                    WebSocketMessage message = new WebSocketMessage();
                    message.OpCode = messageHeader.OpCode;
                    message.Content = messageContent.ToArray();

                    messageHeader = null;
                    messageContent = new MemoryStream();

                    HandleMessage(message);
                }
            }
        }