在不消耗完整响应的情况下检查 URL 是否存在且小于 x 字节
Checking if a URL exists and is smaller than x bytes without consuming full response
我有一个用例,我想检查(从 python/Django 项目中)对 GET
请求的响应是否小于 x
字节,如果整个响应在 y
秒内完成,如果响应状态为 200。正在测试的 URL 由最终用户提交。
一些约束:-
HEAD
请求不可接受。仅仅是因为某些服务器可能不包含 Content-Length
,或者对此撒谎,或者只是阻止 HEAD
请求。
- 我不想使用完整的
GET
响应正文。想象一下最终用户提交 url 到 10GB 的文件......我所有的服务器带宽(和内存)都会被这个消耗。
tl;dr : 有没有 python http api :-
- 接受整个事务的超时。 (我认为 httplib2 可以做到这一点)
- 响应状态为 200(所有 http 库都这样做)
- 在收到
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 Content
或 416 Requested range not satisfiable
。不支持此功能的服务器将忽略 header,因此这应该是一种安全措施。
我有一个用例,我想检查(从 python/Django 项目中)对 GET
请求的响应是否小于 x
字节,如果整个响应在 y
秒内完成,如果响应状态为 200。正在测试的 URL 由最终用户提交。
一些约束:-
HEAD
请求不可接受。仅仅是因为某些服务器可能不包含Content-Length
,或者对此撒谎,或者只是阻止HEAD
请求。- 我不想使用完整的
GET
响应正文。想象一下最终用户提交 url 到 10GB 的文件......我所有的服务器带宽(和内存)都会被这个消耗。
tl;dr : 有没有 python http api :-
- 接受整个事务的超时。 (我认为 httplib2 可以做到这一点)
- 响应状态为 200(所有 http 库都这样做)
- 在收到
x
字节后终止请求(可能使用RST
)以避免带宽不足。
这里的x
大概是KB的顺序,y
是几秒
您可以从返回的 object 中打开 urllib
中的 URL 和 read(x+1)
。如果返回字符串的长度为x+1
,则资源大于x
。然后在 object 上调用 close()
关闭连接,即终止请求。在最坏的情况下,这将填满 OS 的 TCP 缓冲区,这是无论如何都无法避免的;通常,这不应该比 x
.
如果您进一步向请求添加 Range
header,正常的服务器将在 x+1
字节后自行关闭连接。请注意,如果文件太小,这会将回复代码更改为 206 Partial Content
或 416 Requested range not satisfiable
。不支持此功能的服务器将忽略 header,因此这应该是一种安全措施。