Пример #1
0
 public function handle($path, Uri $baseUri, HttpRequest $request, StorageInterface $storage)
 {
     if (!$request->isGet() && !$request->isHead()) {
         return;
     }
     try {
         $resource = $storage->findResource($path);
     } catch (\OutOfBoundsException $e) {
         return new HttpResponse(WebDav::CODE_NOT_FOUND);
     }
     if ($resource->isCollection()) {
         return new HttpResponse(WebDav::CODE_NO_CONTENT);
     }
     $cacheControl = new CacheControlHeader();
     $cacheControl->setPrivate(true)->setMustRevalidate(true)->setMaxAge(7200);
     if ($request->isGet() && ($response = $request->evaluatePreconditions($resource->getEtag()))) {
         return $response->setHeader($cacheControl);
     }
     $response = new HttpResponse();
     $response->setHeader($cacheControl);
     $response->setHeader('Content-Type', $resource->getMediaType());
     $response->setHeader('ETag', $resource->getEtag());
     if ($request->isGet()) {
         $response->setEntity($resource->getInputStream());
     }
     return $response;
 }
Пример #2
0
 /**
  * {@inheritDoc}
  */
 public function terminate(HttpRequest $request, HttpResponse $response)
 {
     $this->dispatcher->notify(new SendResponseEvent($request, self::MASTER_REQUEST, $response, $this));
     while (ob_get_level() > 1) {
         ob_end_flush();
     }
     $buffer = ob_get_level() ? ob_get_clean() : '';
     ini_set('default_mimetype', NULL);
     ini_set('default_charset', NULL);
     if ($response->hasEntity() && !$request->isHead()) {
         if ('gzip' == strtolower($response->getHeader('Content-Encoding', ''))) {
             ini_set('zlib.output_compression_level', 1);
             ini_set('zlib.output_compression', 4096);
         } else {
             ob_start(NULL, 4096);
         }
     }
     foreach ($response->getHeaders() as $n => $headers) {
         switch ($n) {
             case 'server':
             case 'connection':
             case 'content-length':
             case 'content-encoding':
             case 'transfer-encoding':
                 continue 2;
         }
         foreach ($headers as $index => $header) {
             header(sprintf('%s: %s', $header[0], $header[1]), $index == 0);
         }
     }
     $statusLine = sprintf('%s %u %s', $response->getProtocol(), $response->getStatus(), $response->getReason());
     header($statusLine, true, $response->getStatus());
     if ($response->hasEntity() && !$request->isHead()) {
         $stream = new UrlStream('php://output', 'wb');
         try {
             $response->getEntity()->send($stream);
         } finally {
             $stream->close();
         }
     }
     if (function_exists('fastcgi_finish_request')) {
         @fastcgi_finish_request();
     }
     $event = new TerminateEvent($request, self::MASTER_REQUEST, $response, $this);
     $event->bufferedContent = $buffer;
     $this->dispatcher->notify($event);
 }