python - 如何通过python请求连接发送原始数据
问题描述
我正在与一开始需要一些 http 通信的服务器进行交互(与 GET/POST 握手),但后来通过 tcp 切换到原始数据包。原始数据包使用与最后一个带有“connection: keep-alive”标头的“GET”数据包建立的连接来发送和接收。我已经设法使用 response.raw._fp.read() 和 stream=True 读取传入的数据,但我找不到将数据发送回服务器的方法。
原始数据包是指字节流,没有任何方法/网址或标头。
resp = session.get(
'http://server.server/test',
stream=True
)
while True:
try:
header = resp.raw._fp._safe_read(8)
if header[3]>0:
data = resp.raw._fp._safe_read(header[3])
except http.client.IncompleteRead:
break
解决方案
您想要做的是从请求创建的连接中获取底层套接字,幸运的是您可以为流连接做到这一点。
import requests
import socket
r = requests.get('http://server.server/test', stream=True)
s = socket.fromfd(r.raw.fileno(), socket.AF_INET, socket.SOCK_STREAM)
之后,您可以像使用任何其他套接字一样发送数据。对于非流式连接,文件描述符在返回响应对象之前被清除,因此您也可以在“响应”回调中实现这一点。
推荐阅读
- c - 我应该在 C 中二维数组的 malloc 和 calloc 之后检查 NULL 指针吗?
- python - Python UnicodeDecodeError:“ascii”编解码器无法解码位置的字节 0xfc
- javascript - 如何使用 React 和 babel 修复警告:解析错误:意外令牌 <
- reactjs - 在反应本机中禁用带有条件的按钮
- android - 使用 Flowable 观察片段 backstack 条目计数的变化
- flutter - 具有动态持续时间的 Flutter AnimationController - 错误:必须使用常量值初始化常量变量
- c# - 我如何在 .Net Standard 2.0 项目中执行 DbProviderFactories,因为我的主要应用程序是框架 4.7.2
- sql - SQL 通过查询外键来查找表条目
- riscv - “Zynq FPGA 上的火箭芯片”Github Repo 还在工作吗?
- bash - Bash 脚本在循环后终止