summaryrefslogtreecommitdiffstats
path: root/apps/files_external/lib
diff options
context:
space:
mode:
authorVincent Petry <pvince81@owncloud.com>2016-03-15 17:22:16 +0100
committerVincent Petry <pvince81@owncloud.com>2016-03-15 18:05:27 +0100
commitab50ba7a585368cb473ab551d54fd9c7b0e69811 (patch)
tree41b1ebcd256d1c75d8aa216d3a956c0864be9626 /apps/files_external/lib
parentad9a0804f3a40123ce931f6f7f365758fe8a0933 (diff)
downloadnextcloud-server-ab50ba7a585368cb473ab551d54fd9c7b0e69811.tar.gz
nextcloud-server-ab50ba7a585368cb473ab551d54fd9c7b0e69811.zip
Fix dropbox storage to not store the whole file in memory
Since the library can only store the full response in memory on download, we use an alternate client lib and set the correct headers to be able to stream the content to a temp file.
Diffstat (limited to 'apps/files_external/lib')
-rw-r--r--apps/files_external/lib/dropbox.php34
1 files changed, 28 insertions, 6 deletions
diff --git a/apps/files_external/lib/dropbox.php b/apps/files_external/lib/dropbox.php
index 3c4022f24ce..f59b5a460e1 100644
--- a/apps/files_external/lib/dropbox.php
+++ b/apps/files_external/lib/dropbox.php
@@ -39,6 +39,7 @@ class Dropbox extends \OC\Files\Storage\Common {
private $root;
private $id;
private $metaData = array();
+ private $oauth;
private static $tempFiles = array();
@@ -51,10 +52,10 @@ class Dropbox extends \OC\Files\Storage\Common {
) {
$this->root = isset($params['root']) ? $params['root'] : '';
$this->id = 'dropbox::'.$params['app_key'] . $params['token']. '/' . $this->root;
- $oauth = new \Dropbox_OAuth_Curl($params['app_key'], $params['app_secret']);
- $oauth->setToken($params['token'], $params['token_secret']);
+ $this->oauth = new \Dropbox_OAuth_Curl($params['app_key'], $params['app_secret']);
+ $this->oauth->setToken($params['token'], $params['token_secret']);
// note: Dropbox_API connection is lazy
- $this->dropbox = new \Dropbox_API($oauth, 'auto');
+ $this->dropbox = new \Dropbox_API($this->oauth, 'auto');
} else {
throw new \Exception('Creating \OC\Files\Storage\Dropbox storage failed');
}
@@ -248,10 +249,31 @@ class Dropbox extends \OC\Files\Storage\Common {
switch ($mode) {
case 'r':
case 'rb':
- $tmpFile = \OCP\Files::tmpFile();
try {
- $data = $this->dropbox->getFile($path);
- file_put_contents($tmpFile, $data);
+ // slashes need to stay
+ $encodedPath = str_replace('%2F', '/', rawurlencode(trim($path, '/')));
+ $downloadUrl = 'https://api-content.dropbox.com/1/files/auto/' . $encodedPath;
+ $headers = $this->oauth->getOAuthHeader($downloadUrl, [], 'GET');
+
+ $client = \OC::$server->getHTTPClientService()->newClient();
+ try {
+ $tmpFile = \OC::$server->getTempManager()->getTemporaryFile();
+ $client->get($downloadUrl, [
+ 'headers' => $headers,
+ 'save_to' => $tmpFile,
+ ]);
+ } catch (RequestException $e) {
+ if (!is_null($e->getResponse())) {
+ if ($e->getResponse()->getStatusCode() === 404) {
+ return false;
+ } else {
+ throw $e;
+ }
+ } else {
+ throw $e;
+ }
+ }
+
return fopen($tmpFile, 'r');
} catch (\Exception $exception) {
\OCP\Util::writeLog('files_external', $exception->getMessage(), \OCP\Util::ERROR);