2011-06-01 61 views
1

Web服务器通过要下载的文件响应POST请求(具有Content-Disposition标头)。使用urllib或机械化开启器将响应主体下载到什么位置?在没有下载主体的情况下在Python中检查HTTP POST标题

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 

我的印象是,该机构将不会下载,直到读(),这将是跳过某些下载(如已下载的文件),但我没有看到性能提升很大有用。

+0

使用像wireshark这样的流量分析器...你通过连接发送了什么? – 2011-06-01 19:44:51

+0

WireShark可能会告诉您*文件发送了多少*,但无论您是否调用了read(),Web服务器都将开始传输文件。尽管存在的缓冲区可能会填满,如果尚未调用read(),传输可能会停止。 – 2011-06-01 19:50:42

回答

1

那么,当你只是想要标题,你应该使用HTTP HEAD。 POST和GET将按照定义返回内容。

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

所以你最好的选择是找到一个更好的方式来做到这一点 - 例如HTTP头。如果这不是一个选项,请在获取所需的任何标题后立即在您的请求对象上调用close(),并希望您不会浪费太多带宽。

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

+0

关闭_response_正是我所做的(未在片段中看到)。我已经看到了HEAD的问题,但只有在重定向到GET的情况下才能起作用。某些服务器将直接包含响应POST的内容,所以HEAD不是选项(afaik)。 – 2011-06-01 19:55:36

+0

关闭请求是您的最佳选择,但您应该意识到您可能会浪费相当多的带宽。如果你幸运的话,你会阻止服务器发送*整个*文件,但不能保证。你所要求的是不可能的。 – 2011-06-01 19:57:52

3

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

+0

HEAD只是一个选项,如果下载可能受到GET的影响。 – 2011-06-01 20:07:38

相关问题