2013-10-21 22:46:31 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace Sabre\DAV;
|
|
|
|
|
|
|
|
use Sabre\HTTP;
|
|
|
|
|
|
|
|
require_once 'Sabre/HTTP/ResponseMock.php';
|
|
|
|
|
|
|
|
class ServerPreconditionsTest extends \PHPUnit_Framework_TestCase {
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @expectedException Sabre\DAV\Exception\PreconditionFailed
|
|
|
|
*/
|
|
|
|
function testIfMatchNoNode() {
|
|
|
|
|
|
|
|
$root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
|
|
|
|
$server = new Server($root);
|
2016-05-11 00:26:44 +00:00
|
|
|
$httpRequest = new HTTP\Request('GET', '/bar', ['If-Match' => '*']);
|
|
|
|
$httpResponse = new HTTP\Response();
|
|
|
|
$server->checkPreconditions($httpRequest, $httpResponse);
|
2013-10-21 22:46:31 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*/
|
|
|
|
function testIfMatchHasNode() {
|
|
|
|
|
|
|
|
$root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
|
|
|
|
$server = new Server($root);
|
2016-05-11 00:26:44 +00:00
|
|
|
$httpRequest = new HTTP\Request('GET', '/foo', ['If-Match' => '*']);
|
|
|
|
$httpResponse = new HTTP\Response();
|
|
|
|
$this->assertTrue($server->checkPreconditions($httpRequest, $httpResponse));
|
2013-10-21 22:46:31 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @expectedException Sabre\DAV\Exception\PreconditionFailed
|
|
|
|
*/
|
|
|
|
function testIfMatchWrongEtag() {
|
|
|
|
|
|
|
|
$root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
|
|
|
|
$server = new Server($root);
|
2016-05-11 00:26:44 +00:00
|
|
|
$httpRequest = new HTTP\Request('GET', '/foo', ['If-Match' => '1234']);
|
|
|
|
$httpResponse = new HTTP\Response();
|
|
|
|
$server->checkPreconditions($httpRequest, $httpResponse);
|
2013-10-21 22:46:31 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*/
|
|
|
|
function testIfMatchCorrectEtag() {
|
|
|
|
|
|
|
|
$root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
|
|
|
|
$server = new Server($root);
|
2016-05-11 00:26:44 +00:00
|
|
|
$httpRequest = new HTTP\Request('GET', '/foo', ['If-Match' => '"abc123"']);
|
|
|
|
$httpResponse = new HTTP\Response();
|
|
|
|
$this->assertTrue($server->checkPreconditions($httpRequest, $httpResponse));
|
2013-10-21 22:46:31 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Evolution sometimes uses \" instead of " for If-Match headers.
|
|
|
|
*
|
|
|
|
* @depends testIfMatchCorrectEtag
|
|
|
|
*/
|
|
|
|
function testIfMatchEvolutionEtag() {
|
|
|
|
|
|
|
|
$root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
|
|
|
|
$server = new Server($root);
|
2016-05-11 00:26:44 +00:00
|
|
|
$httpRequest = new HTTP\Request('GET', '/foo', ['If-Match' => '\\"abc123\\"']);
|
|
|
|
$httpResponse = new HTTP\Response();
|
|
|
|
$this->assertTrue($server->checkPreconditions($httpRequest, $httpResponse));
|
2013-10-21 22:46:31 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*/
|
|
|
|
function testIfMatchMultiple() {
|
|
|
|
|
|
|
|
$root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
|
|
|
|
$server = new Server($root);
|
2016-05-11 00:26:44 +00:00
|
|
|
$httpRequest = new HTTP\Request('GET', '/foo', ['If-Match' => '"hellothere", "abc123"']);
|
|
|
|
$httpResponse = new HTTP\Response();
|
|
|
|
$this->assertTrue($server->checkPreconditions($httpRequest, $httpResponse));
|
2013-10-21 22:46:31 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*/
|
|
|
|
function testIfNoneMatchNoNode() {
|
|
|
|
|
|
|
|
$root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
|
|
|
|
$server = new Server($root);
|
2016-05-11 00:26:44 +00:00
|
|
|
$httpRequest = new HTTP\Request('GET', '/bar', ['If-None-Match' => '*']);
|
|
|
|
$httpResponse = new HTTP\Response();
|
|
|
|
$this->assertTrue($server->checkPreconditions($httpRequest, $httpResponse));
|
2013-10-21 22:46:31 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @expectedException Sabre\DAV\Exception\PreconditionFailed
|
|
|
|
*/
|
|
|
|
function testIfNoneMatchHasNode() {
|
|
|
|
|
|
|
|
$root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
|
|
|
|
$server = new Server($root);
|
2016-05-11 00:26:44 +00:00
|
|
|
$httpRequest = new HTTP\Request('POST', '/foo', ['If-None-Match' => '*']);
|
|
|
|
$httpResponse = new HTTP\Response();
|
|
|
|
$server->checkPreconditions($httpRequest, $httpResponse);
|
2013-10-21 22:46:31 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*/
|
|
|
|
function testIfNoneMatchWrongEtag() {
|
|
|
|
|
|
|
|
$root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
|
|
|
|
$server = new Server($root);
|
2016-05-11 00:26:44 +00:00
|
|
|
$httpRequest = new HTTP\Request('POST', '/foo', ['If-None-Match' => '"1234"']);
|
|
|
|
$httpResponse = new HTTP\Response();
|
|
|
|
$this->assertTrue($server->checkPreconditions($httpRequest, $httpResponse));
|
2013-10-21 22:46:31 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*/
|
|
|
|
function testIfNoneMatchWrongEtagMultiple() {
|
|
|
|
|
|
|
|
$root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
|
|
|
|
$server = new Server($root);
|
2016-05-11 00:26:44 +00:00
|
|
|
$httpRequest = new HTTP\Request('POST', '/foo', ['If-None-Match' => '"1234", "5678"']);
|
|
|
|
$httpResponse = new HTTP\Response();
|
|
|
|
$this->assertTrue($server->checkPreconditions($httpRequest, $httpResponse));
|
2013-10-21 22:46:31 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @expectedException Sabre\DAV\Exception\PreconditionFailed
|
|
|
|
*/
|
|
|
|
public function testIfNoneMatchCorrectEtag() {
|
|
|
|
|
|
|
|
$root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
|
|
|
|
$server = new Server($root);
|
2016-05-11 00:26:44 +00:00
|
|
|
$httpRequest = new HTTP\Request('POST', '/foo', ['If-None-Match' => '"abc123"']);
|
|
|
|
$httpResponse = new HTTP\Response();
|
|
|
|
$server->checkPreconditions($httpRequest, $httpResponse);
|
2013-10-21 22:46:31 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @expectedException Sabre\DAV\Exception\PreconditionFailed
|
|
|
|
*/
|
|
|
|
public function testIfNoneMatchCorrectEtagMultiple() {
|
|
|
|
|
|
|
|
$root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
|
|
|
|
$server = new Server($root);
|
2016-05-11 00:26:44 +00:00
|
|
|
$httpRequest = new HTTP\Request('POST', '/foo', ['If-None-Match' => '"1234, "abc123"']);
|
|
|
|
$httpResponse = new HTTP\Response();
|
|
|
|
$server->checkPreconditions($httpRequest, $httpResponse);
|
2013-10-21 22:46:31 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*/
|
|
|
|
public function testIfNoneMatchCorrectEtagAsGet() {
|
|
|
|
|
|
|
|
$root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
|
|
|
|
$server = new Server($root);
|
2016-05-11 00:26:44 +00:00
|
|
|
$httpRequest = new HTTP\Request('GET', '/foo', ['If-None-Match' => '"abc123"']);
|
|
|
|
$server->httpResponse = new HTTP\ResponseMock();
|
|
|
|
|
|
|
|
$this->assertFalse($server->checkPreconditions($httpRequest, $server->httpResponse));
|
|
|
|
$this->assertEquals(304, $server->httpResponse->getStatus());
|
|
|
|
$this->assertEquals(['ETag' => ['"abc123"']], $server->httpResponse->getHeaders());
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* This was a test written for issue #515.
|
|
|
|
*/
|
|
|
|
public function testNoneMatchCorrectEtagEnsureSapiSent() {
|
|
|
|
|
|
|
|
$root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
|
|
|
|
$server = new Server($root);
|
|
|
|
$server->sapi = new HTTP\SapiMock();
|
|
|
|
HTTP\SapiMock::$sent = 0;
|
|
|
|
$httpRequest = new HTTP\Request('GET', '/foo', ['If-None-Match' => '"abc123"']);
|
2013-10-21 22:46:31 +00:00
|
|
|
$server->httpRequest = $httpRequest;
|
|
|
|
$server->httpResponse = new HTTP\ResponseMock();
|
|
|
|
|
2016-05-11 00:26:44 +00:00
|
|
|
$server->exec();
|
|
|
|
|
|
|
|
$this->assertFalse($server->checkPreconditions($httpRequest, $server->httpResponse));
|
|
|
|
$this->assertEquals(304, $server->httpResponse->getStatus());
|
|
|
|
$this->assertEquals([
|
|
|
|
'ETag' => ['"abc123"'],
|
|
|
|
'X-Sabre-Version' => [Version::VERSION],
|
|
|
|
], $server->httpResponse->getHeaders());
|
|
|
|
$this->assertEquals(1, HTTP\SapiMock::$sent);
|
2013-10-21 22:46:31 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*/
|
|
|
|
public function testIfModifiedSinceUnModified() {
|
|
|
|
|
|
|
|
$root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
|
|
|
|
$server = new Server($root);
|
2016-05-11 00:26:44 +00:00
|
|
|
$httpRequest = HTTP\Sapi::createFromServerArray(array(
|
2013-10-21 22:46:31 +00:00
|
|
|
'HTTP_IF_MODIFIED_SINCE' => 'Sun, 06 Nov 1994 08:49:37 GMT',
|
|
|
|
'REQUEST_URI' => '/foo'
|
|
|
|
));
|
|
|
|
$server->httpResponse = new HTTP\ResponseMock();
|
2016-05-11 00:26:44 +00:00
|
|
|
$this->assertFalse($server->checkPreconditions($httpRequest, $server->httpResponse));
|
2013-10-21 22:46:31 +00:00
|
|
|
|
2016-05-11 00:26:44 +00:00
|
|
|
$this->assertEquals(304, $server->httpResponse->status);
|
2013-10-21 22:46:31 +00:00
|
|
|
$this->assertEquals(array(
|
2016-05-11 00:26:44 +00:00
|
|
|
'Last-Modified' => ['Sat, 06 Apr 1985 23:30:00 GMT'],
|
|
|
|
), $server->httpResponse->getHeaders());
|
2013-10-21 22:46:31 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
*/
|
|
|
|
public function testIfModifiedSinceModified() {
|
|
|
|
|
|
|
|
$root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
|
|
|
|
$server = new Server($root);
|
2016-05-11 00:26:44 +00:00
|
|
|
$httpRequest = HTTP\Sapi::createFromServerArray(array(
|
2013-10-21 22:46:31 +00:00
|
|
|
'HTTP_IF_MODIFIED_SINCE' => 'Tue, 06 Nov 1984 08:49:37 GMT',
|
|
|
|
'REQUEST_URI' => '/foo'
|
|
|
|
));
|
2016-05-11 00:26:44 +00:00
|
|
|
|
|
|
|
$httpResponse = new HTTP\ResponseMock();
|
|
|
|
$this->assertTrue($server->checkPreconditions($httpRequest, $httpResponse));
|
2013-10-21 22:46:31 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*/
|
|
|
|
public function testIfModifiedSinceInvalidDate() {
|
|
|
|
|
|
|
|
$root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
|
|
|
|
$server = new Server($root);
|
2016-05-11 00:26:44 +00:00
|
|
|
$httpRequest = HTTP\Sapi::createFromServerArray(array(
|
2013-10-21 22:46:31 +00:00
|
|
|
'HTTP_IF_MODIFIED_SINCE' => 'Your mother',
|
|
|
|
'REQUEST_URI' => '/foo'
|
|
|
|
));
|
2016-05-11 00:26:44 +00:00
|
|
|
$httpResponse = new HTTP\ResponseMock();
|
2013-10-21 22:46:31 +00:00
|
|
|
|
|
|
|
// Invalid dates must be ignored, so this should return true
|
2016-05-11 00:26:44 +00:00
|
|
|
$this->assertTrue($server->checkPreconditions($httpRequest, $httpResponse));
|
2013-10-21 22:46:31 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*/
|
|
|
|
public function testIfModifiedSinceInvalidDate2() {
|
|
|
|
|
|
|
|
$root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
|
|
|
|
$server = new Server($root);
|
2016-05-11 00:26:44 +00:00
|
|
|
$httpRequest = HTTP\Sapi::createFromServerArray(array(
|
2013-10-21 22:46:31 +00:00
|
|
|
'HTTP_IF_MODIFIED_SINCE' => 'Sun, 06 Nov 1994 08:49:37 EST',
|
|
|
|
'REQUEST_URI' => '/foo'
|
|
|
|
));
|
2016-05-11 00:26:44 +00:00
|
|
|
$httpResponse = new HTTP\ResponseMock();
|
|
|
|
$this->assertTrue($server->checkPreconditions($httpRequest, $httpResponse));
|
2013-10-21 22:46:31 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
*/
|
|
|
|
public function testIfUnmodifiedSinceUnModified() {
|
|
|
|
|
|
|
|
$root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
|
|
|
|
$server = new Server($root);
|
2016-05-11 00:26:44 +00:00
|
|
|
$httpRequest = HTTP\Sapi::createFromServerArray(array(
|
2013-10-21 22:46:31 +00:00
|
|
|
'HTTP_IF_UNMODIFIED_SINCE' => 'Sun, 06 Nov 1994 08:49:37 GMT',
|
|
|
|
'REQUEST_URI' => '/foo'
|
|
|
|
));
|
2016-05-11 00:26:44 +00:00
|
|
|
$httpResponse = new HTTP\Response();
|
|
|
|
$this->assertTrue($server->checkPreconditions($httpRequest, $httpResponse));
|
2013-10-21 22:46:31 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @expectedException Sabre\DAV\Exception\PreconditionFailed
|
|
|
|
*/
|
|
|
|
public function testIfUnmodifiedSinceModified() {
|
|
|
|
|
|
|
|
$root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
|
|
|
|
$server = new Server($root);
|
2016-05-11 00:26:44 +00:00
|
|
|
$httpRequest = HTTP\Sapi::createFromServerArray(array(
|
2013-10-21 22:46:31 +00:00
|
|
|
'HTTP_IF_UNMODIFIED_SINCE' => 'Tue, 06 Nov 1984 08:49:37 GMT',
|
|
|
|
'REQUEST_URI' => '/foo'
|
|
|
|
));
|
2016-05-11 00:26:44 +00:00
|
|
|
$httpResponse = new HTTP\ResponseMock();
|
|
|
|
$server->checkPreconditions($httpRequest, $httpResponse);
|
2013-10-21 22:46:31 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*/
|
|
|
|
public function testIfUnmodifiedSinceInvalidDate() {
|
|
|
|
|
|
|
|
$root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
|
|
|
|
$server = new Server($root);
|
2016-05-11 00:26:44 +00:00
|
|
|
$httpRequest = HTTP\Sapi::createFromServerArray(array(
|
2013-10-21 22:46:31 +00:00
|
|
|
'HTTP_IF_UNMODIFIED_SINCE' => 'Sun, 06 Nov 1984 08:49:37 CET',
|
|
|
|
'REQUEST_URI' => '/foo'
|
|
|
|
));
|
2016-05-11 00:26:44 +00:00
|
|
|
$httpResponse = new HTTP\ResponseMock();
|
|
|
|
$this->assertTrue($server->checkPreconditions($httpRequest, $httpResponse));
|
2013-10-21 22:46:31 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
class ServerPreconditionsNode extends File {
|
|
|
|
|
|
|
|
function getETag() {
|
|
|
|
|
|
|
|
return '"abc123"';
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
function getLastModified() {
|
|
|
|
|
|
|
|
/* my birthday & time, I believe */
|
|
|
|
return strtotime('1985-04-07 01:30 +02:00');
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
function getName() {
|
|
|
|
|
|
|
|
return 'foo';
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|