def __ProcessResponse(self, response): """Process this response (by updating self and writing to self.stream).""" if response.status_code not in self._ACCEPTABLE_STATUSES: raise exceptions.TransferRetryError(response.content) if response.status_code in (httplib.OK, httplib.PARTIAL_CONTENT): self.stream.write(response.content) self.__progress += response.length if response.info and 'content-encoding' in response.info: # TODO: Handle the case where this changes over a download. self.__encoding = response.info['content-encoding'] elif response.status_code == httplib.NO_CONTENT: # It's important to write something to the stream for the case # of a 0-byte download to a file, as otherwise python won't # create the file. self.stream.write('') return response
def GetRange(self, start, end=None, additional_headers=None): """Retrieve a given byte range from this download, inclusive. Range must be of one of these three forms: * 0 <= start, end = None: Fetch from start to the end of the file. * 0 <= start <= end: Fetch the bytes from start to end. * start < 0, end = None: Fetch the last -start bytes of the file. (These variations correspond to those described in the HTTP 1.1 protocol for range headers in RFC 2616, sec. 14.35.1.) Args: start: (int) Where to start fetching bytes. (See above.) end: (int, optional) Where to stop fetching bytes. (See above.) additional_headers: (bool, optional) Any additional headers to pass with the request. Returns: None. Streams bytes into self.stream. """ self.EnsureInitialized() progress_end_normalized = False if self.total_size is not None: progress, end = self.__NormalizeStartEnd(start, end) progress_end_normalized = True else: progress = start while not progress_end_normalized or progress < end: response = self.__GetChunk(progress, end=end, additional_headers=additional_headers) if not progress_end_normalized: self.__SetTotal(response.info) progress, end = self.__NormalizeStartEnd(start, end) progress_end_normalized = True response = self.__ProcessResponse(response) progress += response.length if not response: raise exceptions.TransferRetryError( 'Zero bytes unexpectedly returned in download response')