Beispiel #1
0
        private void Write(Session session, Uri uri, Byte[] Data)
        {
            StringBuilder sb = new StringBuilder();

            sb.AppendLine("HTTP/1.1 200 OK");
            sb.AppendFormat("Content-Length: {0}\r\n", Data.Length);
            String ctype = ContentType.Other;
            String ext   = Path.GetExtension(uri.LocalPath).ToLower();

            switch (ext)
            {
            case ".xml":
                ctype = ContentType.Xml;
                break;

            case ".inf":
                ctype = ContentType.Inf;
                break;

            case ".zip":
                ctype = ContentType.Zip;
                break;

            case ".ini":
                ctype = ContentType.Ini;
                break;

            case ".rp":
            case ".zip1":
                ctype = ContentType.Rp;
                break;
            }
            sb.AppendFormat("Content-Type: {0}\r\n", ctype);
            sb.AppendLine("Last-Modified: Tue, 22 Jan 2008 11:26:53 GMT");
            sb.AppendLine("Accept-Ranges: bytes");
            sb.AppendLine("ETag: W/\"3415b0e95cc81:53b\"");
            sb.AppendLine("Server: Microsoft-IIS/6.0");
            sb.AppendLine("X-Powered-By: ASP.NET");
            sb.AppendLine("Date: Tue, 22 Jan 2008 14:11:14 GMT");
            sb.AppendLine("X-Cache: MISS from CNC-TJ-167-83.fastcdn.com");
            sb.AppendLine("Age: 983");
            sb.AppendLine("X-Cache: HIT from CNC-HBCZ-2-73.fastcdn.com");
            sb.AppendLine("Connection: keep-alive");
            sb.AppendLine("");
            //sb.AppendLine("");
            //回发数据
            Data = ByteHelper.Cat(Encoding.ASCII.GetBytes(sb.ToString()), Data);
            //session.SendToClient(Encoding.ASCII.GetBytes(sb.ToString()));
            //session.SendToClient(Data);
        }
Beispiel #2
0
        /// <summary>
        /// 服务器相客户端发数据时触发。
        /// </summary>
        /// <param name="session">客户端</param>
        /// <param name="Data">数据</param>
        /// <returns>经过处理后的数据</returns>
        public override Byte[] OnServerToClient(Session session, Byte[] Data)
        {
            if (Plugins == null || Plugins.Count < 1)
            {
                return(Data);
            }

            if (HttpHelper.IsHttpResponse(Data))
            {
                var p = ByteHelper.IndexOf(Data, "\r\n\r\n");
                if (p < 0)
                {
                    return(null);
                }
                var bts = ByteHelper.SubBytes(Data, 0, p);

                for (var i = 0; i < Plugins.Count; i++)
                {
                    bts = Plugins[i].OnResponseHeader(session, bts);
                    //直接阻止
                    if (bts == null || bts.Length < 1)
                    {
                        return(null);
                    }
                }

                var header = Encoding.ASCII.GetString(bts);

                //对于响应,只能直接显示头部,只有头部可以用ASCII解码
                if (ShowResponse)
                {
                    session.WriteLog("响应头(" + Data.Length + "Byte):\n" + header);
                }

                //for (int i = 0; i < Plugins.Count; i++)
                //{
                //    header = Plugins[i].OnResponseHeader(session, header);
                //    //直接阻止
                //    if (String.IsNullOrEmpty(header)) return null;
                //}

                //bts = Encoding.ASCII.GetBytes(header + "\r\n\r\n");

                bts = ByteHelper.Cat(bts, Encoding.ASCII.GetBytes("\r\n\r\n"));

                //是否有数据需要处理
                if (Data.Length > p + 4)
                {
                    Data = ByteHelper.SubBytes(Data, p + 4, -1);
                    for (var i = 0; i < Plugins.Count; i++)
                    {
                        Data = Plugins[i].OnResponseContent(session, Data);
                        //直接阻止
                        if (Data == null || Data.Length < 1)
                        {
                            return(null);
                        }
                    }
                    Data = ByteHelper.Cat(bts, Data);
                }
                else
                {
                    Data = bts;
                }
            }
            else
            {
                if (ShowResponse)
                {
#if !DEBUG
                    session.WriteLog("响应数据(" + Data.Length + "Byte)");
#else
                    session.WriteLog("响应数据(" + Data.Length + "Byte):\n" + Encoding.Default.GetString(Data));
#endif
                }
                for (var i = 0; i < Plugins.Count; i++)
                {
                    Data = Plugins[i].OnResponseContent(session, Data);
                    //直接阻止
                    if (Data == null || Data.Length < 1)
                    {
                        return(null);
                    }
                }
            }

            return(Data);
        }
Beispiel #3
0
        /// <summary>
        /// 客户端向服务器发数据时触发。
        /// </summary>
        /// <param name="session">客户端</param>
        /// <param name="Data">数据</param>
        /// <returns>经过处理后的数据</returns>
        public override Byte[] OnClientToServer(Session session, Byte[] Data)
        {
            if (Plugins == null || Plugins.Count < 1)
            {
                return(Data);
            }

            //一般的请求都是ASCII编码,可以直接显示
            if (ShowRequest)
            {
                session.WriteLog("请求头(" + Data.Length + "Byte):\n" + Encoding.ASCII.GetString(Data));
            }

            if (HttpHelper.IsHttpRequest(Data))
            {
                var p = ByteHelper.IndexOf(Data, "\r\n\r\n");
                if (p < 0)
                {
                    return(null);
                }
                var bts = ByteHelper.SubBytes(Data, 0, p);

                for (var i = 0; i < Plugins.Count; i++)
                {
                    bts = Plugins[i].OnRequestHeader(session, bts);
                    //直接阻止
                    if (bts == null || bts.Length < 1)
                    {
                        return(null);
                    }
                }

                //String header = Encoding.ASCII.GetString(bts);

                //for (int i = 0; i < Plugins.Count; i++)
                //{
                //    header = Plugins[i].OnRequestHeader(session, header);
                //    //直接阻止
                //    if (String.IsNullOrEmpty(header)) return null;
                //}

                //bts = Encoding.ASCII.GetBytes(header + "\r\n\r\n");

                bts = ByteHelper.Cat(bts, Encoding.ASCII.GetBytes("\r\n\r\n"));

                //是否有数据需要处理
                if (Data.Length > p + 4)
                {
                    Data = ByteHelper.SubBytes(Data, p + 4, -1);
                    for (var i = 0; i < Plugins.Count; i++)
                    {
                        Data = Plugins[i].OnRequestContent(session, Data);
                        //直接阻止
                        if (Data == null || Data.Length < 1)
                        {
                            return(null);
                        }
                    }
                    Data = ByteHelper.Cat(bts, Data);
                }
                else
                {
                    Data = bts;
                }
            }
            else
            {
                for (var i = 0; i < Plugins.Count; i++)
                {
                    Data = Plugins[i].OnRequestContent(session, Data);
                    //直接阻止
                    if (Data == null || Data.Length < 1)
                    {
                        return(null);
                    }
                }
            }

            return(Data);
        }