def test_POST_upload_no_link(self):
d = self.POST("/uri", t="upload",
file=("new.txt", self.NEWFILE_CONTENTS))
+ def _check_upload_results(page):
+ # this should be a page which describes the results of the upload
+ # that just finished.
+ self.failUnless("Upload Results:" in page)
+ self.failUnless("URI:" in page)
+ uri_re = re.compile("URI: <tt><span>(.*)</span>")
+ mo = uri_re.search(page)
+ self.failUnless(mo, page)
+ new_uri = mo.group(1)
+ return new_uri
+ d.addCallback(_check_upload_results)
d.addCallback(self.failUnlessCHKURIHasContents, self.NEWFILE_CONTENTS)
return d
--- /dev/null
+<html xmlns:n="http://nevow.com/ns/nevow/0.1">
+ <head>
+ <title>AllMyData - Tahoe - File Uploaded</title>
+ <!-- <link href="http://www.allmydata.com/common/css/styles.css"
+ rel="stylesheet" type="text/css"/> -->
+ <link href="/webform_css" rel="stylesheet" type="text/css"/>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+ </head>
+ <body>
+
+<h1>Uploading File... <span n:render="string" n:data="done" /></h1>
+
+<h2>Upload Results:</h2>
+<ul>
+ <li>URI: <tt><span n:render="string" n:data="uri" /></tt></li>
+ <li>Download link: <span n:render="download_link" /></li>
+</ul>
+
+<div>Return to the <a href="/">Welcome Page</a></div>
+
+ </body>
+</html>
from twisted.internet.interfaces import IConsumer
from nevow import inevow, rend, loaders, appserver, url, tags as T
from nevow.static import File as nevow_File # TODO: merge with static.File?
-from allmydata.util import fileutil, idlib
+from allmydata.util import fileutil, idlib, observer
import simplejson
from allmydata.interfaces import IDownloadTarget, IDirectoryNode, IFileNode, \
IMutableFileNode
class UnlinkedPOSTCHKUploader(rend.Page):
- def renderHTTP(self, ctx):
- req = inevow.IRequest(ctx)
- assert req.method == "POST"
+ """'POST /uri', to create an unlinked file."""
+ docFactory = getxmlfile("unlinked-upload.xhtml")
- # "POST /uri", to create an unlinked file.
+ def __init__(self, client, req):
+ rend.Page.__init__(self)
+ # we start the upload now, and distribute notification of its
+ # completion to render_ methods with an ObserverList
+ assert req.method == "POST"
+ self._done = observer.OneShotObserverList()
fileobj = req.fields["file"].file
uploadable = FileHandle(fileobj)
- d = IClient(ctx).upload(uploadable)
- d.addCallback(lambda results: results.uri)
- # that fires with the URI of the new file
+ d = client.upload(uploadable)
+ d.addBoth(self._done.fire)
+
+ def upload_results(self):
+ return self._done.when_fired()
+
+ def data_done(self, ctx, data):
+ d = self.upload_results()
+ d.addCallback(lambda res: "done!")
+ return d
+
+ def data_uri(self, ctx, data):
+ d = self.upload_results()
+ d.addCallback(lambda res: res.uri)
+ return d
+
+ def render_download_link(self, ctx, data):
+ d = self.upload_results()
+ d.addCallback(lambda res: T.a(href="/uri/" + urllib.quote(res.uri))
+ ["/uri/" + res.uri])
return d
class UnlinkedPOSTSSKUploader(rend.Page):
if mutable:
return UnlinkedPOSTSSKUploader(), ()
else:
- return UnlinkedPOSTCHKUploader(), ()
+ return UnlinkedPOSTCHKUploader(client, req), ()
if t == "mkdir":
return UnlinkedPOSTCreateDirectory(), ()
errmsg = "/uri accepts only PUT, PUT?t=mkdir, POST?t=upload, and POST?t=mkdir"