python - 从原始 http 响应中提取 gzip 内容

标签 python python-3.x http web networking

我尝试做 http(不是 https 方案,即 url 是 http://www.example.com) get 只是通过socket 模块,然后我 recv 响应包含来自服务器的所有传输数据( header 和正文使用 gzip 编码)。然后我尝试提取 gzip 压缩的正文内容。我想这个内容应该从 \x1f\x8b\x08 开始,但我不知道它应该在哪里结束。有什么帮助吗?

下面是我的原始回复

HTTP/1.1 200 OK\r\n
Header Part\r\n
\r\n
some_number_here\r\n
\x1f\x8b\x08 ......
......\r\n
0\r\n
\r\n

最佳答案

我打赌在 header 部分您有一个 Transfer-Encoding: chunked header 。

这是一个 HTTP/1.1 响应,而不是一个 HTTP/1.0,在 HTTP 1.1 版本中需要了解分块传输。

您有两个解决方案:

  • 通过在请求中的第一行使用 HTTP/1.0 告诉服务器您不理解 HTTP/1.1,例如 GET/foo HTTP/1.0
    • 实现分块传输解析。

解析并不难。你有一个分成几部分( block )的 body ,而不是一个原始的 body ;每个部分都以 block 大小开始(some_number_here\r\n 东西),它是一个十六进制数(警告 10 表示 161c 表示 28).

然后你就有了原始 block 内容。

然后是下一个 block 。

直到到达最后一个 block ,该 block 用 0 大小 (0\r\n\r\n) 通告。

警告:服务器在 block 之间可能需要一些时间,您必须继续读取套接字,直到看到最后一个 block 。

PS:不要尝试用套接字实现 HTTP,因为稍后会投入生产,有很多 HTTP 客户端可用,即使是在 python 中,要获得安全和健壮的东西是一项非常艰巨的工作。

关于python - 从原始 http 响应中提取 gzip 内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57646334/

相关文章:

python - 为什么多处理性能是看不见的?

python 支持向量机

python - python中很长的变量名会导致内存浪费吗?

python - 如何在Excel上按下按钮时执行Python脚本

python - SQLAlchemy - 过滤子查询负载

python-3.x - 从 Python 的 http.server 提供文件 - 使用文件正确响应

http - spring 集成入站网关 http 请求 header

python-3.x - python 出现段错误 : 11 on OS 10. 13

Python 请求库添加了一个附加 header "Accept-Encoding: identity"

ios - 如何在 iOS 中禁用 HTTP 缓存