|
@ -58,14 +58,21 @@ class HttpFD(FileDownloader): |
|
|
# Establish connection |
|
|
# Establish connection |
|
|
try: |
|
|
try: |
|
|
data = self.ydl.urlopen(request) |
|
|
data = self.ydl.urlopen(request) |
|
|
|
|
|
# When trying to resume, Content-Range HTTP header of response has to be checked |
|
|
|
|
|
# to match the value of requested Range HTTP header. This is due to a webservers |
|
|
|
|
|
# that don't support resuming and serve a whole file with no Content-Range |
|
|
|
|
|
# set in response despite of requested Range (see |
|
|
|
|
|
# https://github.com/rg3/youtube-dl/issues/6057#issuecomment-126129799) |
|
|
if resume_len > 0: |
|
|
if resume_len > 0: |
|
|
content_range = data.headers.get('Content-Range') |
|
|
content_range = data.headers.get('Content-Range') |
|
|
if content_range: |
|
|
if content_range: |
|
|
content_range_m = re.search(r'bytes (\d+)-', content_range) |
|
|
content_range_m = re.search(r'bytes (\d+)-', content_range) |
|
|
# Content-Range is correct - go on |
|
|
|
|
|
if content_range_m and resume_len == int(content_range_m.group(1)): |
|
|
|
|
|
break |
|
|
|
|
|
# Content-Range is invalid - wipe the file and do entire redownload |
|
|
|
|
|
|
|
|
# Content-Range is present and matches requested Range, resume is possible |
|
|
|
|
|
if content_range_m and resume_len == int(content_range_m.group(1)): |
|
|
|
|
|
break |
|
|
|
|
|
# Content-Range is either not present or invalid. Assuming remote webserver is |
|
|
|
|
|
# trying to send the whole file, resume is not possible, so wiping the local file |
|
|
|
|
|
# and performing entire redownload |
|
|
self.report_unable_to_resume() |
|
|
self.report_unable_to_resume() |
|
|
resume_len = 0 |
|
|
resume_len = 0 |
|
|
open_mode = 'wb' |
|
|
open_mode = 'wb' |
|
|