2011-06-01 59 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

相關問題