1

我正在尝试使用 Python 编写一个连接到使用摘要身份验证的自定义 http 服务器的客户端。我可以毫无问题地连接并拉取第一个请求。使用 TCPDUMP(我在 MAC OS X 上——我既是 MAC 又是 Python 菜鸟)我可以看到第一个请求实际上是两个 http 请求,如果您熟悉 RFC2617,您会期望。第一个结果是 401 UNAUTHORIZED。从服务器发回的标头信息被正确地用于生成带有一些自定义授权标头值的第二个请求的标头,这会产生 200 OK 响应和有效负载。

一切都很好。感谢 urllib2,我的 HTTPDigestAuthHandler 开启器正在工作。

在同一个程序中,我尝试从同一个服务器请求第二个不同的页面。根据 RFC,我希望 TCPDUMP 这次只显示一个请求,使用几乎所有相同的授权标头信息(nc 应该增加)。

相反,它从头开始,首先获取 401 并重新生成 200 所需的信息。

urllib2 是否有可能让带有摘要身份验证的后续请求回收已知的授权标头值并且只执行一个请求?

[重读几次,直到它有意义,我不知道如何使它更清楚]

谷歌的收益出乎意料地少,所以我猜不是。我查看了 urllib2.py 的代码,它真的很乱(评论如下:“这不是一个很棒的努力”),所以如果这是一个错误,我不会感到震惊。我注意到我的 Connection Header 已关闭,即使我将其设置为 keepalive,它也会被覆盖。这导致我使用keepalive.py,但这对我也不起作用。

Pycurl 也不起作用。

我可以手动编写整个交互的代码,但我想尽可能利用现有的库。

总之,是否可以使用 urllib2 和摘要身份验证从同一服务器获取 2 个页面,只执行 3 个 http 请求(第一页 2 个,第二个页面 1 个)。

如果您碰巧之前尝试过并且已经知道这是不可能的,请告诉我。如果您有其他选择,我会全力以赴。

提前致谢。

4

1 回答 1

1

虽然它不是开箱即用的,urllib2但足够灵活,可以自己添加。子类HTTPDigestAuthHandler,破解它(retry_http_digest_auth我认为的方法)以记住身份验证信息并定义一个http_request(self, request)方法以将其用于所有后续请求(添加 WWW-Authenticate 标头)。

于 2009-11-11T18:38:49.013 回答