curl错误18 – 传输closures,剩余未完成的读取数据

当使用curl从URL中检索数据时,我有时(在80%的情况下)得到

错误18:传输closures,剩余未完成的读取数据

然后部分返回的数据丢失。 奇怪的是,当CURLOPT_RETURNTRANSFER设置为false时,这绝不会发生,即curl_exec函数不会返回数据,而是直接显示内容。

可能是什么问题呢? 我可以设置一些选项来避免这种行为吗?

非常感谢您的build议!

我敢打赌,这与对端发送的错误的Content-Length头相关。 我的build议是让curl自己设定长度。

错误string与libcurl所看到的完全相同:因为它正在接收一个分块的编码stream,所以它知道在一个块中是否有剩余的数据要接收。 当连接closures时,libcurl知道最后收到的块是不完整的。 然后你得到这个错误代码。

没有任何事情可以做,以避免这个错误的请求未经修改,但你可以尝试解决它通过发出一个HTTP 1.0请求,而不是(因为分块编码将不会发生),但事实是,这是最有可能的一个缺陷在服务器或在你的networking/设置莫名其妙。

我有同样的问题,但设法通过压制cURL通常发送(以下是PHP代码,但应该与其他cURL API类似)的'Expect:100-continue'头来解决它:

 curl_setopt($curl, CURLOPT_HTTPHEADER, array('Expect:')); 

顺便说一下,我正在向包含在JDK 6 REST中的HTTP服务器发送调用,这些服务器存在各种问题。 在这种情况下,它首先发送一个100响应,然后与一些请求不会正确发送后续的200响应。

我有这个问题与pycurl工作,我解决了它使用

 c.setopt(pycurl.HTTP_VERSION, pycurl.CURL_HTTP_VERSION_1_0) 

像Eric Caron说的那样。

我已经通过这种方式解决了这个错误。

 $ch = curl_init (); curl_setopt ( $ch, CURLOPT_URL, 'http://www.someurl/' ); curl_setopt ( $ch, CURLOPT_TIMEOUT, 30); ob_start(); $response = curl_exec ( $ch ); $data = ob_get_clean(); if(curl_getinfo($ch, CURLINFO_HTTP_CODE) == 200 ) success; 

错误仍然发生,但我可以处理variables中的响应数据。

我得到这个错误,当我的服务器进程在生成响应中途收到exception,并简单地closures连接而不说再见。 curl仍然期望来自连接的数据和抱怨(正确)。