19

我正在编写一个使用多个 3rd 方 Web API 的 Web 应用程序,并且我想跟踪低级别的请求和响应以进行临时分析。所以我正在寻找一个能让 Python 的 urllib2 记录通过 HTTP 传输的所有字节的方法。也许是一个子类处理程序?

4

2 回答 2

12

好吧,我找到了如何设置库的内置调试机制:

import logging, urllib2, sys

hh = urllib2.HTTPHandler()
hsh = urllib2.HTTPSHandler()
hh.set_http_debuglevel(1)
hsh.set_http_debuglevel(1)
opener = urllib2.build_opener(hh, hsh)
logger = logging.getLogger()
logger.addHandler(logging.StreamHandler(sys.stdout))
logger.setLevel(logging.NOTSET)

但我仍在寻找一种方法来转储所有传输的信息。

于 2009-07-25T08:22:36.790 回答
2

这看起来很棘手。urllib2、urllib 或 httplib(基于此构建)中没有用于拦截输入或输出数据的钩子。

我唯一想到的,除了切换策略以使用外部工具(其中有很多,大多数人使用这样的东西),就是在你自己的新模块中编写 socket.socket 的子类(比如, "capture_socket") 然后使用 "import capture_socket; import httplib; httplib.socket = capture_socket" 将其插入 httplib。您必须将所有必要的引用(httplib 中使用的任何形式的“socket.foo”)复制到您自己的模块中,但是您可以在子类中覆盖诸如 recv() 和 sendall() 之类的东西来做你喜欢什么数据。

如果您使用 SSL,可能会出现并发症,我不确定这是否足够,或者您是否还必须制作自己的 socket._fileobject。不过它看起来是可行的,仔细阅读标准库中 httplib.py 和 socket.py 中的源代码会告诉你更多信息。

于 2009-12-04T03:11:00.207 回答