class SocketReader(object): def __init__(self, fp): self._fp = fp self.handlers = [] def add_handler(self, handler): self.handlers.append(handler) def read(self, n=-1): buf = self._fp.read(n) if not buf: return '' for handler in self.handlers: handler(buf) return buf def tell(self): raise IOError('Stream is not seekable.') def wrap_with_hash(in_fp, hash_obj): wrapper = SocketReader(in_fp) wrapper.add_handler(hash_obj.update) return wrapper