Ejemplo n.º 1
0
 def render_POST(self, ctx):
     # "POST /uri?t=upload&file=newfile" to upload an
     # unlinked file or "POST /uri?t=mkdir" to create a
     # new directory
     req = IRequest(ctx)
     t = get_arg(req, "t", "").strip()
     if t in ("", "upload"):
         mutable = bool(get_arg(req, "mutable", "").strip())
         if mutable:
             arg = get_arg(req, "mutable-type", None)
             version = parse_mutable_type_arg(arg)
             if version is "invalid":
                 raise WebError("Unknown type: %s" % arg, http.BAD_REQUEST)
             return unlinked.POSTUnlinkedSSK(req, self.client, version)
         else:
             return unlinked.POSTUnlinkedCHK(req, self.client)
     if t == "mkdir":
         return unlinked.POSTUnlinkedCreateDirectory(req, self.client)
     elif t == "mkdir-with-children":
         return unlinked.POSTUnlinkedCreateDirectoryWithChildren(req,
                                                                 self.client)
     elif t == "mkdir-immutable":
         return unlinked.POSTUnlinkedCreateImmutableDirectory(req,
                                                              self.client)
     errmsg = ("/uri accepts only PUT, PUT?t=mkdir, POST?t=upload, "
               "and POST?t=mkdir")
     raise WebError(errmsg, http.BAD_REQUEST)
Ejemplo n.º 2
0
    def replace_me_with_a_formpost(self, req, client, replace):
        # create a new file, maybe mutable, maybe immutable
        mutable = boolean_of_arg(get_arg(req, "mutable", "false"))

        # create an immutable file
        contents = req.fields["file"]
        if mutable:
            arg = get_arg(req, "mutable-type", None)
            mutable_type = parse_mutable_type_arg(arg)
            if mutable_type is "invalid":
                raise WebError("Unknown type: %s" % arg, http.BAD_REQUEST)
            uploadable = MutableFileHandle(contents.file)
            d = client.create_mutable_file(uploadable, version=mutable_type)
            def _uploaded(newnode):
                d2 = self.parentnode.set_node(self.name, newnode,
                                              overwrite=replace)
                d2.addCallback(lambda res: newnode.get_uri())
                return d2
            d.addCallback(_uploaded)
            return d

        uploadable = FileHandle(contents.file, convergence=client.convergence)
        d = self.parentnode.add_file(self.name, uploadable, overwrite=replace)
        d.addCallback(lambda newnode: newnode.get_uri())
        return d
Ejemplo n.º 3
0
    def replace_me_with_a_child(self, req, client, replace):
        # a new file is being uploaded in our place.
        mutable = boolean_of_arg(get_arg(req, "mutable", "false"))
        if mutable:
            arg = get_arg(req, "mutable-type", None)
            mutable_type = parse_mutable_type_arg(arg)
            if mutable_type is "invalid":
                raise WebError("Unknown type: %s" % arg, http.BAD_REQUEST)

            data = MutableFileHandle(req.content)
            d = client.create_mutable_file(data, version=mutable_type)
            def _uploaded(newnode):
                d2 = self.parentnode.set_node(self.name, newnode,
                                              overwrite=replace)
                d2.addCallback(lambda res: newnode)
                return d2
            d.addCallback(_uploaded)
        else:
            uploadable = FileHandle(req.content, convergence=client.convergence)
            d = self.parentnode.add_file(self.name, uploadable,
                                         overwrite=replace)
        def _done(filenode):
            log.msg("webish upload complete",
                    facility="tahoe.webish", level=log.NOISY, umid="TCjBGQ")
            if self.node:
                # we've replaced an existing file (or modified a mutable
                # file), so the response code is 200
                req.setResponseCode(http.OK)
            else:
                # we've created a new file, so the code is 201
                req.setResponseCode(http.CREATED)
            return filenode.get_uri()
        d.addCallback(_done)
        return d
Ejemplo n.º 4
0
def PUTUnlinkedCreateDirectory(req, client):
    # "PUT /uri?t=mkdir", to create an unlinked directory.
    arg = get_arg(req, "mutable-type", None)
    mt = parse_mutable_type_arg(arg)
    if mt is not None and mt is not "invalid":
        d = client.create_dirnode(version=mt)
    elif mt is "invalid":
        msg = "Unknown type: %s" % arg
        raise WebError(msg, http.BAD_REQUEST)
    else:
        d = client.create_dirnode()
    d.addCallback(lambda dirnode: dirnode.get_uri())
    # XXX add redirect_to_result
    return d
Ejemplo n.º 5
0
    def render_PUT(self, ctx):
        req = IRequest(ctx)
        # either "PUT /uri" to create an unlinked file, or
        # "PUT /uri?t=mkdir" to create an unlinked directory
        t = get_arg(req, "t", "").strip()
        if t == "":
            mutable = boolean_of_arg(get_arg(req, "mutable", "false").strip())
            if mutable:
                arg = get_arg(req, "mutable-type", None)
                version = parse_mutable_type_arg(arg)
                if version == "invalid":
                    errmsg = "Unknown type: %s" % arg
                    raise WebError(errmsg, http.BAD_REQUEST)

                return unlinked.PUTUnlinkedSSK(req, self.client, version)
            else:
                return unlinked.PUTUnlinkedCHK(req, self.client)
        if t == "mkdir":
            return unlinked.PUTUnlinkedCreateDirectory(req, self.client)
        errmsg = ("/uri accepts only PUT, PUT?t=mkdir, POST?t=upload, "
                  "and POST?t=mkdir")
        raise WebError(errmsg, http.BAD_REQUEST)
Ejemplo n.º 6
0
def POSTUnlinkedCreateDirectory(req, client):
    # "POST /uri?t=mkdir", to create an unlinked directory.
    ct = req.getHeader("content-type") or ""
    if not ct.startswith("multipart/form-data"):
        # guard against accidental attempts to call t=mkdir as if it were
        # t=mkdir-with-children, but make sure we tolerate the usual HTML
        # create-directory form (in which the t=mkdir and redirect_to_result=
        # and other arguments can be passed encoded as multipath/form-data,
        # in the request body).
        req.content.seek(0)
        kids_json = req.content.read()
        if kids_json:
            raise WebError("t=mkdir does not accept children=, "
                           "try t=mkdir-with-children instead",
                           http.BAD_REQUEST)
    arg = get_arg(req, "mutable-type", None)
    mt = parse_mutable_type_arg(arg)
    if mt is not None and mt is not "invalid":
        d = client.create_dirnode(version=mt)
    elif mt is "invalid":
        msg = "Unknown type: %s" % arg
        raise WebError(msg, http.BAD_REQUEST)
    else:
        d = client.create_dirnode()
    redirect = get_arg(req, "redirect_to_result", "false")
    if boolean_of_arg(redirect):
        def _then_redir(res):
            new_url = "uri/" + urllib.quote(res.get_uri())
            req.setResponseCode(http.SEE_OTHER) # 303
            req.setHeader('location', new_url)
            req.finish()
            return ''
        d.addCallback(_then_redir)
    else:
        d.addCallback(lambda dirnode: dirnode.get_uri())
    return d