Merge pull request #11763 from owncloud/stable-etags

Generate stable etags for local files
This commit is contained in:
Robin Appelman 2014-10-27 15:30:30 +01:00
commit 8de287f2ef
2 changed files with 59 additions and 21 deletions

View File

@ -90,6 +90,7 @@ if (\OC_Util::runningOnWindows()) {
}
public function stat($path) {
clearstatcache();
$fullPath = $this->datadir . $path;
$statResult = stat($fullPath);
if (PHP_INT_SIZE === 4 && !$this->is_dir($path)) {
@ -276,5 +277,25 @@ if (\OC_Util::runningOnWindows()) {
public function isLocal() {
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);
}
}
}
}

View File

@ -27,6 +27,7 @@ class Local extends Storage {
* @var string tmpDir
*/
private $tmpDir;
public function setUp() {
$this->tmpDir = \OC_Helper::tmpFolder();
$this->instance = new \OC\Files\Storage\Local(array('datadir' => $this->tmpDir));
@ -35,5 +36,21 @@ class Local extends Storage {
public function tearDown() {
\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);
}
}