Пример #1
0
        /// <summary>读取数据</summary>
        /// <param name="context"></param>
        /// <param name="message"></param>
        /// <returns></returns>
        public override Object Read(IHandlerContext context, Object message)
        {
            if (!(message is Packet pk))
            {
                return(base.Read(context, message));
            }

            // 解码得到多个消息
            var list = Decode(context, pk);

            if (list == null)
            {
                return(null);
            }

            foreach (var msg in list)
            {
                // 把数据发送给后续处理器
                var rs = base.Read(context, msg);

                // 匹配输入回调,让上层事件收到分包信息
                context.FireRead(rs);
            }

            return(null);
        }
Пример #2
0
        /// <summary>读取数据</summary>
        /// <param name="context"></param>
        /// <param name="message"></param>
        /// <returns></returns>
        public override Object Read(IHandlerContext context, Object message)
        {
            if (!(message is Packet pk))
            {
                return(base.Read(context, message));
            }

            // 解码得到消息

            var msg = new HttpMessage();

            msg.Read(pk);

            // 匹配输入回调,让上层事件收到分包信息
            context.FireRead(msg);

            //if (pk.ToStr(null, 0, 4) == "HTTP")
            //{
            //    var response = new HttpResponse();
            //    if (!response.ParseHeader(pk)) return base.Read(context, message);

            //    // 匹配输入回调,让上层事件收到分包信息
            //    context.FireRead(response);
            //}
            //else
            //{
            //    var request = new HttpRequest();
            //    if (!request.ParseHeader(pk)) return base.Read(context, message);

            //    // 匹配输入回调,让上层事件收到分包信息
            //    context.FireRead(request);
            //}

            return(null);
        }
Пример #3
0
        /// <summary>读取数据</summary>
        /// <param name="context"></param>
        /// <param name="message"></param>
        /// <returns></returns>
        public override Object Read(IHandlerContext context, Object message)
        {
            if (!(message is Packet pk))
            {
                return(base.Read(context, message));
            }

            // 解码得到多个消息
            var list = Decode(context, pk);

            if (list == null)
            {
                return(null);
            }

            foreach (var msg in list)
            {
                if (UserPacket && msg is IMessage msg2)
                {
                    message = msg2.Payload;
                }
                else
                {
                    message = msg;
                }

                // 后续处理器,得到最终结果,匹配请求队列
                var rs = base.Read(context, message);

                if (msg is IMessage msg3)
                {
                    // 匹配
                    if (msg3.Reply)
                    {
                        //!!! 处理结果的Packet需要拷贝一份,否则交给另一个线程使用会有冲突
                        if (rs is IMessage msg4 && msg4.Payload != null && msg4.Payload == msg3.Payload)
                        {
                            msg4.Payload = msg4.Payload.Clone();
                        }

                        Queue.Match(context.Owner, msg, rs, IsMatch);
                    }
                }
                else if (rs != null)
                {
                    // 其它消息不考虑响应
                    Queue.Match(context.Owner, msg, rs, IsMatch);
                }

                // 匹配输入回调,让上层事件收到分包信息。
                // 这里很可能处于网络IO线程,阻塞了下一个Tcp包的接收
                context.FireRead(rs);
            }

            return(null);
        }
Пример #4
0
        /// <summary>读取数据</summary>
        /// <param name="context"></param>
        /// <param name="message"></param>
        /// <returns></returns>
        public override Object Read(IHandlerContext context, Object message)
        {
            if (!(message is Packet pk))
            {
                return(base.Read(context, message));
            }

            // 是否Http请求
            var ext = context.Owner as IExtend;

            if (!(ext["Encoder"] is HttpEncoder))
            {
                if (!(pk[0] == 'G' && pk[1] == 'E' && pk[2] == 'T') &&
                    !(pk[0] == 'P' && pk[1] == 'O' && pk[2] == 'S' && pk[3] == 'T'))
                {
                    return(base.Read(context, message));
                }

                ext["Encoder"] = new HttpEncoder();
            }

            // 解码得到消息

            var msg = new HttpMessage();

            msg.Read(pk);

            // 匹配输入回调,让上层事件收到分包信息
            context.FireRead(msg);

            //if (pk.ToStr(null, 0, 4) == "HTTP")
            //{
            //    var response = new HttpResponse();
            //    if (!response.ParseHeader(pk)) return base.Read(context, message);

            //    // 匹配输入回调,让上层事件收到分包信息
            //    context.FireRead(response);
            //}
            //else
            //{
            //    var request = new HttpRequest();
            //    if (!request.ParseHeader(pk)) return base.Read(context, message);

            //    // 匹配输入回调,让上层事件收到分包信息
            //    context.FireRead(request);
            //}

            return(null);
        }
Пример #5
0
        /// <summary>读取数据,返回结果作为下一个处理器消息</summary>
        /// <remarks>
        /// 最终处理器决定如何使用消息。
        /// 处理得到单个消息时,调用一次下一级处理器,返回下级结果给上一级;
        /// 处理得到多个消息时,调用多次下一级处理器,返回null给上一级;
        /// </remarks>
        /// <param name="context">上下文</param>
        /// <param name="message">消息</param>
        public virtual Object Read(IHandlerContext context, Object message)
        {
            if (Next != null)
            {
                return(Next.Read(context, message));
            }

            // 最后一个处理器,截断
            if (context != null)
            {
                context.FireRead(message);
            }

            return(message);
        }
Пример #6
0
        /// <summary>读取数据,返回结果作为下一个处理器消息</summary>
        /// <param name="context">上下文</param>
        /// <param name="message">消息</param>
        public virtual void Read(IHandlerContext context, Object message)
        {
            var rs = Head?.Read(context, message);

            if (rs != null)
            {
                //context.Finish?.Invoke(rs);

                // 处理消息
                //var data = context.Data ?? new ReceivedEventArgs();
                //data.Message = rs;
                //context.Session.Receive(data);
                context.FireRead(rs);
            }
        }
Пример #7
0
        /// <summary>读取数据</summary>
        /// <param name="context"></param>
        /// <param name="message"></param>
        /// <returns></returns>
        public override Object Read(IHandlerContext context, Object message)
        {
            if (!(message is Packet pk))
            {
                return(base.Read(context, message));
            }

            // 是否Http请求
            var isGet  = pk.Count >= 4 && pk[0] == 'G' && pk[1] == 'E' && pk[2] == 'T' && pk[3] == ' ';
            var isPost = pk.Count >= 5 && pk[0] == 'P' && pk[1] == 'O' && pk[2] == 'S' && pk[3] == 'T' && pk[4] == ' ';

            // 该连接第一包检查是否Http
            var ext = context.Owner as IExtend;

            if (!(ext["Encoder"] is HttpEncoder))
            {
                // 第一个请求必须是GET/POST,才执行后续操作
                if (!isGet && !isPost)
                {
                    return(base.Read(context, message));
                }

                ext["Encoder"] = new HttpEncoder();
            }

            // 检查是否有未完成消息
            if (ext["Message"] is HttpMessage msg)
            {
                // 数据包拼接到上一个未完整消息中
                if (msg.Payload == null)
                {
                    msg.Payload = pk;
                }
                else
                {
                    msg.Payload.Append(pk);
                }

                // 消息完整才允许上报
                if (msg.ContentLength == 0 || msg.ContentLength > 0 && msg.Payload != null && msg.Payload.Total >= msg.ContentLength)
                {
                    // 匹配输入回调,让上层事件收到分包信息
                    context.FireRead(msg);

                    // 移除消息
                    ext["Message"] = null;
                }
            }
            else
            {
                // 解码得到消息
                msg = new HttpMessage();
                if (!msg.Read(pk))
                {
                    throw new XException("Http请求头不完整");
                }

                if (AllowParseHeader && !msg.ParseHeaders())
                {
                    throw new XException("Http头部解码失败");
                }

                // GET请求一次性过来,暂时不支持头部被拆为多包的场景
                if (isGet)
                {
                    // 匹配输入回调,让上层事件收到分包信息
                    context.FireRead(msg);
                }
                // POST可能多次,最典型的是头部和主体分离
                else
                {
                    // 消息完整才允许上报
                    if (msg.ContentLength == 0 || msg.ContentLength > 0 && msg.Payload != null && msg.Payload.Total >= msg.ContentLength)
                    {
                        // 匹配输入回调,让上层事件收到分包信息
                        context.FireRead(msg);
                    }
                    else
                    {
                        // 请求不完整,拷贝一份,避免缓冲区重用
                        if (msg.Header != null)
                        {
                            msg.Header = msg.Header.Clone();
                        }
                        if (msg.Payload != null)
                        {
                            msg.Payload = msg.Payload.Clone();
                        }

                        ext["Message"] = msg;
                    }
                }
            }

            return(null);
        }