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; }
/** * {@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); }