【问题标题】:Why is cURL returning "additional stuff not fine"?为什么 cURL 返回“其他东西不好”?
【发布时间】: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 只是打印到 stderrsyslog 或任何在你记录中间的警告标题? (特别是因为 transfer.c 正是我希望看到 curl 记录类似这样的文件……)您可能需要向我们展示您正在使用的实际代码,并告诉我们 libcurl 的版本以及您使用的任何 Python 包装器'重新使用。
  • 感谢 abarnert。 A 这些行确实以* 开头而不是< 我也确实认为它们不是标题本身的一部分。我更新了问题。
  • 我认为您已经对此很清楚了,只是没有更新整个问题,但以防万一:您无法在 Wireshark 中隔离此消息的原因是它永远不会结束电线;它只是在本地打印出来的。
  • 我不是试图隔离wireshark中的消息,而是整个请求和响应标头以查找异常。
  • 哦,为此,您甚至不需要 Wireshark — 只需从您的应用程序内部将所有标题写入日志即可。这样一来,你就可以得到任何你想要的格式的东西,而不必担心事后连接相应的请求和响应等。

标签: python curl


【解决方案1】:

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

不管怎样,快速搜索"additional stuff not fine" curl transfer.c 会出现a recent change in the source 的描述是:

Curl_readwrite:删除调试输出

为调试目的添加了文本“其他东西不好”文本 前段时间,但它并没有真正帮助任何人,并且出于某种原因 Linux 发行版仍然提供使用调试信息构建的 libcurl 存在,因此(太多)用户可以阅读此信息。

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

  1. 忽略它。
  2. 升级到更高版本的libcurl
  3. 在没有调试信息的情况下重建 libcurl

您可以查看transfer.clibcurl 源(如上链接),以尝试了解curl 在抱怨什么,并可能在大约同时在邮件列表中查找线程——或者只是通过电子邮件发送列表并询问。

但是,我怀疑这实际上可能与真正的问题根本不相关,因为您甚至从一开始就看到了这一点。

这里有三个明显的地方可能会出错:

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

第一个实际上似乎最不可能。如果你想排除它,只需捕获你发出的所有请求,然后编写一个简单的脚本,使用其他库来重放完全相同的请求,看看你是否得到相同的行为。如果是这样,问题显然不在于您如何提出请求。

您可以根据时间区分情况 2 和 3。如果所有服务同时超时——尤其是当您在不同时间开始点击它们时它们都超时(例如,您在 Facebook 后 15 分钟开始点击 Google+,但它们都在您点击 Facebook 30 分钟后超时) ,肯定是情况2。如果不是,可能是情况3。

如果您排除所有这三个,那么您可以开始寻找其他可能出错的地方,但我会从这里开始。

或者,如果您告诉我们更多关于您的应用的确切用途(例如,您是否尝试以尽可能快的速度一遍又一遍地访问服务器?您是否尝试代表大量不同的用户进行连接?是您使用的是开发密钥还是最终用户应用程序密钥?等等),那么对这些服务有更多经验的其他人可能会猜到。

【讨论】:

  • 谢谢,我更新了问题,因为这实际上是一条 cURL 消息。但是,当消息开始显示时,连接开始超时。因此我想知道是什么扔了它们,以解决超时问题。请注意,即使未启用 VERBOSE 并且我实际上没有看到该消息,也会出现超时问题。
  • 谢谢。停止并重新启动应用程序确实可以在几分钟内消除问题,所以我怀疑我实际上是在发送错误的请求标头。我每分钟只访问每台服务器一次。看起来它们几乎都在同一时间开始超时,但在所有情况下,打印消息的次数从应用程序首次启动时的一次增加到服务器超时时的数十次。跨度>
  • @dotancohen:停止它并立即重新启动它会在一段时间内消除问题吗,或者只是说,让它休息 60 秒会有所不同?如果是前者,您可能会泄漏curl 句柄或套接字或其他东西……
  • 请注意,curl mailing list 中此调试行中有数百个帖子,并且已在 7.28.1 版(2012 年 11 月 20 日)中删除,如curl changelog 所述。当然没有虚假消息,不要解决你的超时问题,但你 (@dotancohen) 应该使用最新的 7.29 版本。
【解决方案2】:

我不同意这一点 - 我在尝试通过 BIGIP LTM 外部 VIP 地址呼叫网站时收到相同的消息。

例如:

我打电话给网站http://11five.10.10.10/index.html(在这种情况下IP地址是随机的)。 BIG F5 应该通过与虚拟服务器关联的池对两个内部 Web 服务器(17two.20.0.10 和 17two.20.0.11)的流量进行负载平衡。

在这种情况下,从外部源(内部客户端)到 TCP 80 上的 VIP 地址的请求应该在两个 Web 服务器之间循环。我发现所有服务器都收到一个初始的 SYN 数据包,而从来没有收到 SYN-ACK。

如果我坐在真实服务器所在的本地子网内的终端上,我可以“wget”index.html 网页 - 来自 17two.20.0.11 到 http://17two.20.0.10}/index.html。

来自外部,我收到 *additional stuff not fine transfer.c:1037 0 0 消息。

你说得对,它是旧版本 libcurl 库中 CURL 的内置调试机制,但我不同意下面的说法;

A bug in curl, or the way you're using it.
Something wrong with your network setup (e.g., your ISP cuts you off for making too many outgoing connections or using too many bytes in 30 minutes).
Something you're doing is making the servers think you're a spammer/DoS attacker/whatever and they're blocking you.

造成这种情况的原因是环境中的网络问题,IE.. Web 服务器无法将流量返回到原始源,因此显示一两个错误,请求标头有问题,并且从 Web 服务器返回的响应。

在这种情况下,我会选择说原始问题更有可能是因为当我对来自本地子网中的测试主机的原始请求使用不同的 URI 执行 curl 时,我可以很好地检索 index.html 网页.这意味着服务器正在侦听并接受使用 FQDN 和服务器短名称的连接。

我相信这个错误表明 curl 收到了一个不确定的响应,因此会产生上述错误。没有开发 curl 或阅读源代码,我无法进一步评论。

欢迎任何对这种逻辑提出质疑的其他回复 - 全部用于学习新事物。

安迪

【讨论】:

  • 嗨,安德鲁,欢迎来到 Stack Overflow!您应该知道您的消息是作为原始问题的答案发布的,但从其内容来看,它似乎是对先前答案的回复。您应该使用add comment 功能来回复现有答案。谢谢!
  • @dotancohen 看看这篇文章的大小,超过 2000 个字符。如果 cmets 允许 2000 多个字符,他可能会。但就 2014 年的情况而言,评论最多可包含约 500 个字符。
【解决方案3】:

确认

curl 中的一个错误,或者你使用它的方式。

系统信息: Linux alt 3.2.0-4-amd64 #1 SMP Debian 3.2.63-2+deb7u1 x86_64 GNU/Linux

我更新了 curl 库和连续消息(在 twitter rest api 测试中被捕获)

  • 其他东西不好 transfer.c:1037: 0 0

消失了

我最近更新的 curl --version 数据

$ curl -V

curl 7.38.0 (x86_64-pc-linux-gnu) libcurl/7.38.0 OpenSSL/1.0.1e zlib/1.2.7 libidn/1.25 libssh2/1.4.3 librtmp/2.3 协议: dict 文件 ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtmp rtsp scp sftp smtp smtps telnet tftp 特性:AsynchDNS IDN IPv6 Largefile GSS-API SPNEGO NTLM NTLM_WB SSL libz TLS-SRP

【讨论】:

    猜你喜欢
    • 2018-02-18
    • 1970-01-01
    • 1970-01-01
    • 2020-07-24
    • 1970-01-01
    • 2020-10-14
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    相关资源
    最近更新 更多