# -*- coding: utf-8 -*- # _streaming_resource.py # Copyright (C) 2017 LEAP # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . """ A twisted resource that serves download as a single stream of multiple blobs. -> POST .../uuid/namespace/ DATA: [blob_id, blob_id2, ..., blob_idn] <- [(size(blob_id), content(blob_id)) for blob_id in DATA] (as a binary stream) """ import json import struct from zope.interface import implementer from twisted.internet.interfaces import IPushProducer from twisted.internet import task from twisted.web.server import NOT_DONE_YET from twisted.web.resource import Resource from leap.soledad.common.log import getLogger from . import interfaces from ._blobs import FilesystemBlobsBackend from ._blobs import ImproperlyConfiguredException __all__ = ['StreamingResource'] logger = getLogger(__name__) SIZE_PACKER = struct.Struct('