예제 #1
0
 public function testChainability()
 {
     $lastModified = new \DateTime(null, new \DateTimeZone('GMT'));
     $lastModified->setTimestamp(1);
     $this->childResponse->setEtag('hi')->setStatus(Http::STATUS_NOT_FOUND)->setLastModified($lastModified)->cacheFor(33)->addHeader('hello', 'world');
     $headers = $this->childResponse->getHeaders();
     $this->assertEquals('world', $headers['hello']);
     $this->assertEquals(Http::STATUS_NOT_FOUND, $this->childResponse->getStatus());
     $this->assertEquals('hi', $this->childResponse->getEtag());
     $this->assertEquals('Thu, 01 Jan 1970 00:00:01 +0000', $headers['Last-Modified']);
     $this->assertEquals('max-age=33, must-revalidate', $headers['Cache-Control']);
 }
예제 #2
0
 public function render()
 {
     if (parent::getStatus() === Http::STATUS_NOT_FOUND) {
         return '';
     }
     $info = $this->view->getFileInfo($this->path);
     $this->ETag = $info['etag'];
     $content = $this->view->file_get_contents($this->path);
     $data = \OCA\Documents\Filter::read($content, $info['mimetype']);
     $size = strlen($data['content']);
     if (isset($this->request->server['HTTP_RANGE']) && !is_null($this->request->server['HTTP_RANGE'])) {
         $isValidRange = preg_match('/^bytes=\\d*-\\d*(,\\d*-\\d*)*$/', $this->request->server['HTTP_RANGE']);
         if (!$isValidRange) {
             return $this->sendRangeNotSatisfiable($size);
         }
         $ranges = explode(',', substr($this->request->server['HTTP_RANGE'], 6));
         foreach ($ranges as $range) {
             $parts = explode('-', $range);
             if ($parts[0] === '' && $parts[1] == '') {
                 $this->sendNotSatisfiable($size);
             }
             if ($parts[0] === '') {
                 $start = $size - $parts[1];
                 $end = $size - 1;
             } else {
                 $start = $parts[0];
                 $end = $parts[1] === '' ? $size - 1 : $parts[1];
             }
             if ($start > $end) {
                 $this->sendNotSatisfiable($size);
             }
             $buffer = substr($data['content'], $start, $end - $start);
             $md5Sum = md5($buffer);
             // send the headers and data
             $this->addHeader('Content-Length', $end - $start);
             $this->addHeader('Content-md5', $md5Sum);
             $this->addHeader('Accept-Ranges', 'bytes');
             $this->addHeader('Content-Range', 'bytes ' . $start . '-' . $end . '/' . $size);
             $this->addHeader('Connection', 'close');
             $this->addHeader('Content-Type', $data['mimetype']);
             $this->addContentDispositionHeader();
             return $buffer;
         }
     }
     $this->addHeader('Content-Type', $data['mimetype']);
     $this->addContentDispositionHeader();
     $this->addHeader('Content-Length', $size);
     return $data['content'];
 }