Skip to content
Snippets Groups Projects
Commit 6e6a131b authored by Vincent Petry's avatar Vincent Petry
Browse files

Merge pull request #7696 from owncloud/chunk-remainingspacefix

Fixed chunking and insufficient storage check
parents 27eff1ac 4033eba3
Branches
No related tags found
No related merge requests found
......@@ -56,8 +56,19 @@ class OC_Connector_Sabre_QuotaPlugin extends Sabre_DAV_ServerPlugin {
$uri='/'.$uri;
}
list($parentUri, $newName) = Sabre_DAV_URLUtil::splitPath($uri);
$req = $this->server->httpRequest;
if ($req->getHeader('OC-Chunked')) {
$info = OC_FileChunking::decodeName($newName);
$chunkHandler = new OC_FileChunking($info);
// substract the already uploaded size to see whether
// there is still enough space for the remaining chunks
$length -= $chunkHandler->getCurrentSize();
}
$freeSpace = $this->getFreeSpace($parentUri);
if ($freeSpace !== \OC\Files\SPACE_UNKNOWN && $length > $freeSpace) {
if (isset($chunkHandler)) {
$chunkHandler->cleanup();
}
throw new Sabre_DAV_Exception_InsufficientStorage();
}
}
......
......@@ -64,19 +64,45 @@ class OC_FileChunking {
return $parts == $this->info['chunkcount'];
}
/**
* Assembles the chunks into the file specified by the path.
* Chunks are deleted afterwards.
*
* @param string $f target path
*
* @return assembled file size
*
* @throws \OC\InsufficientStorageException when file could not be fully
* assembled due to lack of free space
*/
public function assemble($f) {
$cache = $this->getCache();
$prefix = $this->getPrefix();
$count = 0;
for ($i = 0; $i < $this->info['chunkcount']; $i++) {
$chunk = $cache->get($prefix.$i);
// remove after reading to directly save space
$cache->remove($prefix.$i);
$count += fwrite($f, $chunk);
}
$this->cleanup();
return $count;
}
/**
* Returns the size of the chunks already present
* @return size in bytes
*/
public function getCurrentSize() {
$cache = $this->getCache();
$prefix = $this->getPrefix();
$total = 0;
for ($i = 0; $i < $this->info['chunkcount']; $i++) {
$total += $cache->size($prefix.$i);
}
return $total;
}
/**
* Removes all chunks which belong to this transmission
*/
......@@ -128,7 +154,15 @@ class OC_FileChunking {
}
/**
* @param string $path
* Assembles the chunks into the file specified by the path.
* Also triggers the relevant hooks and proxies.
*
* @param string $path target path
*
* @return assembled file size or false if file could not be created
*
* @throws \OC\InsufficientStorageException when file could not be fully
* assembled due to lack of free space
*/
public function file_assemble($path) {
$absolutePath = \OC\Files\Filesystem::normalizePath(\OC\Files\Filesystem::getView()->getAbsolutePath($path));
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment