【发布时间】:2012-12-06 06:17:11
【问题描述】:
我正在编写一个通过 cURL 查询社交媒体 API 的 Python 应用程序。我查询的大多数不同服务器(Google+、Reddit、Twitter、Facebook 等)都有 cURL 抱怨:
其他东西不好 transfer.c:1037: 0 0
不寻常的是,当应用程序第一次启动时,每个服务的响应都会抛出一次或两次这一行。几分钟后,这条线会出现几次。显然 cURL 正在识别它不喜欢的东西。大约半小时后,服务器开始超时,这条线重复了几十次,所以它显示出一个真正的问题。
我该如何诊断?我尝试使用 Wireshark 捕获请求和响应标头以搜索可能导致 cURL 抱怨的异常,但对于所有 Wireshark 的复杂性,似乎没有办法隔离和仅显示标头。
以下是代码的相关部分:
output = cStringIO.StringIO()
c = pycurl.Curl()
c.setopt(c.URL, url)
c.setopt(c.USERAGENT, 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:17.0) Gecko/20100101 Firefox/17.0')
c.setopt(c.WRITEFUNCTION, output.write)
c.setopt(c.CONNECTTIMEOUT, 10)
c.setopt(c.TIMEOUT, 15)
c.setopt(c.FAILONERROR, True)
c.setopt(c.NOSIGNAL, 1)
try:
c.perform()
toReturn = output.getvalue()
output.close()
return toReturn
except pycurl.error, error:
errno, errstr = error
print 'The following cURL error occurred: ', errstr
【问题讨论】:
-
你确定这是他们实际上在标题中返回的东西,而不是说,cURL 只是打印到
stderr或syslog或任何在你记录中间的警告标题? (特别是因为 transfer.c 正是我希望看到 curl 记录类似这样的文件……)您可能需要向我们展示您正在使用的实际代码,并告诉我们 libcurl 的版本以及您使用的任何 Python 包装器'重新使用。 -
感谢 abarnert。 A 这些行确实以
*开头而不是<我也确实认为它们不是标题本身的一部分。我更新了问题。 -
我认为您已经对此很清楚了,只是没有更新整个问题,但以防万一:您无法在 Wireshark 中隔离此消息的原因是它永远不会结束电线;它只是在本地打印出来的。
-
我不是试图隔离wireshark中的消息,而是整个请求和响应标头以查找异常。
-
哦,为此,您甚至不需要 Wireshark — 只需从您的应用程序内部将所有标题写入日志即可。这样一来,你就可以得到任何你想要的格式的东西,而不必担心事后连接相应的请求和响应等。