curl error 18,尝试使用SO回答1759956

时间:2019-03-23 05:35:55

标签: unix curl

我正在尝试关注curl error 18 - transfer closed with outstanding read data remaining

最佳答案是

  

...让卷曲自行设置长度。

我不知道该怎么做。我尝试了以下方法:

curl --ignore-content-length http://corpus-db.org/api/author/Dickens,%20Charles/fulltext

但是,我仍然收到此错误:

curl: (18) transfer closed with outstanding read data remaining

2 个答案:

答案 0 :(得分:1)

30秒后,服务器刚刚关闭连接。 您可以尝试提高客户端的速度,但是如果服务器在有限的时间内不能提供足够的速度,即使连接速度很快,您仍会收到消息。

在示例http://corpus-db.org/api/author/Dickens,%20Charles/fulltext的情况下,我得到了大量直接输出的内容:

curl http://corpus-db.org/api/author/Dickens,%20Charles/fulltext

在写入文件时数量较小(已在30秒内达到约47MB):

curl -o Dickens,%20Charles http://corpus-db.org/api/author/Dickens,%20Charles/fulltext

可以尝试恢复文件传输,但是在示例服务器上不支持该操作:

curl -C - -o Dickens,%20Charles http://corpus-db.org/api/author/Dickens,%20Charles/fulltext
  

卷曲:(33)HTTP服务器似乎不支持字节范围。无法恢复。

因此,可能有一些选项可以优化请求,提高连接速度或缓存大小,但是如果达到限制,并且在有限的时间内从不获取更多数据,您将无能为力。

可以在这里找到cUrl手册:https://curl.haxx.se/docs/manual.html

以下链接不会为您提供帮助,但可能会很有趣:
可以在以下位置找到数据服务器的存储库:https://github.com/JonathanReeve/corpus-db
可以在以下位置找到二手Web服务器的文档:https://hackage.haskell.org/package/warp-3.2.13

答案 1 :(得分:0)

这是速度问题。如果您下载内容的时间超过35秒,则无论您已经下载了多少,corpus-db.org上的服务器都将断开您的连接。

更糟糕的是,该服务器不支持Content-Range,因此您不能分块下载它,而只能从上次中断的地方继续下载。

更糟糕的是,不仅不支持Content-Range,而且它是 SILENTLY IGNORED ,这意味着它似乎可以工作,直到您实际检查下载的内容。

如果您需要从较慢的连接下载该页面,建议您租用便宜的VPS,并将其设置为您需要下载的任何内容的镜像,然后从镜像中下载。您的镜像不需要设置35秒的限制。

例如,this vps 1 的费用为每月$ 1.25,拥有1Gbps的连接,就可以下载该页面。租用其中之一,在其上安装nginx,将其放入nginx的www文件夹中,然后从您的镜像中下载它,您将有300秒的下载时间(nginx默认超时),而不是35秒。如果300秒还不够,您甚至可以将超时更改为所需的任何时间。

或者您甚至可以幻想并设置与curl的--proxy参数兼容的缓存代理,以便您的命令可以成为

curl --proxy=http://yourserver http://corpus-db.org/api/author/Dickens,%20Charles/fulltext

如果有人对此示例实现感兴趣,请告诉我。

您无法使用4mbit的连接下载该页面,因为服务器会在下载完成之前(35秒后)踢您,但是如果您使用1000mbit的连接下载该页面,则可以下载整个页面文件在超时开始之前。

(我的家庭互联网连接是4mbit,我不能从家里下载它,但是我尝试从具有1000mbit连接的服务器上下载它,并且效果很好。)

1 PS:除了我是它们的(先前)满意客户之外,我没有与ramnode关联,并且我将它们推荐给任何寻求廉价可靠VPS的人。