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