繁体   English   中英

在终端上打印 HTTP 标头

[英]Printing HTTP header on terminal

我目前正在使用 python 和 pcap 创建一个数据包嗅探器。 遵循此代码后: https : //www.binarytides.com/code-a-packet-sniffer-in-python-with-pcapy-extension/

我能够解析 IP 和 TCP 标头以获取源地址、端口号等值。我只需要 HTTP 请求/响应,因此我过滤掉了仅保留端口号为 80 的请求/响应。

但是,我真的很困惑如何打印出 HTTP 标头的实际值。 我应该在哪里以及如何让下面的图像出现在我的 MacOS 终端上?

在此处输入图片说明

提前致谢。

如果您将http_response_data变量中的 HTTP 响应数据包数据作为 python bytes类型,您可以在一行中获得响应标头:

headers_text = http_response_data.partition(b'\r\n\r\n')[0].decode('utf-8')
print(headers_text)

此外,如果 HTTP 标头不是 UTF-8 编码,您可能需要使用'cp852'而不是'utf-8'

这考虑到了这样一个事实,即 HTTP 标头与 HTTP 内容正文由两个换行符分隔(所有标头行仅由一个换行符分隔)。

接下来是使用标准socket库从 Google 服务器的 TCP 端口 80 接收 HTTP 字节响应的上述使用解决方案的小示例。

在线试试吧!

import socket
s = socket.socket()
s.connect(('google.com', 80))
s.send(b'GET / HTTP/1.1\r\n\r\n')
s.shutdown(socket.SHUT_WR)
http_response_data = s.recv(8192) # TCP response stored as bytes
s.close()
headers_text = http_response_data.partition(b'\r\n\r\n')[0].decode('utf-8')
print(headers_text)

附注

  1. 您的标头可能不是 UTF-8 编码,而不是.decode('utf-8')尝试其他编码/代码页,例如.decode('cp852')
  2. headers_text还将包含状态行,如HTTP/1.1 200 OK如果您不需要它(如果只有key: value行很重要),您可以使用下一个代码:
headers_text = http_response_data.partition(b'\r\n\r\n')[0].partition(b'\r\n')[2].decode('utf-8')
print(headers_text)
  1. 根据您的教程TCP data as bytes type is available at body of if protocol == 6 : block as data variable,在我的解决方案中将其用作http_response_data

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM