2014-01-31 61 views
1

我對使用Twisted比較陌生,在執行基本頭部請求時無法返回內容長度頭部。我已經建立了一個異步客戶端,但麻煩來了這一點代碼:製作扭曲的頭部請求

def getHeaders(url): 
    d = Agent(reactor).request("HEAD", url) 
    d.addCallbacks(handleResponse, handleError) 
    return d 

def handleResponse(r): 
    print r.code, r.headers 

    whenFinished = twisted.internet.defer.Deffered() 
    r.deliverBody(PrinterClient(whenFinished)) 

    return whenFinished 

我正在做一個頭請求和傳遞的URL。如此documentation所示,內容長度標題未存儲在self.length中,但可以從self.headers響應中進行訪問。輸出正如預期的那樣返回狀態碼,但標題輸出不是預期的。使用「UHTTP://www.espn.go.com」,因爲它目前正在返回一個例子:

Set-Cookie: SWID=77638195-7A94-4DD0-92A5-348603068D58; 
path=/; expires=Fri, 31-Jan-2034 00:50:09 GMT; domain=go.com; 
X-Ua-Compatible: IE=edge,chrome=1 
Cache-Control: max-age=15 
Date: Fri, 31 Jan 2014 00:50:09 GMT 
P3P: CP="CAO DSP COR CURa ADMa DEVa TAIa PSAa PSDa IVAi IVDi CONi 
OUR SAMo OTRo BUS PHY ONL UNI PUR COM NAV INT DEM CNT STA PRE" 
Content-Type: text/html; charset=iso-8859-1 

正如你所看到的,沒有返回的內容長度字段。如果相同的請求在requests做,那麼結果將包含內容長度的頭:

r = requests.head("http://www.espn.go.com") 
r.headers 
({'content-length': '46133', 'content-encoding': 'gzip'...}) 
(rest omitted for readability) 

是什麼原因造成這個問題?我相信這是我的一個簡單的錯誤,但我對我的生活無法弄清楚我做錯了什麼。任何幫助表示讚賞。

回答

3

http://www.espn.go.com/如果客戶端發送一個Accept-Encoding: gzip標題,返回一個響應,如果不是,則返回另一個響應。

兩個響應之間的差異之一是包含Content-Length標題。

如果您想要使用Agent包括Accept-Encoding: gzip發出請求,請查看ContentDecoderAgent或第三方treq包。

+0

完美,這工作,謝謝。包含ContentDecoderAgent將返回整個標題。 treq也是一個有趣的軟件包。很好的答案。 – grromrell

2

http允許(但不包括REQUIRE)實體標頭響應HEAD請求。它唯一的限制是對HEAD請求的200個響應不得包含實體有效負載的。它直到原始服務器來決定它是否包含任何實體頭文件。

Content-Length的情況下,對於HEAD這是可選的;如果實體將被動態計算(與壓縮/解壓內容一樣),那麼服務器最好避免在請求不包含內容時計算內容長度的額外工作。