From: Brian Warner <warner@allmydata.com>
Date: Tue, 20 May 2008 19:36:02 +0000 (-0700)
Subject: web: handle PUT mutable=true properly
X-Git-Tag: allmydata-tahoe-1.1.0~101
X-Git-Url: https://git.rkrishnan.org/Site/Content/somewhere?a=commitdiff_plain;h=e3230197080d29702f3f509cbf6ae26c45c8c3ad;p=tahoe-lafs%2Ftahoe-lafs.git

web: handle PUT mutable=true properly
---

diff --git a/src/allmydata/test/test_web.py b/src/allmydata/test/test_web.py
index 4f089d1b..313f4fc6 100644
--- a/src/allmydata/test/test_web.py
+++ b/src/allmydata/test/test_web.py
@@ -587,6 +587,24 @@ class Web(WebMixin, unittest.TestCase):
                                                       self.NEWFILE_CONTENTS))
         return d
 
+    def test_PUT_NEWFILEURL_mutable(self):
+        d = self.PUT(self.public_url + "/foo/new.txt?mutable=true",
+                     self.NEWFILE_CONTENTS)
+        # TODO: we lose the response code, so we can't check this
+        #self.failUnlessEqual(responsecode, 201)
+        def _check_uri(res):
+            u = uri.from_string_mutable_filenode(res)
+            self.failUnless(u.is_mutable())
+            self.failIf(u.is_readonly())
+            return res
+        d.addCallback(_check_uri)
+        d.addCallback(self.failUnlessURIMatchesChild, self._foo_node, u"new.txt")
+        d.addCallback(lambda res:
+                      self.failUnlessMutableChildContentsAre(self._foo_node,
+                                                             u"new.txt",
+                                                             self.NEWFILE_CONTENTS))
+        return d
+
     def test_PUT_NEWFILEURL_replace(self):
         d = self.PUT(self.public_url + "/foo/bar.txt", self.NEWFILE_CONTENTS)
         # TODO: we lose the response code, so we can't check this
diff --git a/src/allmydata/web/filenode.py b/src/allmydata/web/filenode.py
index 751e097b..013c1e06 100644
--- a/src/allmydata/web/filenode.py
+++ b/src/allmydata/web/filenode.py
@@ -22,8 +22,21 @@ class ReplaceMeMixin:
         # a new file is being uploaded in our place.
         req = IRequest(ctx)
         client = IClient(ctx)
-        uploadable = FileHandle(req.content, convergence=client.convergence)
-        d = self.parentnode.add_file(self.name, uploadable, overwrite=replace)
+        mutable = boolean_of_arg(get_arg(req, "mutable", "false"))
+        if mutable:
+            req.content.seek(0)
+            data = req.content.read()
+            d = client.create_mutable_file(data)
+            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)