Beispiel #1
0
 def write(self, data):
     self.hashsum.update(data)
     self.len_so_far += len(data)
     if self.len_so_far > self.length_getter():
         self.finished_cb(self, Failure(InvalidDataError("Length so far is greater than the expected length."
                                                         " %s to %s" % (str(self.len_so_far),
                                                                        str(self.length_getter())))))
     else:
         if self.write_handle is None:
             log.debug("Tried to write to a write_handle that was None.")
             return
         self.write_handle.write(data)
         if self.len_so_far == self.length_getter():
             self.finished_cb(self)
Beispiel #2
0
    def writer_finished(self, writer, err=None):
        def fire_finished_deferred():
            self.verified = True
            for p, (w, finished_deferred) in self.writers.items():
                if w == writer:
                    finished_deferred.callback(self)
                    del self.writers[p]
                    return True
            log.warning(
                "Somehow, the writer that was accepted as being valid was already removed. writer: %s",
                str(writer))
            return False

        def errback_finished_deferred(err):
            for p, (w, finished_deferred) in self.writers.items():
                if w == writer:
                    finished_deferred.errback(err)
                    del self.writers[p]

        def cancel_other_downloads():
            for p, (w, finished_deferred) in self.writers.items():
                w.cancel()

        if err is None:
            if writer.len_so_far == self.length and writer.hashsum.hexdigest(
            ) == self.blob_hash:
                if self.verified is False:
                    d = self._save_verified_blob(writer)
                    d.addCallbacks(lambda _: fire_finished_deferred(),
                                   errback_finished_deferred)
                    d.addCallback(lambda _: cancel_other_downloads())
                else:
                    errback_finished_deferred(Failure(DownloadCanceledError()))
                    d = defer.succeed(True)
            else:
                err_string = "length vs expected: {0}, {1}, hash vs expected: {2}, {3}"
                err_string = err_string.format(self.length, writer.len_so_far,
                                               self.blob_hash,
                                               writer.hashsum.hexdigest())
                errback_finished_deferred(Failure(
                    InvalidDataError(err_string)))
                d = defer.succeed(True)
        else:
            errback_finished_deferred(err)
            d = defer.succeed(True)

        d.addBoth(lambda _: self._close_writer(writer))
        return d
Beispiel #3
0
    def writer_finished(self, writer, err=None):
        def fire_finished_deferred():
            self._verified = True
            for p, (w, finished_deferred) in self.writers.items():
                if w == writer:
                    del self.writers[p]
                    finished_deferred.callback(self)
                    return True
            log.warning(
                "Somehow, the writer that was accepted as being valid was already removed: %s",
                writer)
            return False

        def errback_finished_deferred(err):
            for p, (w, finished_deferred) in self.writers.items():
                if w == writer:
                    del self.writers[p]
                    finished_deferred.errback(err)

        def cancel_other_downloads():
            for p, (w, finished_deferred) in self.writers.items():
                w.close()

        if err is None:
            if writer.len_so_far == self.length and writer.blob_hash == self.blob_hash:
                if self._verified is False:
                    d = self.save_verified_blob(writer)
                    d.addCallbacks(lambda _: fire_finished_deferred(),
                                   errback_finished_deferred)
                    d.addCallback(lambda _: cancel_other_downloads())
                else:
                    d = defer.succeed(None)
                    fire_finished_deferred()
            else:
                if writer.len_so_far != self.length:
                    err_string = "blob length is %i vs expected %i" % (
                        writer.len_so_far, self.length)
                else:
                    err_string = "blob hash is %s vs expected %s" % (
                        writer.blob_hash, self.blob_hash)
                errback_finished_deferred(Failure(
                    InvalidDataError(err_string)))
                d = defer.succeed(None)
        else:
            errback_finished_deferred(err)
            d = defer.succeed(None)
        d.addBoth(lambda _: writer.close_handle())
        return d
Beispiel #4
0
    def write(self, data):
        if self.write_handle is None:
            log.exception("writer has already been closed")
            raise IOError('I/O operation on closed file')

        self._hashsum.update(data)
        self.len_so_far += len(data)
        if self.len_so_far > self.length_getter():
            self.finished_cb_d = self.finished_cb(
                self,
                Failure(InvalidDataError("Length so far is greater than the expected length."
                                         " %s to %s" % (self.len_so_far,
                                                        self.length_getter()))))
        else:
            self.write_handle.write(data)
            if self.len_so_far == self.length_getter():
                self.finished_cb_d = self.finished_cb(self)