【问题标题】:Inspecting HTTP POST headers in Python without downloading body在 Python 中检查 HTTP POST 标头而不下载正文
【发布时间】:2011-09-06 14:15:22
【问题描述】:

Web 服务器使用要下载的文件(具有 Content-Disposition 标头)响应 POST 请求。使用 urllib 或 mechanize opener 什么时候会下载响应正文?

opener = mechanize.build_opener(HTTPRefererProcessor, HTTPEquivProcessor, HTTPRefreshProcessor)
r = make_post_request() # makes Request object to send
res = opener.open(r)
info = response.info()
content_disp = info.getheader('content-disposition')
filename = content_disp.split('=')[1]
content = res.read() # or skip based on filename

我的印象是正文在 read() 之前不会下载,这对于跳过某些下载(例如已经下载的文件)很有用,但我没有看到性能有很大的提升。

【问题讨论】:

  • 使用像wireshark这样的流量分析器...你看到什么通过连接发送?
  • WireShark 可能会告诉您 有多少 文件正在发送,但是无论您是否调用了 read(),网络服务器都会开始传输该文件。尽管存在的任何缓冲区都可能会填满,并且如果您尚未调用 read(),传输可能会停止。

标签: python http urllib2


【解决方案1】:

HTTP 是一种无连接协议,这意味着没有建立通道,服务器可以在其中分几步写入数据。因此,如果将 POST 或 GET 请求发送到服务器,它必须以完整的响应进行响应,因为它不知道它是第一个请求还是第二个请求。 Cookies、AJAX、Comet 有助于模拟通道之类的东西,但没有。这就是为什么有 HEAD 请求的原因:浏览器可以通过它来确定是否必须加载资源。

【讨论】:

  • HEAD 只是一个选项,如果下载可以通过 GET 跟随它。
【解决方案2】:

好吧,当您只需要标头时,您应该使用 HTTP HEAD。 POST 和 GET 将根据定义返回内容。

在停止下载方面,Web 服务器不会等待开始向您发送数据,从 Python 到您的网卡的所有内容都会立即开始接收和缓冲数据。

所以最好的办法是找到一种更好的方法——例如 HTTP HEAD。如果这不是一个选项,请在获取所需的任何标头后立即在您的请求对象上调用 close() 并希望您没有浪费太多带宽。

(有关在 Python 中使用 HTTP HEAD 的示例,see this answer from a while ago。)

【讨论】:

  • 关闭 response 正是我所做的(在 sn-p 中没有看到)。我已经看到了 HEAD 问题,但这只有在通过重定向到 GET 来实现下载的情况下才有效。一些服务器将包含直接响应 POST 的内容,因此 HEAD 不是一个选项(afaik)。
  • 关闭请求是您最好的选择,但您应该意识到您可能会浪费相当多的带宽。如果幸运的话,您将阻止服务器发送 整个 文件,但这并不能保证。你要求的是不可能的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-27
  • 2013-07-27
  • 1970-01-01
  • 2010-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多