]> source.dussan.org Git - nextcloud-server.git/commitdiff
moving createFileChunked() to OC_Connector_Sabre_File
authorThomas Müller <thomas.mueller@tmit.eu>
Mon, 7 Oct 2013 15:49:21 +0000 (17:49 +0200)
committerThomas Müller <thomas.mueller@tmit.eu>
Mon, 7 Oct 2013 15:49:21 +0000 (17:49 +0200)
lib/private/connector/sabre/file.php

index 8ffec371e3f4e94a2589fc300a3e88105129c7bb..f2191732c0de26cb8d0390304963566d9b36a319 100644 (file)
@@ -58,21 +58,7 @@ class OC_Connector_Sabre_File extends OC_Connector_Sabre_Node implements Sabre_D
 
                // chunked handling
                if (isset($_SERVER['HTTP_OC_CHUNKED'])) {
-                       list(, $name) = \Sabre_DAV_URLUtil::splitPath($this->path);
-
-                       $info = OC_FileChunking::decodeName($name);
-                       if (empty($info)) {
-                               throw new Sabre_DAV_Exception_NotImplemented();
-                       }
-                       $chunk_handler = new OC_FileChunking($info);
-                       $chunk_handler->store($info['index'], $data);
-                       if ($chunk_handler->isComplete()) {
-                               $newPath = $this->path . '/' . $info['name'];
-                               $chunk_handler->file_assemble($newPath);
-                               return $this->getETagPropertyForPath($newPath);
-                       }
-
-                       return null;
+                       return $this->createFileChunked($data);
                }
 
                // mark file as partial while uploading (ignored by the scanner)
@@ -189,4 +175,37 @@ class OC_Connector_Sabre_File extends OC_Connector_Sabre_Node implements Sabre_D
                return \OC\Files\Filesystem::getMimeType($this->path);
 
        }
+
+       private function createFileChunked($data)
+       {
+               list($path, $name) = \Sabre_DAV_URLUtil::splitPath($this->path);
+
+               $info = OC_FileChunking::decodeName($name);
+               if (empty($info)) {
+                       throw new Sabre_DAV_Exception_NotImplemented();
+               }
+               $chunk_handler = new OC_FileChunking($info);
+               $bytesWritten = $chunk_handler->store($info['index'], $data);
+
+               //detect aborted upload
+               if (isset ($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] === 'PUT' ) {
+                       if (isset($_SERVER['CONTENT_LENGTH'])) {
+                               $expected = $_SERVER['CONTENT_LENGTH'];
+                               if ($bytesWritten != $expected) {
+                                       $chunk_handler->cleanup();
+                                       throw new Sabre_DAV_Exception_BadRequest(
+                                               'expected filesize ' . $expected . ' got ' . $bytesWritten);
+                               }
+                       }
+               }
+
+               if ($chunk_handler->isComplete()) {
+                       $newPath = $path . '/' . $info['name'];
+                       $chunk_handler->file_assemble($newPath);
+                       return OC_Connector_Sabre_Node::getETagPropertyForPath($newPath);
+               }
+
+               return null;
+       }
+
 }