在不消耗完整响应的情况下检查 URL 是否存在且小于 x 字节

Checking if a URL exists and is smaller than x bytes without consuming full response

我有一个用例,我想检查(从 python/Django 项目中)对 GET 请求的响应是否小于 x 字节,如果整个响应在 y 秒内完成,如果响应状态为 200。正在测试的 URL 由最终用户提交。

一些约束:-

  1. HEAD 请求不可接受。仅仅是因为某些服务器可能不包含 Content-Length,或者对此撒谎,或者只是阻止 HEAD 请求。
  2. 我不想使用完整的 GET 响应正文。想象一下最终用户提交 url 到 10GB 的文件......我所有的服务器带宽(和内存)都会被这个消耗。

tl;dr : 有没有 python http api :-

  1. 接受整个事务的超时。 (我认为 httplib2 可以做到这一点)
  2. 响应状态为 200(所有 http 库都这样做)
  3. 在收到 x 字节后终止请求(可能使用 RST)以避免带宽不足。

这里的x大概是KB的顺序,y是几秒

您可以从返回的 object 中打开 urllib 中的 URL 和 read(x+1)。如果返回字符串的长度为x+1,则资源大于x。然后在 object 上调用 close() 关闭连接,即终止请求。在最坏的情况下,这将填满 OS 的 TCP 缓冲区,这是无论如何都无法避免的;通常,这不应该比 x.

多获取几 kB。

如果您进一步向请求添加 Range header,正常的服务器将在 x+1 字节后自行关闭连接。请注意,如果文件太小,这会将回复代码更改为 206 Partial Content416 Requested range not satisfiable。不支持此功能的服务器将忽略 header,因此这应该是一种安全措施。