在终端上打印 HTTP header

Printing HTTP header on terminal

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

我能够解析 IP 和 TCP header 以获取源地址、端口号等值。 我只需要 HTTP request/response 所以我过滤掉只保留端口号为 80 的那些。

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

提前致谢。

如果你在 http_response_data 变量中有你的 HTTP 响应数据包数据作为 python bytes 类型你可以在一行中得到响应 headers:

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

如果 HTTP header 不是 UTF-8 编码,您可能还需要使用 'cp852' 而不是 'utf-8'

这考虑到 HTTP header 与 HTTP 内容 body 由两个换行符分隔(所有 header 行仅由一个换行符分隔)。

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

Try it online!

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)

PS:

  1. 您的 header 可能不是 UTF-8 编码的,那么请尝试其他 encoding/code-page 而不是 .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. 根据 your tutorial 字节类型的 TCP 数据在 if protocol == 6 : 块的 body 末尾可用作为 data 变量,将其用作 http_response_data 在我的解决方案中。