卷曲错误18 - 转移关闭,剩余未完成的读取数据

Dav*_*vid 64 php curl

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

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

然后丢失部分返回的数据.奇怪的是,这并不会发生在CURLOPT_RETURNTRANSFER设置为false,那就是curl_exec函数不返回数据,而是直接显示的内容.

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

Dan*_*erg 43

错误字符串非常简单地类似于libcurl所看到的:因为它正在接收一个分块编码流,所以它知道何时有一个块中有数据要接收.当连接关闭时,libcurl知道最后收到的块是不完整的.然后你得到这个错误代码.

你可以做任何事情来避免这个错误与请求未经修改,但你可以尝试通过发出HTTP 1.0请求来解决它(因为那时不会发生分块编码)但事实是这很可能是一个缺陷以某种方式在服务器或网络/设置中.

  • 对我来说,问题出在我无法控制的远程端,唯一有效的修复方法是强制使用 1.0:curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); (3认同)

Chr*_*blé 31

我敢打赌,这与对等方发送的错误Content-Length标头有关.我的建议是让curl自己设定长度.

  • 它可以与Content-Length响应头相关.我在同事项目中遇到过类似的情况:Java Web服务网关设置Content-Length:601,而XML响应为210字节 (4认同)
  • 没有包含"内容长度",附带示例. (2认同)
  • 你们是如何解决这个问题的?我不会以代码形式发送任何内容长度。是从服务器端自动添加的东西吗? (2认同)

ram*_*bii 9

在使用 Guzzle 的过程中也看到这个错误。以下标题为我修复了它:

'headers' => [
    'accept-encoding' => 'gzip, deflate',
],
Run Code Online (Sandbox Code Playgroud)

我向邮递员发出了请求,邮递员给了我完整的回复,没有错误。然后我开始添加 Postman 发送到 Guzzle 请求的标头,这就是修复它的标头。

  • 谢谢,这对我有用。我尝试使用邮递员获取响应标头,发现响应返回 gzip,所以我添加了这个。 (2认同)

jcs*_*ica 7

我遇到了同样的问题,但设法通过抑制cURL通常发送的'Expect:100-continue'标头来修复它(以下是PHP代码,但应该与其他cURL API类似):

curl_setopt($curl, CURLOPT_HTTPHEADER, array('Expect:'));
Run Code Online (Sandbox Code Playgroud)

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

  • @DomainsFeatured我不确定“cURL is in Windows”是什么意思,但在命令行上,您可以通过给它一个空值来抑制“Expect:”标头:“curl -H 'Expect:'.. .`我希望这有帮助... (2认同)

小智 5

遇到类似的问题,我的服务器位于nginx后面。Web 服务器(Python Flask)日志中没有错误,但 nginx 日志中有一些错误消息。

[crit] 31054#31054: *269464 open()“/var/cache/nginx/proxy_temp/3/45/0000000453”在读取上游时失败(13:权限被拒绝)

我通过更正目录的权限解决了这个问题:

/var/cache/nginx
Run Code Online (Sandbox Code Playgroud)