protected void DeviceOnPacketArrival(object sender, CaptureEventArgs e) { if (HttpPacket.IsHttpPacket(e.Packet) == false) { var time = e.Packet.Timeval.Date; var len = e.Packet.Data.Length; var ethPacket = Packet.ParsePacket(e.Packet.LinkLayerType, e.Packet.Data); var tcpPacket = (TcpPacket)ethPacket.PayloadPacket.PayloadPacket; Console.WriteLine("== TCP Info ======================="); Console.WriteLine("ACK={0} [{1}], SYN={2}, SEQ-NO={3}", tcpPacket.Ack, tcpPacket.AcknowledgmentNumber, tcpPacket.Syn, tcpPacket.SequenceNumber); Console.WriteLine("{0}:{1}:{2},{3} Len={4}", time.Hour, time.Minute, time.Second, time.Millisecond, len); Console.WriteLine("==================================="); return; } var packet = HttpPacket.Create(e.Packet); if (packet == null) { return; } packet.Dump(); HandleOnPacket(packet); Packets.Add(packet); }
protected override void OnMessageReceive(PacketRecieveMessagerArgs e) { base.OnMessageReceive(e); if (e.Message is HttpExtend.HttpHeader) { HttpExtend.HttpHeader header = e.Message as HttpExtend.HttpHeader; if (header.Connection != null) { e.Channel["keep-alive"] = true; } header = new HttpHeader(); header.Action = "HTTP/1.1 200 OK"; header["Cache-Control"] = "private"; header.ContentType = "text/html; charset=utf-8"; header.Server = "Beetle/HttpExtend"; header.Connection = "keep-alive"; // FileReader reader = new FileReader("h:\\KendeSoft.htm"); // header.Length = reader.FileInfo.Length; HttpBody body = HttpPacket.InstanceBodyData(); body.Data.Encoding("<p>beetle http extend server!</p><p>Beetle是基于c#编写的高性能稳定的TCP通讯组件,它可以轻易支持成千上万长连接基础上进行密集的通讯交互. 组件提供了出色的性能支持和可靠的稳定性足以保证应用7x24无间断运行。为了更好地利用.Net的网络IO来处理数据,组件提供智能合并消息机制,组件调度器会根据当前负载情况对发向客户的多个消息进行合并处处理,从而减少IO操作达到更高的处理效能;通过测试在大量用户信息广播的情况轻易可以处理上百万的消息转发</p>", Encoding.UTF8); body.Eof = true; header.Length = body.Data.Count; e.Channel.Send(header); e.Channel.Send(body); //while (reader.Read()) //{ // HttpBody body = HttpPacket.InstanceBodyData(); // reader.ReadTo(body); // e.Channel.Send(body); //} } }
private void OnGetInfo(Beetle.IChannel channel, string appname, IProperties properties) { HttpHeader result; TrackerInfo info; byte[] data; BytesReader reader; HttpBody body; IAppTrackerHandler appHandler = GetAppHandler(appname); if (appHandler == null) { result = new HttpHeader(); result.Action = "500 " + string.Format("{0} Tracker Handler Notfound", appname); channel.Send(result); } else { info = appHandler.GetInfo(properties); data = Encoding.UTF8.GetBytes(info.Data); result = new HttpHeader(); result.Action = "200"; result.Length = data.Length; result[Protocol.HEADER_INFOTYPE] = info.TypeName; channel.Send(result); reader = new BytesReader(data, 0, data.Length); while (reader.Read()) { body = HttpPacket.InstanceBodyData(); reader.ReadTo(body); channel.Send(body); } } }
// 应用层 private void parseApp(byte[] payloadData, ushort srcPort, ushort dstPort) { if (payloadData.Length == 0) { return; } AppSrcPort = srcPort; AppDstPort = dstPort; if (isAnalysProtocol(80)) { protocol = "HTTP"; flowProtocol += "&" + "http"; HttpPacket http = new HttpPacket(payloadData); HTTP(http); } else if (isAnalysProtocol(21)) { protocol = "FTP"; flowProtocol += "&" + "ftp"; FtpPacket ftp = new FtpPacket(payloadData); FTP(ftp); } }
public static void SendMessage(Body data, Action <string> handler, Action <string> errorHandler = null, Header header = null, bool needSession = true) { //当网络不可用时 HttpPacket dataPacket = new HttpPacket(data, handler, errorHandler, header == null ? Header.GetHeader() : header, needSession); SendMessage(dataPacket); }
private Message ReadMessage(MemoryStream responseStream, HttpPacket header, int start, int count) { Message result = null; if (start >= 0) { byte[] buffer = _bufferManager.TakeBuffer(count); Array.Copy(responseStream.GetBuffer(), start, buffer, 0, count); responseStream.Close(); result = _encoder.ReadMessage(new ArraySegment <byte>(buffer, 0, count), _bufferManager, header.ContentType); _bufferManager.ReturnBuffer(buffer); } else { responseStream.Close(); throw new ProtocolException(string.Format("The server returned unexpected reply: {0} {1}", header.StatusCode, header.StatusDescription)); } // validate... if (_wsaController != null) { _wsaController.Validate(result); } return(result); }
byte[] CreateRequest(Message message, out int bodyOffset) { byte[] messageBytes; if (_currentMessageBytes == null) { // Encode message using _encoder ArraySegment <byte> messageBuffer = EncodeMessage(message); // Copy byte in order not to use Buffer messageBytes = new byte[messageBuffer.Count]; Array.Copy(messageBuffer.Array, messageBytes, messageBuffer.Count); _currentMessageBytes = messageBytes; } else { messageBytes = _currentMessageBytes; } // xml directive to add string xmlDirective = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"; string username = string.Empty; string password = string.Empty; HttpPacket header = null; if (_credentialsProvider != null) { username = _credentialsProvider.Username; password = _credentialsProvider.Password; if (_credentialsProvider.Security == Security.Digest) { header = _digestAuthChallenge; } } // create headers byte[] httpHeaders = HttpHelper.CreateHttpHeaders(messageBytes.Length + xmlDirective.Length, _to.Uri.PathAndQuery, _to.Uri.Host, header, username, password); //whole message with headers byte[] bytes = new byte[httpHeaders.Length + messageBytes.Length + xmlDirective.Length]; Array.Copy(httpHeaders, bytes, httpHeaders.Length); Array.Copy(Encoding.UTF8.GetBytes(xmlDirective), 0, bytes, httpHeaders.Length, xmlDirective.Length); Array.Copy(messageBytes, 0, bytes, httpHeaders.Length + xmlDirective.Length, messageBytes.Length); // body offset - for logger bodyOffset = httpHeaders.Length; return(bytes); }
void LogResponse(MemoryStream responseStream, HttpPacket header) { string response = HttpHelper.GetFormattedMessage(responseStream.GetBuffer(), header.BodyOffset); foreach (ITrafficListener listener in _listeners) { listener.LogResponse(response); } }
protected virtual void HandleOnPacket(HttpPacket packet) { OnPacketHandler handler = OnPacket; if (handler != null) { handler(packet); } }
// HTTP 协议 private void HTTP(HttpPacket http) { if (http == null) return; List<CommandTypeHead> httplist = http.CreatHeadList(); if (httplist.Count == 0) return; setInfo(httplist); }
/// <summary> /// Populates contentheaders and generalheaders with headers from the <see cref="HttpPacket"/>> /// </summary> /// <param name="packet"></param> /// <param name="contentHeaders"></param> /// <param name="generalHeaders"></param> public static void PopulateHeaders(this HttpPacket packet, HttpContentHeaders contentHeaders, HttpHeaders generalHeaders) { if (packet == null) { throw new ArgumentNullException("packet"); } bool dateHeaderProcessed = false; string hdrKey; foreach (var hdr in packet.Headers) { if (hdr.Key == null) { continue; } hdrKey = hdr.Key.Trim().ToUpperInvariant(); if (hdrKey == "CONTENT-LENGTH") { continue; //Content Length is automatically calculated by System.Net.Http.ByteArrayContent } else if (hdrKey == "DATE") { if (dateHeaderProcessed) { continue; //Already Processed } dateHeaderProcessed = true; //Date Header in wrong format causes exception in System.Net.Http.HttpResponseMessage/HttpRequestMessage //TODO: Confirm that this exception still occurs in the newer Nuget version of System.Net.Http //Check if the date string is in RFC 1123 format var val = (hdr.Value == null || !hdr.Value.Any()) ? null : hdr.Value.First().Trim(); if (val != null && Common.Shared.IsValidHttpDate(val)) { generalHeaders.Add("Date", val); } continue; } if (Array.IndexOf <String>(contentOnlyHeaders, hdrKey) >= 0) { contentHeaders.Add(hdr.Key.Trim(), hdr.Value); } else { generalHeaders.Add(hdr.Key.Trim(), hdr.Value); } } }
private void CacheMessage(HttpPacket packet) { if (_cacheMessageList.Count < MaxCacheMessageListCount) { DebugUtil.Log(string.Format("[HttpTool] CacheMessage : requestName:{0}", packet.body.method)); _cacheMessageList.Enqueue(packet); } else { DebugUtil.LogError("need send list cache is full,_cacheMessageList.Count:" + _cacheMessageList.Count); } }
public void OnSessionExpiredOrEmpty(HttpPacket httpPacket) { //if (!needSessionHttpPackets.Contains(httpPacket)) //{ // needSessionHttpPackets.Enqueue(httpPacket); //} if (loginStatus != LoginStatus.LOGINING) { loginStatus = LoginStatus.TOKEN_EXPIRED; Login(); } }
public void PostRequest() { if (_isRequesting) { return; } if (_cacheMessageList.Count <= 0) { return; } HttpPacket packet = _cacheMessageList.Dequeue(); StartCoroutine(PostCoroutine(packet)); }
public static void Main(string[] args) { NetConfig config = new NetConfig(); HttpPacket packet = new HttpPacket(new StringSerializer()); server = SocketFactory.CreateTcpServer(config, new Program(), packet); server.Open(); while (true) { Console.Write(server); System.Threading.Thread.Sleep(1000); } Console.Read(); }
void ResendMessage(Message message, HttpPacket challenge) { int bodyOffset; byte[] messageBytes = CreateAuthRequest(message, challenge, out bodyOffset); _networkStream.Write(messageBytes, 0, messageBytes.Length); string formattedRequest = HttpHelper.GetFormattedMessage(messageBytes, bodyOffset); foreach (ITrafficListener listener in _listeners) { listener.LogRequest(formattedRequest); } }
public static void SendMessage(HttpPacket httpPacket) { //当网络不可用时 if (Application.internetReachability == NetworkReachability.NotReachable || !GameConfig.Inst.NetEnable) { if (httpPacket.errorHandler != null) { httpPacket.errorHandler("Internet Not Reachable"); } DebugUtil.LogError("Internet Not Reachable"); //UICommonLogic.Inst.ShowMessage("Internet Not Reachable"); return; } ////未登陆或者Session过期 //if (LoginManager.Inst.loginStatus == LoginManager.LoginStatus.LOGOUT && httpPacket.needSession) //{ // if (httpPacket.errorHandler != null) // { // httpPacket.errorHandler("has not login"); // } // return; //} //if (LoginManager.Inst.loginStatus == LoginManager.LoginStatus.TOKEN_EXPIRED && httpPacket.needSession) //{ // EventDispatcher.TriggerEvent(EventKey.SessionExpiredOrEmpty, httpPacket); // if (httpPacket.errorHandler != null) // { // httpPacket.errorHandler("token Expired"); // } // Debug.LogError("token Expired"); // return; //} ////未登陆或者Session过期 //if (LoginManager.Inst.loginStatus == LoginManager.LoginStatus.LOGINFAIL && httpPacket.needSession) //{ // if (httpPacket.errorHandler != null) // { // httpPacket.errorHandler("login status is failed"); // } // return; //} Inst.CacheMessage(httpPacket); Inst.PostRequest(); }
public static HttpPacket createPacket(string address) { HTTP_PACKET typePacket = HTTP_PACKET.HP_NONE; if (PacketAdressList.ContainsKey(address)) { typePacket = PacketAdressList[address]; } if (typePacket != HTTP_PACKET.HP_NONE) { Type typeT = Type.GetType(PacketTypeList[typePacket]); object[] tParams = new object[] { typePacket, address }; HttpPacket newPacket = UnityUtility.createInstance <HttpPacket>(typeT, tParams); return(newPacket); } return(null); }
public static HttpPacket DoGet(string url, Encoding encoding = null) { if (encoding == null) { encoding = Encoding.UTF8; } WebClient client = new WebClient(); byte[] responseData = client.DownloadData(url); string responseStr = encoding.GetString(responseData);//解码 HttpPacket packet = new HttpPacket { RequestUrl = url, ResponseBody = responseStr, ResponseHeaders = client.ResponseHeaders }; return(packet); }
/// <summary> /// Azure에 구축된 Web App으로 데이터를 전송하는 함수 /// </summary> /// <param name="webappURL"></param> /// <param name="recevieData"></param> /// <param name="buildingID"></param> /// <param name="deviceID"></param> /// <param name="dates"></param> /// <param name="type"></param> /// <returns></returns> public async Task <bool> PostWebAPI(string webappURL, StatusNotification recevieData, string buildingID, string deviceID, DateTime dates, string type) { bool result = true; string json = string.Empty; var packet = new HttpPacket(); packet.building_id = buildingID; packet.device_id = deviceID; packet.event_time = dates.ToString("yyyy-MM-dd HH:mm:ss"); try { packet.elevator_number = Encoding.UTF8.GetString(recevieData.Unit); packet.type_cd = Convert.ToChar(recevieData.STX).ToString(); packet.floor_value = Encoding.UTF8.GetString(recevieData.Location); packet.direction_value = Convert.ToChar(recevieData.Direction).ToString(); packet.door_status = Convert.ToChar(recevieData.Door).ToString(); packet.elevator_status = Convert.ToChar(recevieData.Status).ToString(); packet.alarm_cd = Encoding.UTF8.GetString(recevieData.Alarm); json = JsonConvert.SerializeObject(packet); StringContent data = new StringContent(json, Encoding.UTF8, "application/json"); httpClientFactory = serviceProvider.GetService <IHttpClientFactory>(); var client = httpClientFactory.CreateClient(); client.DefaultRequestHeaders.Add("type", type); client.Timeout = TimeSpan.FromMinutes(2); var response = await client.PostAsync(new Uri(webappURL + "/event/elevator/status"), data); Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} [HttpClientTransfer : status] {json} Send To WebApp"); } catch (Exception ex) { Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} [status error] Data : {json}"); Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} [status error] {ex.Message}"); result = false; } return(result); }
public static HttpPacket DoPost(string url, string data, string contentType = "application/x-www-form-urlencoded", Encoding encoding = null) { if (encoding == null) { encoding = Encoding.UTF8; } WebClient client = new WebClient(); client.Headers.Add("Content-Type", contentType); byte[] responseData = client.UploadData(url, "POST", encoding.GetBytes(data)); string responseStr = encoding.GetString(responseData);//解码 HttpPacket packet = new HttpPacket { RequestUrl = url, ResponseBody = responseStr, ResponseHeaders = client.ResponseHeaders }; return(packet); }
private void appNext(byte[] payloadData, ushort srcPort, ushort dstPort) { if (payloadData.Length == 0) { return; } AppSrcPort = srcPort; AppDstPort = dstPort; if (isAnalysProtocol(80)) { HttpPacket http = new HttpPacket(payloadData); HTTP(http); } else if (isAnalysProtocol(21)) { FtpPacket ftp = new FtpPacket(payloadData); FTP(ftp); } }
private Message ReadMessage(MemoryStream responseStream, HttpPacket header) { var typeOfEncoding = GetTypeOfEncoding(header.ContentType); switch (typeOfEncoding) { case WSMessageEncoding.Text: return(ReadMessage(responseStream , header , header.BodyOffset , (int)(responseStream.Length - header.BodyOffset))); case WSMessageEncoding.Mtom: return(ReadMessage(responseStream , header , 0 , (int)responseStream.Length)); default: throw new NotSupportedException(string.Format("\"{0}\" message encoding are not supported.", typeOfEncoding)); } }
private void HTTP(HttpPacket http) { if (http == null) { return; } if (HTTPNode == null) { HTTPNode = new TreeNode(); } HTTPNode.Nodes.Clear(); HTTPNode.Text = string.Format("Hypertext Transfer Protocol (HTTP)"); List <CommandTypeHead> httplist = http.CreatHeadList(); if (httplist.Count == 0) { return; } setAppTreeNode(httplist, HTTPNode); }
byte[] CreateAuthRequest(Message message, HttpPacket challenge, out int bodyOffset) { // Getmessage already encoded byte[] messageBytes = _currentMessageBytes; // xml directive to add string xmlDirective = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"; string username = string.Empty; string password = string.Empty; if (_credentialsProvider != null) { username = _credentialsProvider.Username; password = _credentialsProvider.Password; } // create headers byte[] httpHeaders = HttpHelper.CreateHttpHeaders(messageBytes.Length + xmlDirective.Length, _to.Uri.PathAndQuery, _to.Uri.Host, challenge, username, password); //whole message with headers byte[] bytes = new byte[httpHeaders.Length + messageBytes.Length + xmlDirective.Length]; Array.Copy(httpHeaders, bytes, httpHeaders.Length); Array.Copy(Encoding.UTF8.GetBytes(xmlDirective), 0, bytes, httpHeaders.Length, xmlDirective.Length); Array.Copy(messageBytes, 0, bytes, httpHeaders.Length + xmlDirective.Length, messageBytes.Length); // body offset - for logger bodyOffset = httpHeaders.Length; return(bytes); }