def _read_messages(self): completing = False while True: self._header_lines = [] yield None if not self._message.upper().startswith('HTTP/1.1 206'): protocol_violation('Bad status message: %s' % self._message, self.connection) return if not self.complete: completing = True headers = {} while True: yield None if len(self._message) == 0: break if ':' not in self._message: protocol_violation('Bad header: %s' % self._message, self.connection) return header, value = self._message.split(':', 1) headers[header] = value.strip() # reset the header buffer so we can loop self._header_lines = [] filename = self.request_paths.pop(0) start, end, realLength = parseContentRange(headers['content-range']) length = (end - start) + 1 cl = int(headers.get('content-length', length)) assert (cl == length, 'Got c-l:%d bytes instead of l:%d' % (cl, length)) yield length assert (len(self._message) == length, 'Got m:%d bytes instead of l:%d' % (len(self._message), length)) if completing: self.complete = True completing = False self.parent.connection_handshake_completed(self) # prefer full pieces to reduce http overhead self.download.prefer_full = True self.download._got_have_all() self.download.got_unchoke() elif self.complete: self.got_anything = True br = self.batch_requests.got_request(filename, start, self._message) data = br.get_result() if data: index = br.start // self.piece_size if index >= self.parent.numpieces: return begin = br.start - (index * self.piece_size) self.download.got_piece(index, begin, data)
def _read_messages(self): completing = False while True: self._header_lines = [] yield None line = self._message.upper() if noisy: self.logger.info(line) l = line.split(None, 2) version = l[0] status = l[1] try: message = l[2] except IndexError: # sometimes there is no message message = "" if not version.startswith("HTTP"): self.protocol_violation('Not HTTP: %r' % self._message) return if status not in ('301', '302', '303', '206'): self.protocol_violation('Bad status message: %s' % self._message) return headers = {} while True: yield None if len(self._message) == 0: break if ':' not in self._message: self.protocol_violation('Bad header: %s' % self._message) return header, value = self._message.split(':', 1) header = header.lower() headers[header] = value.strip() if noisy: self.logger.info("incoming headers: %s" % (headers, )) # reset the header buffer so we can loop self._header_lines = [] if status in ('301', '302', '303'): url = headers.get('location') if not url: self.protocol_violation('No location: %s' % self._message) return self.logger.warning("Redirect: %s" % url) self.parent.start_http_connection(url) return filename = self.request_paths.pop(0) start, end, realLength = parseContentRange( headers['content-range']) length = (end - start) + 1 cl = int(headers.get('content-length', length)) print "got content length %d " % cl if cl != length: raise ValueError('Got c-l:%d bytes instead of l:%d' % (cl, length)) yield length if len(self._message) != length: raise ValueError('Got m:%d bytes instead of l:%d' % (len(self._message), length)) if noisy: self.logger.info("GOT %s %d %d" % ('GET', start, len(self._message))) self.got_anything = True br = self.batch_requests.got_request(filename, start, self._message) data = br.get_result() if data: index = br.start // self.piece_size if index >= self.parent.numpieces: return begin = br.start - (index * self.piece_size) if noisy: self.logger.info("GOT %s %d %d %d" % ('GET', index, begin, length)) r = (index, begin, length) a = self.request_blocks.pop(r) for b, l in a: d = buffer(data, b - begin, l) self.download.got_piece(index, b, d) if noisy: self.logger.info("REMAINING: %d" % len(self.request_blocks))
def _read_messages(self): completing = False while True: self._header_lines = [] yield None line = self._message.upper() if noisy: self.logger.info(line) l = line.split(None, 2) version = l[0] status = l[1] try: message = l[2] except IndexError: # sometimes there is no message message = "" if not version.startswith("HTTP"): self.protocol_violation('Not HTTP: %r' % self._message) return if status not in ('301', '302', '303', '206'): self.protocol_violation('Bad status message: %s' % self._message) return headers = {} while True: yield None if len(self._message) == 0: break if ':' not in self._message: self.protocol_violation('Bad header: %s' % self._message) return header, value = self._message.split(':', 1) header = header.lower() headers[header] = value.strip() if noisy: self.logger.info("incoming headers: %s" % (headers, )) # reset the header buffer so we can loop self._header_lines = [] if status in ('301', '302', '303'): url = headers.get('location') if not url: self.protocol_violation('No location: %s' % self._message) return self.logger.warning("Redirect: %s" % url) self.parent.start_http_connection(url) return filename = self.request_paths.pop(0) start, end, realLength = parseContentRange(headers['content-range']) length = (end - start) + 1 cl = int(headers.get('content-length', length)) if cl != length: raise ValueError('Got c-l:%d bytes instead of l:%d' % (cl, length)) yield length if len(self._message) != length: raise ValueError('Got m:%d bytes instead of l:%d' % (len(self._message), length)) if noisy: self.logger.info("GOT %s %d %d" % ('GET', start, len(self._message))) self.got_anything = True br = self.batch_requests.got_request(filename, start, self._message) data = br.get_result() if data: index = br.start // self.piece_size if index >= self.parent.numpieces: return begin = br.start - (index * self.piece_size) if noisy: self.logger.info("GOT %s %d %d %d" % ('GET', index, begin, length)) r = (index, begin, length) a = self.request_blocks.pop(r) for b, l in a: d = buffer(data, b - begin, l) self.download.got_piece(index, b, d) if noisy: self.logger.info("REMAINING: %d" % len(self.request_blocks))