1*a1a3b679SAndreas Boehler<?php 2*a1a3b679SAndreas Boehler 3*a1a3b679SAndreas Boehlernamespace Sabre\DAV; 4*a1a3b679SAndreas Boehleruse Sabre\HTTP; 5*a1a3b679SAndreas Boehler 6*a1a3b679SAndreas Boehlerrequire_once 'Sabre/DAV/AbstractServer.php'; 7*a1a3b679SAndreas Boehler 8*a1a3b679SAndreas Boehlerclass ServerRangeTest extends AbstractServer{ 9*a1a3b679SAndreas Boehler 10*a1a3b679SAndreas Boehler protected function getRootNode() { 11*a1a3b679SAndreas Boehler 12*a1a3b679SAndreas Boehler return new FSExt\Directory(SABRE_TEMPDIR); 13*a1a3b679SAndreas Boehler 14*a1a3b679SAndreas Boehler } 15*a1a3b679SAndreas Boehler 16*a1a3b679SAndreas Boehler function testRange() { 17*a1a3b679SAndreas Boehler 18*a1a3b679SAndreas Boehler $serverVars = [ 19*a1a3b679SAndreas Boehler 'REQUEST_URI' => '/test.txt', 20*a1a3b679SAndreas Boehler 'REQUEST_METHOD' => 'GET', 21*a1a3b679SAndreas Boehler 'HTTP_RANGE' => 'bytes=2-5', 22*a1a3b679SAndreas Boehler ]; 23*a1a3b679SAndreas Boehler $filename = SABRE_TEMPDIR . '/test.txt'; 24*a1a3b679SAndreas Boehler 25*a1a3b679SAndreas Boehler $request = HTTP\Sapi::createFromServerArray($serverVars); 26*a1a3b679SAndreas Boehler $this->server->httpRequest = ($request); 27*a1a3b679SAndreas Boehler $this->server->exec(); 28*a1a3b679SAndreas Boehler 29*a1a3b679SAndreas Boehler $this->assertEquals([ 30*a1a3b679SAndreas Boehler 'X-Sabre-Version' => [Version::VERSION], 31*a1a3b679SAndreas Boehler 'Content-Type' => ['application/octet-stream'], 32*a1a3b679SAndreas Boehler 'Content-Length' => [4], 33*a1a3b679SAndreas Boehler 'Content-Range' => ['bytes 2-5/13'], 34*a1a3b679SAndreas Boehler 'Last-Modified' => [HTTP\Util::toHTTPDate(new \DateTime('@' . filemtime($this->tempDir . '/test.txt')))], 35*a1a3b679SAndreas Boehler 'ETag' => ['"' . sha1(fileinode($filename) . filesize($filename) . filemtime($filename)) . '"'], 36*a1a3b679SAndreas Boehler ], 37*a1a3b679SAndreas Boehler $this->response->getHeaders() 38*a1a3b679SAndreas Boehler ); 39*a1a3b679SAndreas Boehler 40*a1a3b679SAndreas Boehler $this->assertEquals(206, $this->response->status); 41*a1a3b679SAndreas Boehler $this->assertEquals('st c', stream_get_contents($this->response->body, 4)); 42*a1a3b679SAndreas Boehler 43*a1a3b679SAndreas Boehler } 44*a1a3b679SAndreas Boehler 45*a1a3b679SAndreas Boehler /** 46*a1a3b679SAndreas Boehler * @depends testRange 47*a1a3b679SAndreas Boehler */ 48*a1a3b679SAndreas Boehler function testStartRange() { 49*a1a3b679SAndreas Boehler 50*a1a3b679SAndreas Boehler $serverVars = [ 51*a1a3b679SAndreas Boehler 'REQUEST_URI' => '/test.txt', 52*a1a3b679SAndreas Boehler 'REQUEST_METHOD' => 'GET', 53*a1a3b679SAndreas Boehler 'HTTP_RANGE' => 'bytes=2-', 54*a1a3b679SAndreas Boehler ]; 55*a1a3b679SAndreas Boehler $filename = SABRE_TEMPDIR . '/test.txt'; 56*a1a3b679SAndreas Boehler 57*a1a3b679SAndreas Boehler $request = HTTP\Sapi::createFromServerArray($serverVars); 58*a1a3b679SAndreas Boehler $this->server->httpRequest = ($request); 59*a1a3b679SAndreas Boehler $this->server->exec(); 60*a1a3b679SAndreas Boehler 61*a1a3b679SAndreas Boehler $this->assertEquals([ 62*a1a3b679SAndreas Boehler 'X-Sabre-Version' => [Version::VERSION], 63*a1a3b679SAndreas Boehler 'Content-Type' => ['application/octet-stream'], 64*a1a3b679SAndreas Boehler 'Content-Length' => [11], 65*a1a3b679SAndreas Boehler 'Content-Range' => ['bytes 2-12/13'], 66*a1a3b679SAndreas Boehler 'Last-Modified' => [HTTP\Util::toHTTPDate(new \DateTime('@' . filemtime($this->tempDir . '/test.txt')))], 67*a1a3b679SAndreas Boehler 'ETag' => ['"' . sha1(fileinode($filename) . filesize($filename) . filemtime($filename)) . '"'], 68*a1a3b679SAndreas Boehler ], 69*a1a3b679SAndreas Boehler $this->response->getHeaders() 70*a1a3b679SAndreas Boehler ); 71*a1a3b679SAndreas Boehler 72*a1a3b679SAndreas Boehler $this->assertEquals(206, $this->response->status); 73*a1a3b679SAndreas Boehler $this->assertEquals('st contents', stream_get_contents($this->response->body, 11)); 74*a1a3b679SAndreas Boehler 75*a1a3b679SAndreas Boehler } 76*a1a3b679SAndreas Boehler 77*a1a3b679SAndreas Boehler /** 78*a1a3b679SAndreas Boehler * @depends testRange 79*a1a3b679SAndreas Boehler */ 80*a1a3b679SAndreas Boehler function testEndRange() { 81*a1a3b679SAndreas Boehler 82*a1a3b679SAndreas Boehler $serverVars = [ 83*a1a3b679SAndreas Boehler 'REQUEST_URI' => '/test.txt', 84*a1a3b679SAndreas Boehler 'REQUEST_METHOD' => 'GET', 85*a1a3b679SAndreas Boehler 'HTTP_RANGE' => 'bytes=-8', 86*a1a3b679SAndreas Boehler ]; 87*a1a3b679SAndreas Boehler $filename = SABRE_TEMPDIR . '/test.txt'; 88*a1a3b679SAndreas Boehler 89*a1a3b679SAndreas Boehler $request = HTTP\Sapi::createFromServerArray($serverVars); 90*a1a3b679SAndreas Boehler $this->server->httpRequest = ($request); 91*a1a3b679SAndreas Boehler $this->server->exec(); 92*a1a3b679SAndreas Boehler 93*a1a3b679SAndreas Boehler $this->assertEquals([ 94*a1a3b679SAndreas Boehler 'X-Sabre-Version' => [Version::VERSION], 95*a1a3b679SAndreas Boehler 'Content-Type' => ['application/octet-stream'], 96*a1a3b679SAndreas Boehler 'Content-Length' => [8], 97*a1a3b679SAndreas Boehler 'Content-Range' => ['bytes 5-12/13'], 98*a1a3b679SAndreas Boehler 'Last-Modified' => [HTTP\Util::toHTTPDate(new \DateTime('@' . filemtime($this->tempDir . '/test.txt')))], 99*a1a3b679SAndreas Boehler 'ETag' => ['"' . sha1(fileinode($filename) . filesize($filename) . filemtime($filename)) . '"'], 100*a1a3b679SAndreas Boehler ], 101*a1a3b679SAndreas Boehler $this->response->getHeaders() 102*a1a3b679SAndreas Boehler ); 103*a1a3b679SAndreas Boehler 104*a1a3b679SAndreas Boehler $this->assertEquals(206, $this->response->status); 105*a1a3b679SAndreas Boehler $this->assertEquals('contents', stream_get_contents($this->response->body, 8)); 106*a1a3b679SAndreas Boehler 107*a1a3b679SAndreas Boehler } 108*a1a3b679SAndreas Boehler 109*a1a3b679SAndreas Boehler /** 110*a1a3b679SAndreas Boehler * @depends testRange 111*a1a3b679SAndreas Boehler */ 112*a1a3b679SAndreas Boehler function testTooHighRange() { 113*a1a3b679SAndreas Boehler 114*a1a3b679SAndreas Boehler $serverVars = [ 115*a1a3b679SAndreas Boehler 'REQUEST_URI' => '/test.txt', 116*a1a3b679SAndreas Boehler 'REQUEST_METHOD' => 'GET', 117*a1a3b679SAndreas Boehler 'HTTP_RANGE' => 'bytes=100-200', 118*a1a3b679SAndreas Boehler ]; 119*a1a3b679SAndreas Boehler 120*a1a3b679SAndreas Boehler $request = HTTP\Sapi::createFromServerArray($serverVars); 121*a1a3b679SAndreas Boehler $this->server->httpRequest = ($request); 122*a1a3b679SAndreas Boehler $this->server->exec(); 123*a1a3b679SAndreas Boehler 124*a1a3b679SAndreas Boehler $this->assertEquals(416, $this->response->status); 125*a1a3b679SAndreas Boehler 126*a1a3b679SAndreas Boehler } 127*a1a3b679SAndreas Boehler 128*a1a3b679SAndreas Boehler /** 129*a1a3b679SAndreas Boehler * @depends testRange 130*a1a3b679SAndreas Boehler */ 131*a1a3b679SAndreas Boehler function testCrazyRange() { 132*a1a3b679SAndreas Boehler 133*a1a3b679SAndreas Boehler $serverVars = [ 134*a1a3b679SAndreas Boehler 'REQUEST_URI' => '/test.txt', 135*a1a3b679SAndreas Boehler 'REQUEST_METHOD' => 'GET', 136*a1a3b679SAndreas Boehler 'HTTP_RANGE' => 'bytes=8-4', 137*a1a3b679SAndreas Boehler ]; 138*a1a3b679SAndreas Boehler 139*a1a3b679SAndreas Boehler $request = HTTP\Sapi::createFromServerArray($serverVars); 140*a1a3b679SAndreas Boehler $this->server->httpRequest = ($request); 141*a1a3b679SAndreas Boehler $this->server->exec(); 142*a1a3b679SAndreas Boehler 143*a1a3b679SAndreas Boehler $this->assertEquals(416, $this->response->status); 144*a1a3b679SAndreas Boehler 145*a1a3b679SAndreas Boehler } 146*a1a3b679SAndreas Boehler 147*a1a3b679SAndreas Boehler /** 148*a1a3b679SAndreas Boehler * @depends testRange 149*a1a3b679SAndreas Boehler */ 150*a1a3b679SAndreas Boehler function testIfRangeEtag() { 151*a1a3b679SAndreas Boehler 152*a1a3b679SAndreas Boehler $node = $this->server->tree->getNodeForPath('test.txt'); 153*a1a3b679SAndreas Boehler 154*a1a3b679SAndreas Boehler $serverVars = [ 155*a1a3b679SAndreas Boehler 'REQUEST_URI' => '/test.txt', 156*a1a3b679SAndreas Boehler 'REQUEST_METHOD' => 'GET', 157*a1a3b679SAndreas Boehler 'HTTP_RANGE' => 'bytes=2-5', 158*a1a3b679SAndreas Boehler 'HTTP_IF_RANGE' => $node->getETag(), 159*a1a3b679SAndreas Boehler ]; 160*a1a3b679SAndreas Boehler $filename = SABRE_TEMPDIR . '/test.txt'; 161*a1a3b679SAndreas Boehler 162*a1a3b679SAndreas Boehler $request = HTTP\Sapi::createFromServerArray($serverVars); 163*a1a3b679SAndreas Boehler $this->server->httpRequest = ($request); 164*a1a3b679SAndreas Boehler $this->server->exec(); 165*a1a3b679SAndreas Boehler 166*a1a3b679SAndreas Boehler $this->assertEquals([ 167*a1a3b679SAndreas Boehler 'X-Sabre-Version' => [Version::VERSION], 168*a1a3b679SAndreas Boehler 'Content-Type' => ['application/octet-stream'], 169*a1a3b679SAndreas Boehler 'Content-Length' => [4], 170*a1a3b679SAndreas Boehler 'Content-Range' => ['bytes 2-5/13'], 171*a1a3b679SAndreas Boehler 'Last-Modified' => [HTTP\Util::toHTTPDate(new \DateTime('@' . filemtime($this->tempDir . '/test.txt')))], 172*a1a3b679SAndreas Boehler 'ETag' => ['"' . sha1(fileinode($filename) . filesize($filename) . filemtime($filename)) . '"'], 173*a1a3b679SAndreas Boehler ], 174*a1a3b679SAndreas Boehler $this->response->getHeaders() 175*a1a3b679SAndreas Boehler ); 176*a1a3b679SAndreas Boehler 177*a1a3b679SAndreas Boehler $this->assertEquals(206, $this->response->status); 178*a1a3b679SAndreas Boehler $this->assertEquals('st c', stream_get_contents($this->response->body, 4)); 179*a1a3b679SAndreas Boehler 180*a1a3b679SAndreas Boehler } 181*a1a3b679SAndreas Boehler 182*a1a3b679SAndreas Boehler /** 183*a1a3b679SAndreas Boehler * @depends testRange 184*a1a3b679SAndreas Boehler */ 185*a1a3b679SAndreas Boehler function testIfRangeEtagIncorrect() { 186*a1a3b679SAndreas Boehler 187*a1a3b679SAndreas Boehler $node = $this->server->tree->getNodeForPath('test.txt'); 188*a1a3b679SAndreas Boehler 189*a1a3b679SAndreas Boehler $serverVars = [ 190*a1a3b679SAndreas Boehler 'REQUEST_URI' => '/test.txt', 191*a1a3b679SAndreas Boehler 'REQUEST_METHOD' => 'GET', 192*a1a3b679SAndreas Boehler 'HTTP_RANGE' => 'bytes=2-5', 193*a1a3b679SAndreas Boehler 'HTTP_IF_RANGE' => $node->getETag() . 'blabla', 194*a1a3b679SAndreas Boehler ]; 195*a1a3b679SAndreas Boehler $filename = SABRE_TEMPDIR . '/test.txt'; 196*a1a3b679SAndreas Boehler 197*a1a3b679SAndreas Boehler $request = HTTP\Sapi::createFromServerArray($serverVars); 198*a1a3b679SAndreas Boehler $this->server->httpRequest = ($request); 199*a1a3b679SAndreas Boehler $this->server->exec(); 200*a1a3b679SAndreas Boehler 201*a1a3b679SAndreas Boehler $this->assertEquals([ 202*a1a3b679SAndreas Boehler 'X-Sabre-Version' => [Version::VERSION], 203*a1a3b679SAndreas Boehler 'Content-Type' => ['application/octet-stream'], 204*a1a3b679SAndreas Boehler 'Content-Length' => [13], 205*a1a3b679SAndreas Boehler 'Last-Modified' => [HTTP\Util::toHTTPDate(new \DateTime('@' . filemtime($this->tempDir . '/test.txt')))], 206*a1a3b679SAndreas Boehler 'ETag' => ['"' . sha1(fileinode($filename) . filesize($filename) . filemtime($filename)) . '"'], 207*a1a3b679SAndreas Boehler ], 208*a1a3b679SAndreas Boehler $this->response->getHeaders() 209*a1a3b679SAndreas Boehler ); 210*a1a3b679SAndreas Boehler 211*a1a3b679SAndreas Boehler $this->assertEquals(200, $this->response->status); 212*a1a3b679SAndreas Boehler $this->assertEquals('Test contents', stream_get_contents($this->response->body)); 213*a1a3b679SAndreas Boehler 214*a1a3b679SAndreas Boehler } 215*a1a3b679SAndreas Boehler 216*a1a3b679SAndreas Boehler /** 217*a1a3b679SAndreas Boehler * @depends testRange 218*a1a3b679SAndreas Boehler */ 219*a1a3b679SAndreas Boehler function testIfRangeModificationDate() { 220*a1a3b679SAndreas Boehler 221*a1a3b679SAndreas Boehler $node = $this->server->tree->getNodeForPath('test.txt'); 222*a1a3b679SAndreas Boehler 223*a1a3b679SAndreas Boehler $serverVars = [ 224*a1a3b679SAndreas Boehler 'REQUEST_URI' => '/test.txt', 225*a1a3b679SAndreas Boehler 'REQUEST_METHOD' => 'GET', 226*a1a3b679SAndreas Boehler 'HTTP_RANGE' => 'bytes=2-5', 227*a1a3b679SAndreas Boehler 'HTTP_IF_RANGE' => 'tomorrow', 228*a1a3b679SAndreas Boehler ]; 229*a1a3b679SAndreas Boehler $filename = SABRE_TEMPDIR . '/test.txt'; 230*a1a3b679SAndreas Boehler 231*a1a3b679SAndreas Boehler $request = HTTP\Sapi::createFromServerArray($serverVars); 232*a1a3b679SAndreas Boehler $this->server->httpRequest = ($request); 233*a1a3b679SAndreas Boehler $this->server->exec(); 234*a1a3b679SAndreas Boehler 235*a1a3b679SAndreas Boehler $this->assertEquals([ 236*a1a3b679SAndreas Boehler 'X-Sabre-Version' => [Version::VERSION], 237*a1a3b679SAndreas Boehler 'Content-Type' => ['application/octet-stream'], 238*a1a3b679SAndreas Boehler 'Content-Length' => [4], 239*a1a3b679SAndreas Boehler 'Content-Range' => ['bytes 2-5/13'], 240*a1a3b679SAndreas Boehler 'Last-Modified' => [HTTP\Util::toHTTPDate(new \DateTime('@' . filemtime($this->tempDir . '/test.txt')))], 241*a1a3b679SAndreas Boehler 'ETag' => ['"' . sha1(fileinode($filename) . filesize($filename) . filemtime($filename)) . '"'], 242*a1a3b679SAndreas Boehler ], 243*a1a3b679SAndreas Boehler $this->response->getHeaders() 244*a1a3b679SAndreas Boehler ); 245*a1a3b679SAndreas Boehler 246*a1a3b679SAndreas Boehler $this->assertEquals(206, $this->response->status); 247*a1a3b679SAndreas Boehler $this->assertEquals('st c', stream_get_contents($this->response->body, 4)); 248*a1a3b679SAndreas Boehler 249*a1a3b679SAndreas Boehler } 250*a1a3b679SAndreas Boehler 251*a1a3b679SAndreas Boehler /** 252*a1a3b679SAndreas Boehler * @depends testRange 253*a1a3b679SAndreas Boehler */ 254*a1a3b679SAndreas Boehler function testIfRangeModificationDateModified() { 255*a1a3b679SAndreas Boehler 256*a1a3b679SAndreas Boehler $node = $this->server->tree->getNodeForPath('test.txt'); 257*a1a3b679SAndreas Boehler 258*a1a3b679SAndreas Boehler $serverVars = [ 259*a1a3b679SAndreas Boehler 'REQUEST_URI' => '/test.txt', 260*a1a3b679SAndreas Boehler 'REQUEST_METHOD' => 'GET', 261*a1a3b679SAndreas Boehler 'HTTP_RANGE' => 'bytes=2-5', 262*a1a3b679SAndreas Boehler 'HTTP_IF_RANGE' => '-2 years', 263*a1a3b679SAndreas Boehler ]; 264*a1a3b679SAndreas Boehler $filename = SABRE_TEMPDIR . '/test.txt'; 265*a1a3b679SAndreas Boehler 266*a1a3b679SAndreas Boehler $request = HTTP\Sapi::createFromServerArray($serverVars); 267*a1a3b679SAndreas Boehler $this->server->httpRequest = ($request); 268*a1a3b679SAndreas Boehler $this->server->exec(); 269*a1a3b679SAndreas Boehler 270*a1a3b679SAndreas Boehler $this->assertEquals([ 271*a1a3b679SAndreas Boehler 'X-Sabre-Version' => [Version::VERSION], 272*a1a3b679SAndreas Boehler 'Content-Type' => ['application/octet-stream'], 273*a1a3b679SAndreas Boehler 'Content-Length' => [13], 274*a1a3b679SAndreas Boehler 'Last-Modified' => [HTTP\Util::toHTTPDate(new \DateTime('@' . filemtime($this->tempDir . '/test.txt')))], 275*a1a3b679SAndreas Boehler 'ETag' => ['"' . sha1(fileinode($filename) . filesize($filename) . filemtime($filename)) . '"'], 276*a1a3b679SAndreas Boehler ], 277*a1a3b679SAndreas Boehler $this->response->getHeaders() 278*a1a3b679SAndreas Boehler ); 279*a1a3b679SAndreas Boehler 280*a1a3b679SAndreas Boehler $this->assertEquals(200, $this->response->status); 281*a1a3b679SAndreas Boehler $this->assertEquals('Test contents', stream_get_contents($this->response->body)); 282*a1a3b679SAndreas Boehler 283*a1a3b679SAndreas Boehler } 284*a1a3b679SAndreas Boehler} 285