在终端上打印 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 字节响应。
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:
- 您的 header 可能不是 UTF-8 编码的,那么请尝试其他 encoding/code-page 而不是
.decode('utf-8')
,例如 .decode('cp852')
。
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)
- 根据 your tutorial 字节类型的 TCP 数据在
if protocol == 6 :
块的 body 末尾可用作为 data
变量,将其用作 http_response_data
在我的解决方案中。
我目前正在使用 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 字节响应。
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:
- 您的 header 可能不是 UTF-8 编码的,那么请尝试其他 encoding/code-page 而不是
.decode('utf-8')
,例如.decode('cp852')
。 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)
- 根据 your tutorial 字节类型的 TCP 数据在
if protocol == 6 :
块的 body 末尾可用作为data
变量,将其用作http_response_data
在我的解决方案中。