239
241
super(MemoryContentSource, self).__init__(fd=fd, url=url)
244
class ChecksummingContentSource(ContentSource):
245
def __init__(self, csrc, checksums, size=None):
248
self.checksummer = None
252
csummer = checksum_util.SafeCheckSummer(checksums)
253
except ValueError as e:
254
raise checksum_util.invalid_checksum_for_reader(self, msg=str(e))
256
self._set_checksummer(csummer)
259
self.size = int(size)
262
raise checksum_util.invalid_checksum_for_reader(self)
264
def resume(self, offset, checksummer):
265
self.cs.set_start_pos(offset)
266
self._set_checksummer(checksummer)
267
self.bytes_read = offset
271
return self.checksummer.algorithm
273
def _set_checksummer(self, checksummer):
274
if checksummer.algorithm not in checksum_util.CHECKSUMS:
275
raise ValueError("algorithm %s is not valid (%s)" %
276
(checksummer.algorithm, checksum_util.CHECKSUMS))
277
self.checksummer = checksummer
280
return self.bytes_read == self.size and self.checksummer.check()
282
def read(self, size=-1):
283
buf = self.cs.read(size)
285
self.checksummer.update(buf)
286
self.bytes_read += buflen
288
# read size was different size than expected.
289
# if its not the end, something wrong
290
if buflen != size and self.size != self.bytes_read:
291
raise checksum_util.invalid_checksum_for_reader(self)
293
if self.bytes_read == self.size and not self.check():
294
raise checksum_util.invalid_checksum_for_reader(self)
298
return self.cs.open()
301
return self.cs.close()
242
308
class UrlReader(object):
243
309
def read(self, size=-1):
244
310
raise NotImplementedError()