xref: /plugin/davcal/vendor/sabre/dav/tests/Sabre/DAV/ServerRangeTest.php (revision a1a3b6794e0e143a4a8b51d3185ce2d339be61ab)
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