Generate stable etags for local files
This commit is contained in:
parent
9739a25547
commit
283c10f010
|
@ -90,6 +90,7 @@ if (\OC_Util::runningOnWindows()) {
|
||||||
}
|
}
|
||||||
|
|
||||||
public function stat($path) {
|
public function stat($path) {
|
||||||
|
clearstatcache();
|
||||||
$fullPath = $this->datadir . $path;
|
$fullPath = $this->datadir . $path;
|
||||||
$statResult = stat($fullPath);
|
$statResult = stat($fullPath);
|
||||||
if (PHP_INT_SIZE === 4 && !$this->is_dir($path)) {
|
if (PHP_INT_SIZE === 4 && !$this->is_dir($path)) {
|
||||||
|
@ -276,5 +277,25 @@ if (\OC_Util::runningOnWindows()) {
|
||||||
public function isLocal() {
|
public function isLocal() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get the ETag for a file or folder
|
||||||
|
*
|
||||||
|
* @param string $path
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getETag($path) {
|
||||||
|
if ($this->is_file($path)) {
|
||||||
|
$stat = $this->stat($path);
|
||||||
|
return md5(
|
||||||
|
$stat['mtime'] .
|
||||||
|
$stat['ino'] .
|
||||||
|
$stat['dev'] .
|
||||||
|
$stat['size']
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
return parent::getETag($path);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
<?php
|
<?php
|
||||||
/**
|
/**
|
||||||
* ownCloud
|
* ownCloud
|
||||||
*
|
*
|
||||||
* @author Robin Appelman
|
* @author Robin Appelman
|
||||||
* @copyright 2012 Robin Appelman icewind@owncloud.com
|
* @copyright 2012 Robin Appelman icewind@owncloud.com
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||||
* License as published by the Free Software Foundation; either
|
* License as published by the Free Software Foundation; either
|
||||||
* version 3 of the License, or any later version.
|
* version 3 of the License, or any later version.
|
||||||
*
|
*
|
||||||
* This library is distributed in the hope that it will be useful,
|
* This library is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU Affero General Public
|
* You should have received a copy of the GNU Affero General Public
|
||||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Test\Files\Storage;
|
namespace Test\Files\Storage;
|
||||||
|
|
||||||
|
@ -27,13 +27,30 @@ class Local extends Storage {
|
||||||
* @var string tmpDir
|
* @var string tmpDir
|
||||||
*/
|
*/
|
||||||
private $tmpDir;
|
private $tmpDir;
|
||||||
|
|
||||||
public function setUp() {
|
public function setUp() {
|
||||||
$this->tmpDir=\OC_Helper::tmpFolder();
|
$this->tmpDir = \OC_Helper::tmpFolder();
|
||||||
$this->instance=new \OC\Files\Storage\Local(array('datadir'=>$this->tmpDir));
|
$this->instance = new \OC\Files\Storage\Local(array('datadir' => $this->tmpDir));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function tearDown() {
|
public function tearDown() {
|
||||||
\OC_Helper::rmdirr($this->tmpDir);
|
\OC_Helper::rmdirr($this->tmpDir);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testStableEtag() {
|
||||||
|
$this->instance->file_put_contents('test.txt', 'foobar');
|
||||||
|
$etag1 = $this->instance->getETag('test.txt');
|
||||||
|
$etag2 = $this->instance->getETag('test.txt');
|
||||||
|
$this->assertEquals($etag1, $etag2);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testEtagChange() {
|
||||||
|
$this->instance->file_put_contents('test.txt', 'foo');
|
||||||
|
$this->instance->touch('test.txt', time() - 2);
|
||||||
|
$etag1 = $this->instance->getETag('test.txt');
|
||||||
|
$this->instance->file_put_contents('test.txt', 'bar');
|
||||||
|
$etag2 = $this->instance->getETag('test.txt');
|
||||||
|
$this->assertNotEquals($etag1, $etag2);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue