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: 请原谅我的英语,我不会说英语。
这是一个文档错误。我已经向邮件列表提交了修复它的补丁。
行为似乎很久以前就改变了,但文档从未更新过。
这实际上不是一个问题,它是为了某人 -- 如果可能的话 -- 告诉我 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: 请原谅我的英语,我不会说英语。
这是一个文档错误。我已经向邮件列表提交了修复它的补丁。
行为似乎很久以前就改变了,但文档从未更新过。