Python 为什么卷曲会回来;额外的东西不好吗;?

Python 为什么卷曲会回来;额外的东西不好吗;?,python,curl,Python,Curl,我正在编写一个Python应用程序,它通过cURL查询社交媒体API。我查询的大多数不同服务器(Google+、Reddit、Twitter、Facebook等)都有: 附加材料未精细转移。c:1037:0 不寻常的是,当应用程序第一次启动时,每个服务的响应都会抛出这一行一两次。几分钟后,该行将出现几次。显然,cURL是在识别它不喜欢的东西。大约半小时后,服务器开始超时,这条线路重复了几十次,因此显示出一个真正的问题 我该如何诊断?我尝试使用Wireshark捕获请求和响应头,以搜索可能导致cU

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

附加材料未精细转移。c:1037: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

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

无论如何,在描述如下的地方出现了一个快速搜索
“其他东西不好”curl transfer.c

Curl\u readwrite:删除调试输出

添加文本“附加内容不好”是为了调试目的 虽然是以前,但由于某些原因,它并没有真正帮助任何人 Linux发行版提供了用调试信息构建的libcurl 现在,因此(太多)用户可以阅读此信息

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

  • 别理它
  • 升级到更高版本的
    libcurl
  • 在没有调试信息的情况下重建libcurl
  • 您可以查看
    libcurl
    transfer.c
    (如上链接)源代码,试图了解
    curl
    的抱怨,并可能同时在邮件列表中查找线程,或者通过电子邮件发送列表并询问

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

    这里有三件明显的事情可能会出错:

  • 卷曲中的错误,或者你使用它的方式
  • 您的网络设置有问题(例如,您的ISP因为您在30分钟内建立了太多的传出连接或使用了太多的字节而切断了您的连接)
  • 你正在做的事情是让服务器认为你是垃圾邮件发送者/拒绝服务攻击者/什么的,他们正在阻止你
  • 第一个似乎是最不可能的。如果您想排除这种情况,只需捕获您发出的所有请求,然后编写一个简单的脚本,使用其他库来重播完全相同的请求,并查看是否得到相同的行为。如果是这样的话,问题显然不可能出在如何提出请求的实现上

    您可能能够根据时间区分案例2和案例3。如果所有服务同时超时,特别是当你在不同的时间开始访问它们时(例如,你在Facebook之后开始访问Google+15分钟,而它们在你访问Facebook之后都超时30分钟),那么情况肯定是2。如果不是,可能是案例3

    如果你把这三个都排除在外,那么你可以开始寻找其他可能是错误的东西,但我从这里开始


    或者,如果您告诉我们您的应用程序的确切功能(例如,您是否尝试以最快的速度反复访问服务器?您是否尝试代表大量不同的用户连接?您是否使用开发密钥或最终用户应用密钥?等等),其他对这些服务有更多经验的人可能会猜测。

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

    例如:

    我给网站打电话(在这种情况下,IP地址是随机的)。大F5应该通过与虚拟服务器关联的池来平衡到两个内部web服务器(17two.20.0.10和17two.20.0.11)的流量

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

    如果我坐在真正服务器所在的本地子网内的终端上,我可以“wget”index.html网页-源于17two.20.0.11到}/index.html

    从外部传来的消息,我收到了*额外的东西不是精细转移。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.
    
    导致这种情况的原因是由于环境中的网络问题,即web服务器无法将流量返回到原始源,因此会显示一两个错误,请求头和web服务器返回的响应有问题

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

    我相信这个错误是为了表明curl收到了一个不确定的响应,因此产生了上述错误