wget 的意外行为?

unexpected behavior of wget?

这实际上不是一个问题,它是为了某人 -- 如果可能的话 -- 告诉我 wget 在使用 -c --or --continue-- 选项启动时到底做了什么。

这是 wget 手册页中有关 -c 选项的部分: (...) 从 Wget 1.7 开始,如果您在 non-empty 文件上使用 -c,结果发现服务器不支持继续下载,Wget 将拒绝从头开始下载,这实际上会破坏现有内容。如果您真的希望从头开始下载,请删除该文件。 (...) 请注意,-c 仅适用于 FTP 服务器和支持 "Range" header.

的 HTTP 服务器

好的,读到这里,我首先做的是对 wget 的恢复进行一些测试。我注意到 wget 没有像之前所说的那样做,所以让我展示一下我的最终测试是什么:

首先,我修改了使用 SimpleHTTPRequestHandler 的示例,以创建一个提供静态文件的简单网络服务器,这让我可以查看双向发送的 headers:

import http.server
import socketserver
import os
import sys

PORT = 8000

class Handler(http.server.SimpleHTTPRequestHandler):
    def _print_headers(self):
        for header, hvalue in self.headers.items():
            print('%s: %s' % (header, hvalue))

    def send_header(self, keyword, value):
        print("%s: %s" % (keyword, value))
        return super(Handler, self).send_header(keyword, value)

    def do_GET(self):
        print('%sGET%s' % ('*' * 10, '*' * 10))
        self._print_headers()
        print('%sRESPONSE HEADERS%s' % ('*' * 4, '*' * 3))
        return super(Handler, self).do_GET()

    def do_HEAD(self):
        print('%sHEAD%s' % ('*' * 10, '*' * 9))
        self._print_headers()
        print('*' * 23)
        print('%sRESPONSE HEADERS%s' % ('*' * 4, '*' * 3))
        return super(Handler, self).do_HEAD()

httpd = socketserver.TCPServer(("", PORT), Handler)

print("serving at port", PORT)
httpd.serve_forever()

有了服务器 运行,我开始 wget 来获取文件的一部分(稍等片刻,然后 ^C):

wget --limit-rate=10m http://localhost:8000/carlitos\ way.avi

在这一步 headers 在 HTTP 请求中收到,返回的是:

**********GET**********
User-Agent: Wget/1.16 (linux-gnu)
Accept: */*
Host: localhost:8000
Connection: Keep-Alive
****RESPONSE HEADERS***
127.0.0.1 - - [09/May/2015 21:52:44] "GET /carlitos%20way.avi HTTP/1.1" 200 -  # this line gets printed before sending response headers
Server: SimpleHTTP/0.6 Python/3.4.2
Date: Sun, 10 May 2015 01:52:44 GMT
Content-type: video/x-msvideo
Content-Length: 1526812672
Last-Modified: Fri, 04 Sep 2009 13:12:22 GMT

然后我使用 -c 选项启动 wget 以恢复下载:

wget --limit-rate=10m -c http://localhost:8000/carlitos\ way.avi

这里它应该拒绝开始下载——如文档中所述,但它确实执行下载——从头开始——但没有 Accept-Ranges header 或部分内容响应如下所示:

**********GET**********
Range: bytes=298172416-
User-Agent: Wget/1.16 (linux-gnu)
Accept: */*
Host: localhost:8000
Connection: Keep-Alive
****RESPONSE HEADERS***
127.0.0.1 - - [09/May/2015 21:56:07] "GET /carlitos%20way.avi HTTP/1.1" 200 -  # this line gets printed before sending response headers
Server: SimpleHTTP/0.6 Python/3.4.2
Date: Sun, 10 May 2015 01:56:07 GMT
Content-type: video/x-msvideo
Content-Length: 1526812672
Last-Modified: Fri, 04 Sep 2009 13:12:22 

如您所见,它从未发出 HEAD 请求。那么谁能向我解释这里到底发生了什么,还是我遗漏了什么?

PS: 请原谅我的英语,我不会说英语。

这是一个文档错误。我已经向邮件列表提交了修复它的补丁。

行为似乎很久以前就改变了,但文档从未更新过。