summaryrefslogtreecommitdiffstats
path: root/apps/files/appinfo/filesync.php
diff options
context:
space:
mode:
authorBart Visscher <bartv@thisnet.nl>2012-07-27 19:02:23 +0200
committerBart Visscher <bartv@thisnet.nl>2012-07-27 19:35:33 +0200
commit896d27de36dd26515f30fa3b0748c9c6089600af (patch)
tree93aab8d29799875faf98f244ddcca77155e0012b /apps/files/appinfo/filesync.php
parent1ea33ff36bf70ee2099f8d225f488dc220e3bcff (diff)
downloadnextcloud-server-896d27de36dd26515f30fa3b0748c9c6089600af.tar.gz
nextcloud-server-896d27de36dd26515f30fa3b0748c9c6089600af.zip
Chunked upload: Support reusing local chunks
Diffstat (limited to 'apps/files/appinfo/filesync.php')
-rw-r--r--apps/files/appinfo/filesync.php64
1 files changed, 64 insertions, 0 deletions
diff --git a/apps/files/appinfo/filesync.php b/apps/files/appinfo/filesync.php
new file mode 100644
index 00000000000..707ee2435c0
--- /dev/null
+++ b/apps/files/appinfo/filesync.php
@@ -0,0 +1,64 @@
+<?php
+/**
+ * Copyright (c) 2012 Bart Visscher <bartv@thisnet.nl>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+/**
+ * filesync can be called with a PUT method.
+ * PUT takes a stream starting with a 2 byte blocksize,
+ * followed by binary md5 of the blocks. Everything in big-endian.
+ * The return is a json encoded with:
+ * - 'transferid'
+ * - 'needed' chunks
+ * - 'last' checked chunk
+ * The URL is made of 3 parts, the service url (remote.php/filesync/), the sync
+ * type and the path in ownCloud.
+ * At the moment the only supported sync type is 'oc_chunked'.
+ * The final URL will look like http://.../remote.php/filesync/oc_chunked/path/to/file
+ */
+
+// only need filesystem apps
+$RUNTIME_APPTYPES=array('filesystem','authentication');
+OC_App::loadApps($RUNTIME_APPTYPES);
+if(!OC_User::isLoggedIn()){
+ if(!isset($_SERVER['PHP_AUTH_USER'])){
+ header('WWW-Authenticate: Basic realm="ownCloud Server"');
+ header('HTTP/1.0 401 Unauthorized');
+ echo 'Valid credentials must be supplied';
+ exit();
+ } else {
+ if(!OC_User::login($_SERVER["PHP_AUTH_USER"], $_SERVER["PHP_AUTH_PW"])){
+ exit();
+ }
+ }
+}
+
+list($type,$file) = explode('/', substr($path_info,1+strlen($service)+1), 2);
+
+if ($type != 'oc_chunked') {
+ OC_Response::setStatus(OC_Response::STATUS_NOT_FOUND);
+ die;
+}
+
+if (!OC_Filesystem::is_file($file)) {
+ OC_Response::setStatus(OC_Response::STATUS_NOT_FOUND);
+ die;
+}
+
+switch($_SERVER['REQUEST_METHOD']) {
+ case 'PUT':
+ $input = fopen("php://input", "r");
+ $org_file = OC_Filesystem::fopen($file, 'rb');
+ $info = array(
+ 'name' => basename($file),
+ );
+ $sync = new OC_FileChunking($info);
+ $result = $sync->signature_split($org_file, $input);
+ echo json_encode($result);
+ break;
+ default:
+ OC_Response::setStatus(OC_Response::STATUS_NOT_FOUND);
+}