我使用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)
是什么导致了这个问题?我相信这是一个简单的错误,但我对我的生活无法弄清楚我做错了什么。任何帮助表示赞赏。
答案 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-Length
,HEAD
是可选的;如果实体将动态计算(与压缩/解压缩内容一样),那么当请求不包含内容时,服务器最好避免计算内容长度的额外工作。