make the wapi/wui [*] support creation of a new directory without there already being an existing directory to link the new one into

[*] WebAPI/WebUI
This commit is contained in:
Zooko O'Whielacronx 2007-12-20 12:58:17 -07:00
parent d4283ac1ec
commit a4bc623fa5
2 changed files with 36 additions and 12 deletions

View File

@ -1109,6 +1109,11 @@ class Web(WebMixin, unittest.TestCase):
d.addCallback(_after_mkdir)
return d
def test_POST_mkdir_no_parentdir_redirect(self):
d = self.POST("/uri/?t=mkdir&redirect_to_result=true")
d.addBoth(self.shouldRedirect, None, statuscode='303')
return d
def test_POST_mkdir_replace(self): # return value?
d = self.POST(self.public_url + "/foo", t="mkdir", name="sub")
d.addCallback(lambda res: self._foo_node.get("sub"))
@ -1301,15 +1306,21 @@ class Web(WebMixin, unittest.TestCase):
d.addCallback(self.failUnlessIsFooJSON)
return d
def shouldRedirect(self, res, target):
def shouldRedirect(self, res, target=None, statuscode=None):
""" If target is not None then the redirection has to go to target. If
statuscode is not None then the redirection has to be accomplished with
that HTTP status code."""
if not isinstance(res, failure.Failure):
self.fail("we were expecting to get redirected to %s, not get an"
" actual page: %s" % (target, res))
self.fail("we were expecting to get redirected %s, not get an"
" actual page: %s" % ((target is None) and "somewhere" or ("to " + target), res))
res.trap(error.PageRedirect)
# the PageRedirect does not seem to capture the uri= query arg
# properly, so we can't check for it.
realtarget = self.webish_url + target
self.failUnlessEqual(res.value.location, realtarget)
if statuscode is not None:
self.failUnlessEqual(res.value.status, statuscode)
if target is not None:
# the PageRedirect does not seem to capture the uri= query arg
# properly, so we can't check for it.
realtarget = self.webish_url + target
self.failUnlessEqual(res.value.location, realtarget)
def test_GET_URI_form(self):
base = "/uri?uri=%s" % self._bar_txt_uri
@ -1422,7 +1433,7 @@ class Web(WebMixin, unittest.TestCase):
"/uri only accepts PUT and PUT?t=mkdir")
return d
def test_PUT_NEWDIR_URI(self):
def test_PUT_mkdir(self):
d = self.PUT("/uri?t=mkdir", "")
def _check(uri):
n = self.s.create_node_from_uri(uri.strip())

View File

@ -30,6 +30,9 @@ class ILocalAccess(Interface):
"""Return True if t=upload&localdir= is allowed, giving anyone who
can talk to the webserver control over the local (disk) filesystem."""
def boolean_of_arg(arg):
assert arg.lower() in ("true", "t", "1", "false", "f", "0")
return arg.lower() in ("true", "t", "1")
# we must override twisted.web.http.Request.requestReceived with a version
# that doesn't use cgi.parse_multipart() . Since we actually use Nevow, we
@ -720,7 +723,7 @@ class POSTHandler(rend.Page):
when_done = req.fields["when_done"].value
if "replace" in req.fields:
if req.fields["replace"].value.lower() in ("false", "0"):
if not boolean_of_arg(req.fields["replace"].value):
self._replace = False
if t == "mkdir":
@ -1105,7 +1108,7 @@ class VDrive(rend.Page):
replace = True
if "replace" in req.args:
if req.args["replace"][0].lower() in ("false", "0"):
if not boolean_of_arg(req.args["replace"][0]):
replace = False
if method == "GET":
@ -1209,6 +1212,7 @@ class URIPUTHandler(rend.Page):
# "PUT /uri?t=mkdir", to create an unlinked directory.
d = IClient(ctx).create_empty_dirnode()
d.addCallback(lambda dirnode: dirnode.get_uri())
# XXX add redirect_to_result
return d
req.setResponseCode(http.BAD_REQUEST)
@ -1235,7 +1239,16 @@ class URIPOSTHandler(rend.Page):
if t == "mkdir":
# "PUT /uri?t=mkdir", to create an unlinked directory.
d = IClient(ctx).create_empty_dirnode()
d.addCallback(lambda dirnode: dirnode.get_uri())
redirect = req.args.has_key("redirect_to_result") and boolean_of_arg(req.args["redirect_to_result"][0])
if redirect:
def _then_redir(res):
req.setResponseCode(303)
req.setHeader('location', res.get_uri())
req.finish()
return ''
d.addCallback(_then_redir)
else:
d.addCallback(lambda dirnode: dirnode.get_uri())
return d
req.setResponseCode(http.BAD_REQUEST)
@ -1275,7 +1288,7 @@ class Root(rend.Page):
return URIPUTHandler(), ()
elif req.method == "POST":
# "POST /uri?t=upload&file=newfile" to upload an unlinked
# file
# file or "POST /uri?t=mkdir" to create a new directory
return URIPOSTHandler(), ()
if len(segments) < 2:
return rend.NotFound