Split out BaseMediaResource into MediaRepository

This is so that a single MediaRepository can be shared across all
resources, rather than having a "copy" per resource.

In particular this allows us to guard against both the thumbnail and
download resource triggering a download of remote content at the same
time.
This commit is contained in:
Erik Johnston 2016-04-19 11:24:59 +01:00
parent 481119f7d6
commit 43f0941e8f
6 changed files with 180 additions and 138 deletions

View file

@ -13,7 +13,8 @@
# See the License for the specific language governing permissions and
# limitations under the License.
from .base_resource import BaseMediaResource, parse_media_id
from .base_resource import parse_media_id, respond_with_file, respond_404
from twisted.web.resource import Resource
from synapse.http.server import request_handler
from twisted.web.server import NOT_DONE_YET
@ -24,7 +25,18 @@ import logging
logger = logging.getLogger(__name__)
class DownloadResource(BaseMediaResource):
class DownloadResource(Resource):
isLeaf = True
def __init__(self, hs, media_repo):
Resource.__init__(self)
self.filepaths = media_repo.filepaths
self.media_repo = media_repo
self.server_name = hs.hostname
self.store = hs.get_datastore()
self.version_string = hs.version_string
def render_GET(self, request):
self._async_render_GET(request)
return NOT_DONE_YET
@ -44,7 +56,7 @@ class DownloadResource(BaseMediaResource):
def _respond_local_file(self, request, media_id, name):
media_info = yield self.store.get_local_media(media_id)
if not media_info:
self._respond_404(request)
respond_404(request)
return
media_type = media_info["media_type"]
@ -52,14 +64,14 @@ class DownloadResource(BaseMediaResource):
upload_name = name if name else media_info["upload_name"]
file_path = self.filepaths.local_media_filepath(media_id)
yield self._respond_with_file(
yield respond_with_file(
request, media_type, file_path, media_length,
upload_name=upload_name,
)
@defer.inlineCallbacks
def _respond_remote_file(self, request, server_name, media_id, name):
media_info = yield self._get_remote_media(server_name, media_id)
media_info = yield self.media_repo.get_remote_media(server_name, media_id)
media_type = media_info["media_type"]
media_length = media_info["media_length"]
@ -70,7 +82,7 @@ class DownloadResource(BaseMediaResource):
server_name, filesystem_id
)
yield self._respond_with_file(
yield respond_with_file(
request, media_type, file_path, media_length,
upload_name=upload_name,
)