summaryrefslogtreecommitdiff
path: root/service/pixelated/resources/attachments_resource.py
diff options
context:
space:
mode:
Diffstat (limited to 'service/pixelated/resources/attachments_resource.py')
-rw-r--r--service/pixelated/resources/attachments_resource.py110
1 files changed, 0 insertions, 110 deletions
diff --git a/service/pixelated/resources/attachments_resource.py b/service/pixelated/resources/attachments_resource.py
deleted file mode 100644
index 1081b4b8..00000000
--- a/service/pixelated/resources/attachments_resource.py
+++ /dev/null
@@ -1,110 +0,0 @@
-#
-# Copyright (c) 2014 ThoughtWorks, Inc.
-#
-# Pixelated is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# Pixelated 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 Affero General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with Pixelated. If not, see <http://www.gnu.org/licenses/>.
-import cgi
-import io
-import re
-
-from twisted.internet import defer
-from twisted.protocols.basic import FileSender
-from twisted.python.log import msg
-from twisted.web import server
-from twisted.web.resource import Resource
-from twisted.web.server import NOT_DONE_YET
-from twisted.logger import Logger
-
-from pixelated.resources import respond_json_deferred, BaseResource
-
-
-logger = Logger()
-
-
-class AttachmentResource(Resource):
- isLeaf = True
-
- def __init__(self, mail_service, attachment_id):
- Resource.__init__(self)
- self.attachment_id = attachment_id
- self.mail_service = mail_service
-
- def render_GET(self, request):
- def error_handler(failure):
- msg(failure, 'attachment not found')
- request.code = 404
- request.finish()
-
- encoding = request.args.get('encoding', [None])[0]
- filename = request.args.get('filename', [self.attachment_id])[0]
- content_type = request.args.get('content_type', ['application/octet-stream'])[0]
- request.setHeader(b'Content-Type', content_type)
- request.setHeader(b'Content-Disposition', bytes('attachment; filename="' + filename + '"'))
-
- d = self._send_attachment(encoding, filename, request)
- d.addErrback(error_handler)
-
- return server.NOT_DONE_YET
-
- @defer.inlineCallbacks
- def _send_attachment(self, encoding, filename, request):
- attachment = yield self.mail_service.attachment(self.attachment_id)
-
- bytes_io = io.BytesIO(attachment['content'])
-
- try:
- request.code = 200
- yield FileSender().beginFileTransfer(bytes_io, request)
- finally:
- bytes_io.close()
- request.finish()
-
- def _extract_mimetype(self, content_type):
- match = re.compile('([A-Za-z-]+\/[A-Za-z-]+)').search(content_type)
- return match.group(1)
-
-
-class AttachmentsResource(BaseResource):
- BASE_URL = 'attachment'
-
- def __init__(self, services_factory):
- BaseResource.__init__(self, services_factory)
-
- def getChild(self, attachment_id, request):
- _mail_service = self.mail_service(request)
- return AttachmentResource(_mail_service, attachment_id)
-
- def render_POST(self, request):
- _mail_service = self.mail_service(request)
- fields = cgi.FieldStorage(fp=request.content, headers=(request.getAllHeaders()),
- environ={'REQUEST_METHOD': 'POST'})
- _file = fields['attachment']
- deferred = _mail_service.save_attachment(_file.value, _file.type)
-
- def send_location(attachment_id):
- request.setHeader('Location', '/%s/%s' % (self.BASE_URL, attachment_id))
- response_json = {"ident": attachment_id,
- "content-type": _file.type,
- "encoding": "base64", # hard coded for now -- not really used
- "name": _file.filename,
- "size": len(_file.value)}
- respond_json_deferred(response_json, request, status_code=201)
-
- def error_handler(error):
- logger.error(error)
- respond_json_deferred({"message": "Something went wrong. Attachment not saved."}, request, status_code=500)
-
- deferred.addCallback(send_location)
- deferred.addErrback(error_handler)
-
- return NOT_DONE_YET