标签: HTTP

C#对HTTP报文进行基本的解析

接上文《C#实现将TCP包拼接为完整的HTTP报文》的应用,更进一步,我们需要解析HTTP报文以进行数据分析。 要解析HTTP报文,需要实现以下操作: 读取HTTP报头提供的各种属性 分析属性值,从中获取内容编码和字符集编码 将报头数据和内容进行分离 判断内容是否文本还是二进制,如果是二进制的则不进行处理 如果内容是文本,按报头中提供的内容编码和字符集编码进行解压缩和解码 目前没有找到.Net框架内置的解析方法,理论上HttpClient等类在内部应该已经实现了解析,但不知为何没有公开这些处理方法。(亦或是我没找到) 那么只能自己来解析这些数据了。 我们先来看看这个经过gzip压缩的文本内容的HTTP报文: 这里提供一个老外写的简陋的解析类(已经过修改,原代码中存在一些严重BUG): public enum HTTPHeaderField { Accept = 0, Accept_Charset = 1, Accept_Encoding = 2, Accept_Language = 3, Accept_Ranges = 4, Authorization = 5, Cache_Contr...

更多

C#实现将TCP包拼接为完整的HTTP报文

接上篇《C#使用SharpPcap实现监听网卡TCP请求以获取所有HTTP访问的网址》场景,我们监听到的TCP包其实已经包含了HTTP请求的所有内容,但是它们是分段的,也就是说一个网页或文件会被截断成若干个TCP包分别发送。 那么如何拼合它们?这主要用到上篇中我们转换得到TcpPacket对象: //转换为TCP包 var packet = Packet.ParsePacket(e.Packet.LinkLayerType, e.Packet.Data); var tcpPacket = TcpPacket.GetEncapsulated(packet); 先来看一下这一系列TcpPacket的数据: tcpPacket {[TCPPacket: SourcePort=9343, DestinationPort=80, Flags={ack[2733350940 (0xa2eba01c)]|psh}]} base {PacketDotNet.TransportPacket}: {[TCPPacket: SourcePort=9343, DestinationPort=80, Flags...

更多

C#使用SharpPcap实现监听网卡TCP请求以获取所有HTTP访问的网址

功能目标是监听系统内所有网络请求,并读获取请求的目标Url。 SharpPcap是基于WinPcap功能构建的类库,可以用于监听网络。 使用SharpPcap需要在系统中先安装WinPcap,否则执行时会报错说没有此模块。 WinPcap下载地址:http://www.winpcap.org/install/default.htm SharpPcap项目现在已经迁移到了Github,网址:https://github.com/chmorgan/sharppcap 下载源码并整合到项目中。 编写代码: class Program { private static Regex httpgetRegex = new Regex(@”GETs+([^srn]+)s+HTTP”); private static Regex hostRegex = new Regex(@”Host:s*([^srn]+)”); static void Main(string[] args) { var devices = SharpPcap.CaptureDeviceList.Instance; //遍历网卡设备...

更多