Example #1
0
def handle_upload(request, resource_id):
    check_permission(request)

    if request.method == "DELETE":
        return cancel_upload(resource_id)
    if request.method == "HEAD":
        return upload_info(resource_id)
    elif request.method == "PATCH":
        return upload_part(request, resource_id)
Example #2
0
def start_upload(request):
    check_permission(request)

    response = get_tus_response()

    if request.META.get("HTTP_TUS_RESUMABLE", None) is None:
        logger.warning(
            "Received File upload for unsupported file transfer protocol")
        response.status_code = 500
        response.reason_phrase = (
            "Received File upload for unsupported file transfer protocol")
        return response

    metadata = {}
    upload_metadata = request.META.get("HTTP_UPLOAD_METADATA", None)

    if upload_metadata:
        for kv in upload_metadata.split(","):
            (key, value) = kv.split(" ")
            metadata[key] = base64.b64decode(value).decode("utf-8")

    logger.info(f"TUS post metadata={metadata}")

    file_size = int(request.META.get("HTTP_UPLOAD_LENGTH", "0"))
    resource_id = str(uuid.uuid4())

    cache.add(
        "tus-uploads/{}/filename".format(resource_id),
        metadata.get("filename"),
        conf.TIMEOUT,
    )
    cache.add("tus-uploads/{}/file_size".format(resource_id), file_size,
              conf.TIMEOUT)
    cache.add("tus-uploads/{}/offset".format(resource_id), 0, conf.TIMEOUT)
    cache.add("tus-uploads/{}/metadata".format(resource_id), metadata,
              conf.TIMEOUT)

    try:
        with Path(get_upload_path()).joinpath(resource_id).open("wb") as f:
            pass
    except IOError as e:
        logger.error(
            "Unable to create file: {}".format(e),
            exc_info=True,
            extra={
                "request": request,
            },
        )
        response.status_code = 500
        return response

    response.status_code = 201
    response["Location"] = "{}{}".format(request.build_absolute_uri(),
                                         resource_id)
    return response
Example #3
0
    def dispatch(self, *args, **kwargs):
        check_permission(self.request)

        override_method = self.request.META.get('HTTP_X_HTTP_METHOD_OVERRIDE',
                                                None)
        if override_method:
            self.request.method = override_method
        logger.info("TUS dispatch",
                    extra={
                        'requestMETA': self.request.META,
                        "requestMethod": self.request.method
                    })

        return super(TusUpload, self).dispatch(*args, **kwargs)
Example #4
0
    def dispatch(self, *args, **kwargs):
        check_permission(self.request)

        logger.info(f"TUS dispatch method={self.request.method}")

        return super(TusUpload, self).dispatch(*args, **kwargs)