Generate stable etags for local files

This commit is contained in:
Robin Appelman 2014-10-24 16:07:45 +02:00
parent 9739a25547
commit 283c10f010
2 changed files with 59 additions and 21 deletions

View File

@ -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);
}
}
} }
} }

View File

@ -27,6 +27,7 @@ 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));
@ -35,5 +36,21 @@ class Local extends Storage {
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);
}
} }