diff options
Diffstat (limited to 'youtube_dl/downloader/http.py')
| -rw-r--r-- | youtube_dl/downloader/http.py | 19 | 
1 files changed, 19 insertions, 0 deletions
| diff --git a/youtube_dl/downloader/http.py b/youtube_dl/downloader/http.py index b7f144af9..a29f5cf31 100644 --- a/youtube_dl/downloader/http.py +++ b/youtube_dl/downloader/http.py @@ -4,6 +4,7 @@ import errno  import os  import socket  import time +import re  from .common import FileDownloader  from ..compat import ( @@ -57,6 +58,24 @@ class HttpFD(FileDownloader):              # Establish connection              try:                  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: +                    content_range = data.headers.get('Content-Range') +                    if content_range: +                        content_range_m = re.search(r'bytes (\d+)-', content_range) +                        # 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() +                    resume_len = 0 +                    open_mode = 'wb'                  break              except (compat_urllib_error.HTTPError, ) as err:                  if (err.code < 500 or err.code >= 600) and err.code != 416: | 
