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)
Example #2
0
    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))
Example #3
0
    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))