Ejemplo n.º 1
0
    def download_folder_as_zip(self):
        self.set_header('Content-Type', 'application/zip')
        self.set_header(
            'Content-Disposition',
            utils.make_disposition((self.path.name or 'download') + '.zip'))

        result = yield from self.provider.zip(self.path)

        yield self.write_stream(result)
Ejemplo n.º 2
0
    async def download_file(self):
        if 'Range' not in self.request.headers:
            request_range = None
        else:
            logger.debug('Range header is: {}'.format(
                self.request.headers['Range']))
            request_range = utils.parse_request_range(
                self.request.headers['Range'])
            logger.debug('Range header parsed as: {}'.format(request_range))

        version = self.get_query_argument(
            'version', default=None) or self.get_query_argument('revision',
                                                                default=None)
        stream = await self.provider.download(
            self.path,
            revision=version,
            range=request_range,
            accept_url='direct' not in self.request.query_arguments,
            mode=self.get_query_argument('mode', default=None),
        )

        if isinstance(stream, str):
            return self.redirect(stream)

        if getattr(stream, 'partial', None):
            # Use getattr here as not all stream may have a partial attribute
            # Plus it fixes tests
            self.set_status(206)
            self.set_header('Content-Range', stream.content_range)

        if stream.content_type is not None:
            self.set_header('Content-Type', stream.content_type)

        logger.debug('stream size is: {}'.format(stream.size))
        if stream.size is not None:
            self.set_header('Content-Length', str(stream.size))

        # Build `Content-Disposition` header from `displayName` override,
        # headers of provider response, or file path, whichever is truthy first
        name = self.get_query_argument('displayName', default=None) or getattr(
            stream, 'name', None) or self.path.name
        self.set_header('Content-Disposition', utils.make_disposition(name))

        _, ext = os.path.splitext(name)
        # If the file extention is in mime_types
        # override the content type to fix issues with safari shoving in new file extensions
        if ext in mime_types:
            self.set_header('Content-Type', mime_types[ext])

        await self.write_stream(stream)

        if getattr(stream, 'partial', False) and isinstance(
                stream, ResponseStreamReader):
            await stream.response.release()

        logger.debug('bytes received is: {}'.format(self.bytes_downloaded))
Ejemplo n.º 3
0
    def get(self):
        """Download as a Zip archive."""

        self.set_header('Content-Type', 'application/zip')
        self.set_header('Content-Disposition',
                        utils.make_disposition('download.zip'))

        result = yield from self.provider.zip(**self.arguments)

        yield self.write_stream(result)
Ejemplo n.º 4
0
    def download_folder_as_zip(self):
        self.set_header('Content-Type', 'application/zip')
        self.set_header(
            'Content-Disposition',
            utils.make_disposition((self.path.name or 'download') + '.zip')
        )

        result = yield from self.provider.zip(self.path)

        yield self.write_stream(result)
Ejemplo n.º 5
0
    async def download_folder_as_zip(self):
        zipfile_name = self.path.name or '{}-archive'.format(
            self.provider.NAME)
        self.set_header('Content-Type', 'application/zip')
        self.set_header('Content-Disposition',
                        utils.make_disposition(zipfile_name + '.zip'))

        result = await self.provider.zip(self.path)

        await self.write_stream(result)
Ejemplo n.º 6
0
    async def download_folder_as_zip(self):
        zipfile_name = self.path.name or '{}-archive'.format(self.provider.NAME)
        self.set_header('Content-Type', 'application/zip')
        self.set_header(
            'Content-Disposition',
            utils.make_disposition(zipfile_name + '.zip')
        )

        result = await self.provider.zip(self.path)

        await self.write_stream(result)
Ejemplo n.º 7
0
    def get(self):
        """Download as a Zip archive."""

        self.set_header('Content-Type', 'application/zip')
        self.set_header(
            'Content-Disposition',
            utils.make_disposition('download.zip')
        )

        result = yield from self.provider.zip(**self.arguments)

        yield self.write_stream(result)
Ejemplo n.º 8
0
    async def get(self):
        """Download as a Zip archive."""

        zipfile_name = self.path.name or '{}-archive'.format(self.provider.NAME)
        self.set_header('Content-Type', 'application/zip')
        self.set_header(
            'Content-Disposition',
            utils.make_disposition(zipfile_name + '.zip')
        )

        result = await self.provider.zip(**self.arguments)

        await self.write_stream(result)
Ejemplo n.º 9
0
    async def get(self):
        """Download as a Zip archive."""

        zipfile_name = self.path.name or '{}-archive'.format(
            self.provider.NAME)
        self.set_header('Content-Type', 'application/zip')
        self.set_header('Content-Disposition',
                        utils.make_disposition(zipfile_name + '.zip'))

        result = await self.provider.zip(**self.arguments)

        await self.write_stream(result)
        self._send_hook('download_zip', path=self.path)
Ejemplo n.º 10
0
    def get(self):
        """Download a file."""
        try:
            self.arguments['accept_url'] = TRUTH_MAP[self.arguments.get('accept_url', 'true').lower()]
        except KeyError:
            raise web.HTTPError(status_code=400)

        result = yield from self.provider.download(**self.arguments)

        if isinstance(result, str):
            return self.redirect(result)

        if hasattr(result, 'content_type'):
            self.set_header('Content-Type', result.content_type)

        if hasattr(result, 'size') and result.size is not None:
            self.set_header('Content-Length', str(result.size))

        # Build `Content-Disposition` header from `displayName` override,
        # headers of provider response, or file path, whichever is truthy first
        if self.arguments.get('displayName'):
            disposition = utils.make_disposition(self.arguments['displayName'])
        else:
            # If the file extention is in mime_types
            # override the content type to fix issues with safari shoving in new file extensions
            if self.arguments['path'].ext in mime_types:
                self.set_header('Content-Type', mime_types[self.arguments['path'].ext])

            disposition = utils.make_disposition(self.arguments['path'].name)

        self.set_header('Content-Disposition', disposition)

        while True:
            chunk = yield from result.read(settings.CHUNK_SIZE)
            if not chunk:
                break
            self.write(chunk)
            yield from utils.future_wrapper(self.flush())
Ejemplo n.º 11
0
    def get(self):
        """Download a file."""
        try:
            self.arguments['accept_url'] = TRUTH_MAP[self.arguments.get('accept_url', 'true').lower()]
        except KeyError:
            raise web.HTTPError(status_code=400)

        result = yield from self.provider.download(**self.arguments)

        if isinstance(result, str):
            return self.redirect(result)

        try:
            headers = result.response.headers
        except AttributeError:
            headers = {}

        self.set_header('Content-Type', result.content_type)
        if result.size:
            self.set_header('Content-Length', str(result.size))

        # Build `Content-Disposition` header from `displayName` override,
        # headers of provider response, or file path, whichever is truthy first
        if self.arguments.get('displayName'):
            disposition = utils.make_disposition(self.arguments['displayName'])
        elif headers.get('content-disposition'):
            disposition = headers['content-disposition']
        else:
            disposition = utils.make_disposition(os.path.split(self.arguments['path'])[-1])

        self.set_header('Content-Disposition', disposition)

        while True:
            chunk = yield from result.read(settings.CHUNK_SIZE)
            if not chunk:
                break
            self.write(chunk)
            yield from utils.future_wrapper(self.flush())
Ejemplo n.º 12
0
    def get(self):
        """Download as a Zip archive."""

        self.set_header('Content-Type', 'application/zip')
        self.set_header('Content-Disposition',
                        utils.make_disposition('download.zip'))

        result = yield from self.provider.zip(**self.arguments)

        while True:
            chunk = yield from result.read(settings.CHUNK_SIZE)
            if not chunk:
                break
            self.write(chunk)
            yield from utils.future_wrapper(self.flush())
Ejemplo n.º 13
0
    async def get(self):
        """Download a file."""
        try:
            self.arguments['accept_url'] = TRUTH_MAP[self.arguments.get(
                'accept_url', 'true').lower()]
        except KeyError:
            raise tornado.web.HTTPError(status_code=400)

        if 'Range' in self.request.headers:
            request_range = utils.parse_request_range(
                self.request.headers['Range'])
        else:
            request_range = None

        result = await self.provider.download(range=request_range,
                                              **self.arguments)

        if isinstance(result, str):
            self.redirect(result)
            self._send_hook('download_file', path=self.path)
            return

        if getattr(result, 'partial', None):
            # Use getattr here as not all stream may have a partial attribute
            # Plus it fixes tests
            self.set_status(206)
            self.set_header('Content-Range', result.content_range)

        if result.content_type is not None:
            self.set_header('Content-Type', result.content_type)

        if result.size is not None:
            self.set_header('Content-Length', str(result.size))

        # Build `Content-Disposition` header from `displayName` override,
        # headers of provider response, or file path, whichever is truthy first
        name = self.arguments.get('displayName') or getattr(
            result, 'name', None) or self.path.name
        self.set_header('Content-Disposition', utils.make_disposition(name))

        _, ext = os.path.splitext(name)
        # If the file extention is in mime_types
        # override the content type to fix issues with safari shoving in new file extensions
        if ext in mime_types:
            self.set_header('Content-Type', mime_types[ext])

        await self.write_stream(result)
        self._send_hook('download_file', path=self.path)
Ejemplo n.º 14
0
    def get(self):
        """Download as a Zip archive."""

        self.set_header('Content-Type', 'application/zip')
        self.set_header(
            'Content-Disposition',
            utils.make_disposition('download.zip')
        )

        result = yield from self.provider.zip(**self.arguments)

        while True:
            chunk = yield from result.read(settings.CHUNK_SIZE)
            if not chunk:
                break
            self.write(chunk)
            yield from utils.future_wrapper(self.flush())
Ejemplo n.º 15
0
    def download_file(self):
        if 'Range' not in self.request.headers:
            request_range = None
        else:
            request_range = tornado.httputil._parse_request_range(
                self.request.headers['Range'])

        version = self.get_query_argument(
            'version', default=None) or self.get_query_argument('revision',
                                                                default=None)
        stream = yield from self.provider.download(
            self.path,
            revision=version,
            range=request_range,
            accept_url='direct' not in self.request.query_arguments,
            mode=self.get_query_argument('mode', default=None),
        )

        if isinstance(stream, str):
            return self.redirect(stream)

        if getattr(stream, 'partial', None):
            # Use getattr here as not all stream may have a partial attribute
            # Plus it fixes tests
            self.set_status(206)
            self.set_header('Content-Range', stream.content_range)

        if stream.content_type is not None:
            self.set_header('Content-Type', stream.content_type)

        if stream.size is not None:
            self.set_header('Content-Length', str(stream.size))

        # Build `Content-Disposition` header from `displayName` override,
        # headers of provider response, or file path, whichever is truthy first
        name = self.get_query_argument('displayName', default=None) or getattr(
            stream, 'name', None) or self.path.name
        self.set_header('Content-Disposition', utils.make_disposition(name))

        _, ext = os.path.splitext(name)
        # If the file extention is in mime_types
        # override the content type to fix issues with safari shoving in new file extensions
        if ext in mime_types:
            self.set_header('Content-Type', mime_types[ext])

        yield self.write_stream(stream)
Ejemplo n.º 16
0
    async def download_file(self):
        if 'Range' not in self.request.headers:
            request_range = None
        else:
            request_range = tornado.httputil._parse_request_range(self.request.headers['Range'])

        version = self.get_query_argument('version', default=None) or self.get_query_argument('revision', default=None)
        stream = await self.provider.download(
            self.path,
            revision=version,
            range=request_range,
            accept_url='direct' not in self.request.query_arguments,
            mode=self.get_query_argument('mode', default=None),
        )

        if isinstance(stream, str):
            return self.redirect(stream)

        if getattr(stream, 'partial', None):
            # Use getattr here as not all stream may have a partial attribute
            # Plus it fixes tests
            self.set_status(206)
            self.set_header('Content-Range', stream.content_range)

        if stream.content_type is not None:
            self.set_header('Content-Type', stream.content_type)

        if stream.size is not None:
            self.set_header('Content-Length', str(stream.size))

        # Build `Content-Disposition` header from `displayName` override,
        # headers of provider response, or file path, whichever is truthy first
        name = self.get_query_argument('displayName', default=None) or getattr(stream, 'name', None) or self.path.name
        self.set_header('Content-Disposition', utils.make_disposition(name))

        _, ext = os.path.splitext(name)
        # If the file extention is in mime_types
        # override the content type to fix issues with safari shoving in new file extensions
        if ext in mime_types:
            self.set_header('Content-Type', mime_types[ext])

        await self.write_stream(stream)
Ejemplo n.º 17
0
    async def get(self):
        """Download a file."""
        try:
            self.arguments['accept_url'] = TRUTH_MAP[self.arguments.get('accept_url', 'true').lower()]
        except KeyError:
            raise tornado.web.HTTPError(status_code=400)

        if 'Range' in self.request.headers:
            request_range = tornado.httputil._parse_request_range(self.request.headers['Range'])
        else:
            request_range = None

        result = await self.provider.download(range=request_range, **self.arguments)

        if isinstance(result, str):
            return self.redirect(result)

        if getattr(result, 'partial', None):
            # Use getattr here as not all stream may have a partial attribute
            # Plus it fixes tests
            self.set_status(206)
            self.set_header('Content-Range', result.content_range)

        if result.content_type is not None:
            self.set_header('Content-Type', result.content_type)

        if result.size is not None:
            self.set_header('Content-Length', str(result.size))

        # Build `Content-Disposition` header from `displayName` override,
        # headers of provider response, or file path, whichever is truthy first
        name = self.arguments.get('displayName') or getattr(result, 'name', None) or self.path.name
        self.set_header('Content-Disposition', utils.make_disposition(name))

        _, ext = os.path.splitext(name)
        # If the file extention is in mime_types
        # override the content type to fix issues with safari shoving in new file extensions
        if ext in mime_types:
            self.set_header('Content-Type', mime_types[ext])

        await self.write_stream(result)