Merge pull request #2813 from dstftw/test-real-download-improvement
Improve download mechanism when Range HTTP header is ignored
This commit is contained in:
		@@ -14,6 +14,8 @@ from ..utils import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class HttpFD(FileDownloader):
 | 
					class HttpFD(FileDownloader):
 | 
				
			||||||
 | 
					    _TEST_FILE_SIZE = 10241
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def real_download(self, filename, info_dict):
 | 
					    def real_download(self, filename, info_dict):
 | 
				
			||||||
        url = info_dict['url']
 | 
					        url = info_dict['url']
 | 
				
			||||||
        tmpfilename = self.temp_name(filename)
 | 
					        tmpfilename = self.temp_name(filename)
 | 
				
			||||||
@@ -28,8 +30,10 @@ class HttpFD(FileDownloader):
 | 
				
			|||||||
        basic_request = compat_urllib_request.Request(url, None, headers)
 | 
					        basic_request = compat_urllib_request.Request(url, None, headers)
 | 
				
			||||||
        request = compat_urllib_request.Request(url, None, headers)
 | 
					        request = compat_urllib_request.Request(url, None, headers)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if self.params.get('test', False):
 | 
					        is_test = self.params.get('test', False)
 | 
				
			||||||
            request.add_header('Range', 'bytes=0-10240')
 | 
					
 | 
				
			||||||
 | 
					        if is_test:
 | 
				
			||||||
 | 
					            request.add_header('Range', 'bytes=0-%s' % str(self._TEST_FILE_SIZE - 1))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # Establish possible resume length
 | 
					        # Establish possible resume length
 | 
				
			||||||
        if os.path.isfile(encodeFilename(tmpfilename)):
 | 
					        if os.path.isfile(encodeFilename(tmpfilename)):
 | 
				
			||||||
@@ -100,6 +104,15 @@ class HttpFD(FileDownloader):
 | 
				
			|||||||
            return False
 | 
					            return False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        data_len = data.info().get('Content-length', None)
 | 
					        data_len = data.info().get('Content-length', None)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # Range HTTP header may be ignored/unsupported by a webserver
 | 
				
			||||||
 | 
					        # (e.g. extractor/scivee.py, extractor/bambuser.py).
 | 
				
			||||||
 | 
					        # However, for a test we still would like to download just a piece of a file.
 | 
				
			||||||
 | 
					        # To achieve this we limit data_len to _TEST_FILE_SIZE and manually control
 | 
				
			||||||
 | 
					        # block size when downloading a file.
 | 
				
			||||||
 | 
					        if is_test and data_len > self._TEST_FILE_SIZE:
 | 
				
			||||||
 | 
					            data_len = self._TEST_FILE_SIZE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if data_len is not None:
 | 
					        if data_len is not None:
 | 
				
			||||||
            data_len = int(data_len) + resume_len
 | 
					            data_len = int(data_len) + resume_len
 | 
				
			||||||
            min_data_len = self.params.get("min_filesize", None)
 | 
					            min_data_len = self.params.get("min_filesize", None)
 | 
				
			||||||
@@ -118,7 +131,7 @@ class HttpFD(FileDownloader):
 | 
				
			|||||||
        while True:
 | 
					        while True:
 | 
				
			||||||
            # Download and write
 | 
					            # Download and write
 | 
				
			||||||
            before = time.time()
 | 
					            before = time.time()
 | 
				
			||||||
            data_block = data.read(block_size)
 | 
					            data_block = data.read(block_size if not is_test else min(block_size, data_len - byte_counter))
 | 
				
			||||||
            after = time.time()
 | 
					            after = time.time()
 | 
				
			||||||
            if len(data_block) == 0:
 | 
					            if len(data_block) == 0:
 | 
				
			||||||
                break
 | 
					                break
 | 
				
			||||||
@@ -162,6 +175,9 @@ class HttpFD(FileDownloader):
 | 
				
			|||||||
                'speed': speed,
 | 
					                'speed': speed,
 | 
				
			||||||
            })
 | 
					            })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if is_test and byte_counter == data_len:
 | 
				
			||||||
 | 
					                break
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            # Apply rate limit
 | 
					            # Apply rate limit
 | 
				
			||||||
            self.slow_down(start, byte_counter - resume_len)
 | 
					            self.slow_down(start, byte_counter - resume_len)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user