我尝试做 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
表示 16
,1c
表示 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/