以扭曲的方式提出头部请求

时间:2014-01-31 01:00:53

标签: python twisted

我使用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

我正在提出请求并传递网址。如此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)

是什么导致了这个问题?我相信这是一个简单的错误,但我对我的生活无法弄清楚我做错了什么。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:3)

如果客户端发送http://www.espn.go.com/标头,则

Accept-Encoding: gzip会返回一个响应,如果不发送,则返回另一个响应。

两个回复之间的差异之一是包含Content-Length标题。

如果您想使用包含Agent的{​​{1}}提出请求,请查看Accept-Encoding: gzip或第三方treq包。

答案 1 :(得分:2)

http允许(但不是 REQUIRE )实体标头响应HEAD请求。它唯一的限制是对HEAD请求的200个响应绝不能包含实体有效负载。由原始服务器决定它想要包含哪个实体头。

对于Content-LengthHEAD是可选的;如果实体将动态计算(与压缩/解压缩内容一样),那么当请求不包含内容时,服务器最好避免计算内容长度的额外工作。