【问题标题】:"Curl : (33) HTTP server doesn't seem to support byte ranges. Cannot resume."“Curl : (33) HTTP 服务器似乎不支持字节范围。无法恢复。”
【发布时间】:2014-05-10 20:54:25
【问题描述】:

给定一个在线文件,我可以通过我的网络浏览器下载它。

我在上面运行了curl,带有

mkdir -p ./data
curl -L -C - 'http://www.ngdc.noaa.gov/mgg/global/relief/ETOPO1/data/ice_surface/grid_registe‌​red/netcdf/readme_etopo1_netcdf.txt' -o ./data/countries.zip 

我选择以下错误消息:

curl: (33) HTTP 服务器似乎不支持字节范围。不能 继续。

如何解决?欢迎使用其他下载工具。


注意:

  • -L: 跟随重定向
  • -C - :继续之前未完成的下载

编辑:当要下载的文件已经存在并且已经完成时会出现此错误消息。它还会停止正在进行的脚本。我的要求是:

  • 如果文件不存在,则下载。
  • 如果文件确实存在但不完整,请从停止的地方继续下载。
  • 如果文件确实存在并且完整,静默传递到下一个命令。 (没有失败)

我该怎么做?

【问题讨论】:

  • 服务器是否支持继续不完整的下载? IE。如果你下载一个文件并在中途按Ctrl+C,你能继续吗?如果是这样,那么您现在看到的肯定是一个 cURL 错误。
  • 是的,服务器明确接受恢复未完成的下载。但是,当下载完成并再次发送 curl 请求时,curl 会回退这个精确的错误 33。它应该注意完整性并发送成功消息。
  • 我跑了两次curl -L -C - 'http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_admin_0_sovereignty.zip' -o countries.zip。第二次,cURL 只是给** Resuming transfer from byte position 5351381 并成功退出,没有下载任何东西。您的 cURL 是否可能已过时?我正在运行curl 7.37.0
  • @nneonneo: 你能用这个ngdc.noaa.gov/mgg/global/relief/ETOPO1/data/ice_surface/… 再次尝试相同的命令(下载、停止、恢复、完成、重新下载)吗(错误又回来了?)
  • 该错误出现在我的带有该 URL 的版本上。所以,我更新了我的答案并向 curl 报告了一个错误。

标签: curl gis wget web-crawler


【解决方案1】:

我尝试运行此命令两次:

curl -L -C - 'http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_admin_0_sovereignty.zip' -o countries.zip

得到以下输出:

$ curl -L -C - 'http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_admin_0_sovereignty.zip' -o countries.zip
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100 5225k  100 5225k    0     0   720k      0  0:00:07  0:00:07 --:--:--  836k
$ curl -L -C - 'http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_admin_0_sovereignty.zip' -o countries.zip
** Resuming transfer from byte position 5351381
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
$ echo $?
0

所以,看起来“简历”工作正常。由于您早在 5 月就发布了这个问题,因此完全有可能 cURL 已修复其错误或相关网络服务器已更新其对 HTTP 范围请求的支持。


正如您在 cmets 中指出的,该错误仍然出现在 ngdc.noaa.gov 网站上。我检查了我的卷曲,它也在做同样的事情。因此,该错误仍在 curl 中。

使用 Wireshark,我检查了 HTTP 协议中发生了什么。基本上,当 curl 请求恢复已完成的文件时,服务器会发回 HTTP 416 错误(“Requested Range Not Satisfiable”)。对于 naturalearthdata.com,他们使用的 CDN 添加了一个 Content-Range 标头,指定了文件的确切长度。 ngdc.noaa.gov 不添加此标头。请注意,根据 RFC 2616,在 HTTP 416 响应中添加 Content-Range 是可选的。

curl 使用 Content-Range 来确定下载是否完成。如果缺少标头,curl 假定服务器不支持范围下载并吐出该错误消息。

我已将此作为错误报告给 libcurl 邮件列表。我们会看看他们怎么说。同时,这里有两种可能的解决方法:

  • 使用不同的下载器。我经常使用aria2c,这是一个非常好的命令行下载实用程序,支持多连接和恢复下载。它可以通过利用更多连接(假设服务器支持它)来加快下载速度,而且我已经检查过 aria2c 没有遇到与 curl 相同的错误。
  • 在运行curl 之前,使用curl -I <URL> | grep Content-Length | cut -d' ' -f 2 获取文件的长度,并根据您下载的文件大小检查该长度。

【讨论】:

    【解决方案2】:

    如果网络服务器不支持对特定字节范围的请求,您就不能使用 -C 并且该主机似乎就是这种情况。

    【讨论】:

    • 昨天还在工作。这与我的新位置和新 wifi 有关。
    • 除非您实际上是在尝试继续现有下载,否则这对我来说似乎是一个错误,您应该向 cUrl 的人提交错误报告。即使您尝试继续现有下载,如果服务器不支持 Range 标头,理论上它也应该回退到下载完整文件。
    • @darnir:经过检查,当下载目标已经存在并且完成时,它会出现错误。问题是,这个错误完全停止了我更长的 makefile 工作流程。
    【解决方案3】:

    作为一种解决方法,首先检查目标文件是否不存在。

    【讨论】:

    • 现有文件不会告诉你是完整还是不完整,这是错误的原因。
    • 是的,这不是错误解释,而是解决问题并继续的快速解决方法。
    【解决方案4】:

    如果您尝试安装节点版本并且安装失败,请务必从

    中删除节点下载
    src (~/.nvm/src/)
    

    或者您在尝试重新安装它们时可能会遇到错误,或者您可能会收到如下错误:

    curl: (33) HTTP server doesn't seem to support byte ranges. Cannot resume.
    

    如果它有效,请告诉我,否则我会建议你别的。

    【讨论】:

    • 这个问题到底跟 Node 有什么关系?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-20
    相关资源
    最近更新 更多