示例#1
0
文件: Binary.cs 项目: git-thinh/core
        public override void ExecuteCommand(TWebSocketSession session, IWebSocketFragment commandInfo)
        {
            var frame = commandInfo as WebSocketDataFrame;

            if (!CheckFrame(frame))
            {
                session.Close();
                return;
            }

            if (frame.FIN)
            {
                if (session.Frames.Count > 0)
                {
                    session.Close();
                    return;
                }

                var data = GetWebSocketData(frame);
                session.AppServer.OnNewDataReceived(session, data);
            }
            else
            {
                session.Frames.Add(frame);
            }
        }
示例#2
0
        /// <summary>
        /// Executes the command.
        /// </summary>
        /// <param name="session">The session.</param>
        /// <param name="requestInfo">The request info.</param>
        public override void ExecuteCommand(TWebSocketSession session, IWebSocketFragment requestInfo)
        {
            var frame = requestInfo as WebSocketDataFrame;

            if (!CheckFrame(frame))
            {
                session.Close();
                return;
            }

            if (frame.FIN)
            {
                if (session.Frames.Count > 0)
                {
                    session.Close();
                    return;
                }

                var text = GetWebSocketText(frame);
                session.AppServer.OnNewMessageReceived(session, text);
            }
            else
            {
                session.Frames.Add(frame);
            }
        }
示例#3
0
        /// <summary>
        /// Executes the command.
        /// </summary>
        /// <param name="session">The session.</param>
        /// <param name="requestInfo">The request info.</param>
        public override void ExecuteCommand(TWebSocketSession session, IWebSocketFragment requestInfo)
        {
            var frame = requestInfo as WebSocketDataFrame;

            if (!CheckControlFrame(frame))
            {
                session.Close();
                return;
            }

            //the close handshake started from server side, now received a handshake response
            if (session.InClosing)
            {
                //Close the underlying socket directly
                session.Close(CloseReason.ClientClosing);
                return;
            }

            var data = GetWebSocketData(frame);

            var closeStatusCode = session.ProtocolProcessor.CloseStatusClode.NormalClosure;

            //var reasonText = string.Empty;

            if (data != null && data.Length > 0)
            {
                if (data.Length == 1)
                {
                    session.Close(CloseReason.ProtocolError);
                    return;
                }
                else
                {
                    var code = data[0] * 256 + data[1];

                    if (!session.ProtocolProcessor.IsValidCloseCode(code))
                    {
                        session.Close(CloseReason.ProtocolError);
                        return;
                    }

                    closeStatusCode = code;

                    //if (data.Length > 2)
                    //{
                    //    reasonText = this.Utf8Encoding.GetString(data, 2, data.Length - 2);
                    //}
                }
            }

            //Send handshake response
            session.SendCloseHandshakeResponse(closeStatusCode);
            //Don't include close reason the close handshake response for now
            //session.SendCloseHandshakeResponse(closeStatusCode, reasonText);
            //After both sending and receiving a Close message, the server MUST close the underlying TCP connection immediately
            session.Close(CloseReason.ClientClosing);
        }
示例#4
0
        /// <summary>
        /// Executes the command.
        /// </summary>
        /// <param name="session">The session.</param>
        /// <param name="requestInfo">The request info.</param>
        public override void ExecuteCommand(TWebSocketSession session, IWebSocketFragment requestInfo)
        {
            //Do nothing, last active time has been updated automatically

            var frame = requestInfo as WebSocketDataFrame;

            if (!CheckControlFrame(frame))
            {
                session.Close();
                return;
            }
        }
示例#5
0
        /// <summary>
        /// Executes the command.
        /// </summary>
        /// <param name="session">The session.</param>
        /// <param name="requestInfo">The request info.</param>
        public override void ExecuteCommand(TWebSocketSession session, IWebSocketFragment requestInfo)
        {
            var frame = requestInfo as WebSocketDataFrame;

            if (!CheckControlFrame(frame))
            {
                session.Close();
                return;
            }

            var data = GetWebSocketData(frame);

            session.ProtocolProcessor.SendPong(session, data);
        }
示例#6
0
        /// <summary>
        /// Executes the command.
        /// </summary>
        /// <param name="session">The session.</param>
        /// <param name="requestInfo">The request info.</param>
        public override void ExecuteCommand(TWebSocketSession session, IWebSocketFragment requestInfo)
        {
            var frame = requestInfo as WebSocketDataFrame;

            if (!CheckFrame(frame))
            {
                session.Close();
                return;
            }

            session.Frames.Add(frame);

            if (!frame.FIN)
            {
                return;
            }

            var firstFrame = session.Frames[0];

            if (firstFrame.OpCode == OpCode.Text)
            {
                var text = GetWebSocketText(session.Frames);
                session.Frames.Clear();
                session.AppServer.OnNewMessageReceived(session, text);
            }
            else if (firstFrame.OpCode == OpCode.Binary)
            {
                var data = GetWebSocketData(session.Frames);
                session.Frames.Clear();
                session.AppServer.OnNewDataReceived(session, data);
            }
            else
            {
                //http://tools.ietf.org/html/rfc6455#section-5.5
                //All control frames MUST have a payload length of 125 bytes or less and MUST NOT be fragmented.
                session.Close();
            }
        }
示例#7
0
 /// <summary>
 /// Executes the command.
 /// </summary>
 /// <param name="session">The session.</param>
 /// <param name="requestInfo">The request info.</param>
 public override void ExecuteCommand(TWebSocketSession session, IWebSocketFragment requestInfo)
 {
     session.Handshaked = true;
     session.AppServer.FireOnNewSessionConnected(session);
 }
示例#8
0
 /// <summary>
 /// Handle Unknown request
 /// </summary>
 /// <param name="content">The package content.</param>
 protected override void HandleUnknownRequest(IWebSocketFragment content)
 {
     Logger.Debug($"Manager::HandleUnknownRequest - Unknown package. Content: {content}");
 }
示例#9
0
 /// <summary>
 /// Executes the command.
 /// </summary>
 /// <param name="session">The session.</param>
 /// <param name="requestInfo">The request info.</param>
 public override void ExecuteCommand(TWebSocketSession session, IWebSocketFragment requestInfo)
 {
     session.OnHandshakeSuccess();
 }
示例#10
0
 protected override void HandleUnknownRequest(IWebSocketFragment requestInfo)
 {
     base.HandleUnknownRequest(requestInfo);
 }
示例#11
0
        /// <summary>
        /// Executes the command.
        /// </summary>
        /// <param name="session">The session.</param>
        /// <param name="requestInfo">The request info.</param>
        public override void ExecuteCommand(TWebSocketSession session, IWebSocketFragment requestInfo)
        {
            var plainFragment = requestInfo as PlainFragment;

            session.AppServer.OnNewMessageReceived(session, plainFragment.Message);
        }