1

我有一个网站,人们可以在其中填写新闻源的 url。然后,我的服务器将下载该新闻源并对其进行解析。我如何保护自己免受太大的新闻提要?

太大我的意思是:太大以至于下载需要太多时间、带宽或文件空间。我可以对接收的 MB 数量设置限制吗?或者限制下载时间?

4

1 回答 1

3

我知道的每个 http 客户端库(至少在 Python 中)都会给你或者可以给你一个

>>> import requests
>>> r = requests.get('https://example.com/big-file', stream=True)
>>> r.raw
<requests.packages.urllib3.response.HTTPResponse object at 0x101194810>

现在您有可用的响应标头,可能存在 Content-Length:

>>> r.headers.get("content-length")
'33236'

如何从流中读取取决于您:

>>> r.raw.read(10)
'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03'

如果我想通过最大时间和最大大小来限制下载,我会这样做:

t0 = time.time()
total_size = 0
while True:
    if time.time() - t0 > time_limit:
        raise Exception("Too much time taken")
    if total_size > size_limit:
        raise Exception("Too large")
    data = r.raw.read(8192)
    if data == "":
        break  # end of file
    total_size += len(data)
    output_file.write(data)

当您过早退出 HTTP 连接时,Web 服务器不会停止工作 :)

于 2013-09-12T13:47:25.277 回答