]> git.ipfire.org Git - pbs.git/commitdiff
hub: Add new handler for streaming uploads
authorMichael Tremer <michael.tremer@ipfire.org>
Fri, 3 Nov 2017 16:35:25 +0000 (16:35 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Fri, 3 Nov 2017 16:35:25 +0000 (16:35 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/database.sql
src/hub/__init__.py
src/hub/handlers.py

index ae02c68781ff4ddbaeaa6b7979709d1a5297713b..7a09c8918fa286111b2db8dfcf5fa8d8aebe1cbe 100644 (file)
@@ -1385,7 +1385,7 @@ CREATE TABLE uploads (
     user_id integer,
     builder_id integer,
     filename text NOT NULL,
-    hash text NOT NULL,
+    hash text,
     size bigint NOT NULL,
     progress bigint DEFAULT 0 NOT NULL,
     finished boolean DEFAULT false NOT NULL,
index e7b7391d14c0770e7cabc29458c308ddbd1b5d41..20bef7ffa5600fe6977239dcfd0d01cf997bbb68 100644 (file)
@@ -55,6 +55,7 @@ class Application(tornado.web.Application):
 
                        # Uploads
                        (r"/uploads/create", handlers.UploadsCreateHandler),
+                       (r"/uploads/stream", handlers.UploadsStreamHandler),
                        (r"/uploads/(.*)/sendchunk", handlers.UploadsSendChunkHandler),
                        (r"/uploads/(.*)/finished", handlers.UploadsFinishedHandler),
                        (r"/uploads/(.*)/destroy", handlers.UploadsDestroyHandler),
@@ -80,7 +81,8 @@ class Application(tornado.web.Application):
        def run(self, port=81):
                logging.debug("Going to background")
 
-               http_server = tornado.httpserver.HTTPServer(self, xheaders=True)
+               http_server = tornado.httpserver.HTTPServer(self, xheaders=True,
+                       max_body_size=1 * (1024 ** 3))
 
                # If we are not running in debug mode, we can actually run multiple
                # frontends to get best performance out of our service.
index a4bd8164c8e5be289263e15f292f60829edf4bf8..aa4802c25ce3fb7e6fa500325d745ae6f9bd9cfb 100644 (file)
@@ -153,7 +153,7 @@ class UploadsCreateHandler(BaseHandler):
 
                filename = self.get_argument("filename")
                filesize = self.get_argument_int("filesize")
-               filehash = self.get_argument("hash")
+               filehash = self.get_argument("hash", None)
 
                with self.db.transaction():
                        upload = self.backend.uploads.create(filename, filesize,
@@ -162,6 +162,37 @@ class UploadsCreateHandler(BaseHandler):
                        self.finish(upload.uuid)
 
 
+@tornado.web.stream_request_body
+class UploadsStreamHandler(BaseHandler):
+       @tornado.web.authenticated
+       def prepare(self):
+               # Received file size
+               self.size = 0
+
+               upload_uuid = self.get_argument("id")
+
+               # Fetch upload object from database
+               self.upload = self.backend.uploads.get_by_uuid(upload_uuid)
+               if not self.upload:
+                       raise tornado.web.HTTPError(404)
+
+       def data_received(self, data):
+               logging.debug("Received chunk of %s bytes" % len(data))
+               self.size += len(data)
+
+               # Write the received chunk to disk
+               with self.db.transaction():
+                       self.upload.append(data)
+
+       def put(self):
+               logging.info("Received entire file (%s bytes)" % self.size)
+
+               with self.db.transaction():
+                       self.upload.finished()
+
+               self.finish("OK")
+
+
 class UploadsSendChunkHandler(BaseHandler):
        @tornado.web.authenticated
        def post(self, upload_id):