mirror of
https://github.com/tahoe-lafs/tahoe-lafs.git
synced 2025-05-30 22:34:24 +00:00
webish: implement 'PUT /uri' (to create anonymous files)
This commit is contained in:
parent
77394da447
commit
db3f11648c
@ -62,8 +62,9 @@ def make_newuri(data):
|
|||||||
class MyUploader(service.Service):
|
class MyUploader(service.Service):
|
||||||
implements(interfaces.IUploader)
|
implements(interfaces.IUploader)
|
||||||
name = "uploader"
|
name = "uploader"
|
||||||
def __init__(self, files):
|
def __init__(self, files, nodes):
|
||||||
self.files = files
|
self.files = files
|
||||||
|
self.nodes = nodes
|
||||||
|
|
||||||
def upload(self, uploadable):
|
def upload(self, uploadable):
|
||||||
d = uploadable.get_size()
|
d = uploadable.get_size()
|
||||||
@ -72,7 +73,9 @@ class MyUploader(service.Service):
|
|||||||
def _got_data(data):
|
def _got_data(data):
|
||||||
newuri = make_newuri(data)
|
newuri = make_newuri(data)
|
||||||
self.files[newuri] = data
|
self.files[newuri] = data
|
||||||
|
self.nodes[newuri] = MyFileNode(newuri, self.parent)
|
||||||
uploadable.close()
|
uploadable.close()
|
||||||
|
return newuri
|
||||||
d.addCallback(_got_data)
|
d.addCallback(_got_data)
|
||||||
return d
|
return d
|
||||||
|
|
||||||
@ -173,7 +176,7 @@ class WebMixin(object):
|
|||||||
|
|
||||||
dl = MyDownloader(self.files)
|
dl = MyDownloader(self.files)
|
||||||
dl.setServiceParent(self.s)
|
dl.setServiceParent(self.s)
|
||||||
ul = MyUploader(self.files)
|
ul = MyUploader(self.files, self.nodes)
|
||||||
ul.setServiceParent(self.s)
|
ul.setServiceParent(self.s)
|
||||||
|
|
||||||
v.public_root = self.makedir()
|
v.public_root = self.makedir()
|
||||||
@ -1389,6 +1392,20 @@ class Web(WebMixin, unittest.TestCase):
|
|||||||
"to not replace it")
|
"to not replace it")
|
||||||
return d
|
return d
|
||||||
|
|
||||||
|
def test_PUT_NEWFILE_URI(self):
|
||||||
|
file_contents = "New file contents here\n"
|
||||||
|
d = self.PUT("/uri", file_contents)
|
||||||
|
def _check(uri):
|
||||||
|
self.failUnless(uri in self.files)
|
||||||
|
self.failUnless(uri in self.nodes)
|
||||||
|
self.failUnlessEqual(self.files[uri], file_contents)
|
||||||
|
return self.GET("/uri/%s" % uri.replace("/","!"))
|
||||||
|
d.addCallback(_check)
|
||||||
|
def _check2(res):
|
||||||
|
self.failUnlessEqual(res, file_contents)
|
||||||
|
d.addCallback(_check2)
|
||||||
|
return d
|
||||||
|
|
||||||
def test_XMLRPC(self):
|
def test_XMLRPC(self):
|
||||||
raise unittest.SkipTest("not yet")
|
raise unittest.SkipTest("not yet")
|
||||||
pass
|
pass
|
||||||
|
@ -1019,6 +1019,36 @@ class VDrive(rend.Page):
|
|||||||
d.addErrback(_trap_KeyError)
|
d.addErrback(_trap_KeyError)
|
||||||
return d
|
return d
|
||||||
|
|
||||||
|
class URIPUTHandler(rend.Page):
|
||||||
|
def renderHTTP(self, ctx):
|
||||||
|
req = inevow.IRequest(ctx)
|
||||||
|
assert req.method == "PUT"
|
||||||
|
|
||||||
|
t = ""
|
||||||
|
if "t" in req.args:
|
||||||
|
t = req.args["t"][0]
|
||||||
|
|
||||||
|
if t == "":
|
||||||
|
# "PUT /uri", to create an unlinked file. This is like PUT but
|
||||||
|
# without the associated set_uri.
|
||||||
|
uploadable = upload.FileHandle(req.content)
|
||||||
|
uploader = IClient(ctx).getServiceNamed("uploader")
|
||||||
|
d = uploader.upload(uploadable)
|
||||||
|
# that fires with the URI of the new file
|
||||||
|
return d
|
||||||
|
|
||||||
|
if t == "mkdir":
|
||||||
|
# "PUT /uri?t=mkdir", to create an unlinked directory. We use the
|
||||||
|
# public vdriveserver to create the dirnode.
|
||||||
|
vdrive = IClient(ctx).getServiceNamed("vdrive")
|
||||||
|
d = vdrive.create_directory()
|
||||||
|
d.addCallback(lambda dirnode: dirnode.get_uri())
|
||||||
|
return d
|
||||||
|
|
||||||
|
req.setResponseCode(http.BAD_REQUEST)
|
||||||
|
req.setHeader("content-type", "text/plain")
|
||||||
|
return "/uri only accepts PUT"
|
||||||
|
|
||||||
|
|
||||||
class Root(rend.Page):
|
class Root(rend.Page):
|
||||||
|
|
||||||
@ -1049,6 +1079,11 @@ class Root(rend.Page):
|
|||||||
there = there.clear("uri")
|
there = there.clear("uri")
|
||||||
there = there.child("uri").child(uri)
|
there = there.child("uri").child(uri)
|
||||||
return there, ()
|
return there, ()
|
||||||
|
if len(segments) == 1 and req.method == "PUT":
|
||||||
|
# /uri
|
||||||
|
# either "PUT /uri" to create an unlinked file, or
|
||||||
|
# "PUT /uri?t=mkdir" to create an unlinked directory
|
||||||
|
return URIPUTHandler(), ()
|
||||||
if len(segments) < 2:
|
if len(segments) < 2:
|
||||||
return rend.NotFound
|
return rend.NotFound
|
||||||
uri = segments[1].replace("!", "/")
|
uri = segments[1].replace("!", "/")
|
||||||
|
Loading…
x
Reference in New Issue
Block a user