为什么cURL返回"额外的东西不好"?

dot*_*hen 23 python curl

我正在编写一个Python应用程序,通过cURL查询社交媒体API.我查询的大多数不同服务器(Google +,Reddit,Twitter,Facebook等)都有cURL抱怨:

额外的东西不精细transfer.c:1037:0 0

不寻常的是,当应用程序首次启动时,每个服务的响应将抛出此行一次或两次.几分钟后,该线将出现几次.显然,cURL正在识别它不喜欢的东西.大约半小时后,服务器开始超时,这条线重复了几十次,所以它显示出一个真正的问题.

我怎么诊断这个?我尝试使用Wireshark来捕获请求和响应头,以寻找可能导致卷曲抱怨异常,但对于所有的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
Run Code Online (Sandbox Code Playgroud)

aba*_*ert 28

我99.99%肯定这实际上并不在任何HTTP标头中,而是被打印stderr出来libcurl.可能这发生在您记录标题的过程中,这就是您感到困惑的原因.

无论如何,快速搜索"additional stuff not fine" curl transfer.c发现了源的最近变化,其描述是:

Curl_readwrite:删除调试输出

前一段时间为了调试目的添加了"附加内容不合适"的文本,但它并没有真正帮助任何人,并且由于某些原因,一些Linux发行版提供了他们的libcurls构建,调试信息仍然存在,因此(太多)用户阅读此信息.

所以,这基本上是无害的,你看到它的唯一原因是你有一个libcurl(可能来自你的Linux发行版)的一个版本,启用了完整的调试日志(尽管curl作者认为这是一个坏主意).所以你有三个选择:

  1. 忽略它.
  2. 升级到更高版本libcurl.
  3. libcurl没有调试信息重建.

您可以查看libcurl源代码transfer.c(如上所述)以尝试了解curl抱怨的内容,并可能在同一时间在邮件列表中查找线程 - 或者只是通过电子邮件发送列表并询问.

但是,我怀疑实际上可能与真正的问题无关,因为你从一开始就看到了这一点.

这里有三个明显的问题可能出错:

  1. 卷曲中的错误或您使用它的方式.
  2. 您的网络设置有问题(例如,您的ISP会因为制作过多的传出连接或在30分钟内使用太多字节而将您切断).
  3. 你正在做的事情是让服务器认为你是垃圾邮件制造者/ DoS攻击者/无论如何他们阻止你.

实际上第一个似乎是最不可能的.如果要排除它,只需捕获您所做的所有请求,然后编写一个简单的脚本,使用其他库来重放完全相同的请求,并查看是否获得相同的行为.如果是这样,问题显然不能实现您的请求.

您可以根据时间区分情况2和3.如果所有服务都立刻超时 - 特别是如果他们都在不同的时间开始点击它们(例如,你在Facebook之后15分钟开始点击Google+,但他们都在你点击Facebook后30分钟就超时) ,它肯定是案例2.如果不是,它可能是案例3.

如果你排除所有这三个,那么你可以开始寻找其他可能错误的东西,但我会从这里开始.

或者,如果您告诉我们更多关于您的应用程序的确切内容(例如,您是否尝试尽可能快地点击服务器?您是否尝试代表一些不同的用户进行连接?您使用的是dev密钥或最终用户应用程序密钥等等),对那些具有这些服务经验的其他人可能会猜测.

  • 请注意,[curl邮件列表](http://curl.haxx.se/mail/)中此调试行上的数百个帖子已在2012年11月20日发布的7.28.1版本中删除在[curl changelog](http://curl.haxx.se/changes.html)中.当然没有虚假消息,不解决你的超时,但你(@dotancohen)应该使用最后的7.29版本. (2认同)