def range_iter(): results = {} while True: next_range = self._next() headers, fragment_iters = next_range content_range = headers.get('Content-Range') if content_range is not None: fragment_start, fragment_end, fragment_length = \ parse_content_range(content_range) elif self.fragment_length <= 0: fragment_start = None fragment_end = None fragment_length = 0 else: fragment_start = 0 fragment_end = self.fragment_length - 1 fragment_length = self.fragment_length self._add_ranges_for_fragment(fragment_length, range_infos) satisfiable = False for range_info in range_infos: satisfiable |= range_info['satisfiable'] k = (range_info['resp_fragment_start'], range_info['resp_fragment_end']) results.setdefault(k, []).append(range_info) try: range_info = results[(fragment_start, fragment_end)].pop(0) except KeyError: self.logger.error( "Invalid range: %s, available: %s (reqid=%s)", repr((fragment_start, fragment_end)), results.keys(), self.reqid) raise if self.perfdata is not None: ec_start = monotonic_time() segment_iter = self._decode_segments(fragment_iters) if self.perfdata is not None: ec_end = monotonic_time() rawx_perfdata = self.perfdata.setdefault('rawx', dict()) rawx_perfdata['ec'] = rawx_perfdata.get('ec', 0.0) \ + ec_end - ec_start if not range_info['satisfiable']: io.consume(segment_iter) continue byterange_iter = self._iter_range(range_info, segment_iter) result = { 'start': range_info['resp_meta_start'], 'end': range_info['resp_meta_end'], 'iter': byterange_iter } yield result
def range_iter(): results = {} while True: next_range = self._next() headers, fragment_iters = next_range content_range = headers.get('Content-Range') if content_range is not None: fragment_start, fragment_end, fragment_length = \ parse_content_range(content_range) elif self.fragment_length <= 0: fragment_start = None fragment_end = None fragment_length = 0 else: fragment_start = 0 fragment_end = self.fragment_length - 1 fragment_length = self.fragment_length self._add_ranges_for_fragment(fragment_length, range_infos) satisfiable = False for range_info in range_infos: satisfiable |= range_info['satisfiable'] k = (range_info['resp_fragment_start'], range_info['resp_fragment_end']) results.setdefault(k, []).append(range_info) try: range_info = results[(fragment_start, fragment_end)].pop(0) except KeyError: logger.error("Invalid range: %s, available: %s", repr((fragment_start, fragment_end)), results.keys()) raise segment_iter = self._decode_segments(fragment_iters) if not range_info['satisfiable']: io.consume(segment_iter) continue byterange_iter = self._iter_range(range_info, segment_iter) result = {'start': range_info['resp_meta_start'], 'end': range_info['resp_meta_end'], 'iter': byterange_iter} yield result
def range_iter(): results = {} while True: next_range = self._next() headers, fragment_iters = next_range content_range = headers.get('Content-Range') if content_range is not None: fragment_start, fragment_end, fragment_length = \ parse_content_range(content_range) elif self.fragment_length <= 0: fragment_start = None fragment_end = None fragment_length = 0 else: fragment_start = 0 fragment_end = self.fragment_length - 1 fragment_length = self.fragment_length self._add_ranges_for_fragment(fragment_length, range_infos) satisfiable = False for range_info in range_infos: satisfiable |= range_info['satisfiable'] k = (range_info['resp_fragment_start'], range_info['resp_fragment_end']) results.setdefault(k, []).append(range_info) range_info = results[(fragment_start, fragment_end)].pop(0) segment_iter = self._decode_segments(fragment_iters) if not range_info['satisfiable']: io.consume(segment_iter) continue byterange_iter = self._iter_range(range_info, segment_iter) result = { 'start': range_info['resp_meta_start'], 'end': range_info['resp_meta_end'], 'iter': byterange_iter } yield result