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; }
protected function performMove(ResourceInterface $resource, $destination, $overwrite, &$replaced, StorageInterface $storage) { $parts = explode('/', $destination); $name = array_pop($parts); try { $parent = $storage->findResource(implode('/', $parts)); } catch (\OutOfBoundsException $e) { throw new WebDavException(WebDav::CODE_CONFLICT); } if (!$parent->isCollection()) { throw new WebDavException(WebDav::CODE_CONFLICT); } try { $target = $storage->findResource($destination); if ($resource->getPath() == $target->getPath()) { throw new WebDavException(WebDav::CODE_FORBIDDEN); } if (!$overwrite) { throw new WebDavException(WebDav::CODE_PRECONDITION_FAILED); } $storage->deleteResource($target); $replaced = true; } catch (\OutOfBoundsException $e) { } return $storage->moveResource($resource, $parent, $name); }
public function handle($path, Uri $baseUri, HttpRequest $request, StorageInterface $storage) { if ($request->getMethod() != WebDav::METHOD_PROPFIND) { return; } $resource = $storage->findResource($path); $propfind = $this->parseRequest($request); if (!$resource->isCollection() && !$propfind->getDepth()->isDepth0()) { throw new BadRequestException(); } $response = $this->buildResponse($resource, $baseUri, $propfind, $storage); // Populate DAV header in order to improve iCal support. $event = new PopulateOptionsEvent($resource); $this->dispatcher->notify($event); $response->setHeader('DAV', implode(', ', $event->features)); return $response; }
public function handle($path, Uri $baseUri, HttpRequest $request, StorageInterface $storage) { if ($request->getMethod() != WebDav::METHOD_REPORT) { return; } try { $resource = $storage->findResource($path); } catch (\OutOfBoundsException $e) { throw new NotFoundException($e); } try { $xml = (new XmlDocumentBuilder())->buildFromSource($request->getContents()); } catch (XmlParseException $e) { throw new BadRequestException($e); } $name = new XmlName($xml->documentElement); foreach ($this->generators as $generator) { if ($generator->getReportName() == $name && $generator->isSupported($resource)) { return $generator->generateReport($xml->documentElement, $resource, $baseUri, $request, $this->dispatcher); } } throw new UnsupportedReportException(); }
public function handle($path, Uri $baseUri, HttpRequest $request, StorageInterface $storage) { if (!$request->isPut()) { return; } if ($request->hasHeader('Content-Range')) { throw new BadRequestException(); } $stream = $request->hasEntity() ? $request->getEntity()->getInputStream() : new StringStream(); $created = false; $storage->beginTransaction(); try { try { $resource = $storage->findResource($path); if ($resource->isCollection()) { throw new MethodNotAllowedException(); } $resource = $storage->updateResource($resource, $stream); } catch (\OutOfBoundsException $e) { $parts = explode('/', $path); $name = array_pop($parts); try { $parent = $storage->findResource(implode('/', $parts)); } catch (\OutOfBoundsException $ex) { throw new WebDavException(WebDav::CODE_CONFLICT, $ex); } if (!$parent->isCollection()) { throw new WebDavException(WebDav::CODE_CONFLICT); } $resource = $storage->createResource($parent, $name, $stream); $created = true; } } catch (\Exception $e) { $storage->rollBack(); throw $e; } $storage->commit(); $response = new HttpResponse(empty($created) ? WebDav::CODE_NO_CONTENT : WebDav::CODE_CREATED); $response->setHeader('ETag', $resource->getEtag()); return $response; }
public function handle($path, Uri $baseUri, HttpRequest $request, StorageInterface $storage) { if ($request->getMethod() != WebDav::METHOD_PROPPATCH) { return; } $resource = $storage->findResource($path); $proppatch = $this->parseBody($request); $storage->beginTransaction(); try { $proppatch->applyOperations($resource); } catch (\Exception $e) { $storage->rollBack(); throw $e; } $storage->commit(); return $this->buildProppatchResponse($proppatch, $request, $storage); }
public function handle($path, Uri $baseUri, HttpRequest $request, StorageInterface $storage) { if ($request->getMethod() != WebDav::METHOD_MKCOL) { return; } try { $storage->findResource($path); // Collection is already mapped... throw new MethodNotAllowedException(); } catch (\OutOfBoundsException $e) { } $parts = explode('/', $path); $name = array_pop($parts); try { $parent = $storage->findResource(implode('/', $parts)); } catch (\OutOfBoundsException $e) { throw new WebDavException(WebDav::CODE_CONFLICT); } $proppatch = $this->parseBody($request); $storage->beginTransaction(); try { $resource = $storage->createCollection($parent, $name); $success = true; if ($proppatch !== NULL) { $proppatch->applyOperations($resource); } } catch (\Exception $e) { $storage->rollBack(); throw $e; } $storage->commit(); if ($success) { return new HttpResponse(WebDav::CODE_CREATED); } $builder = new MakeCollectionResponseBuilder($proppatch); return $builder->buildResponse(WebDav::CODE_FORBIDDEN); }
public function handle($path, Uri $baseUri, HttpRequest $request, StorageInterface $storage) { if (!$request->isDelete()) { return; } $resource = $storage->findResource($path); if ($resource->isCollection() && $request->hasHeader('Depth')) { $depth = $request->getHeader('Depth', 'infinity'); if ($depth != 'infinity') { throw new BadRequestException(); } } $storage->beginTransaction(); try { $storage->deleteResource($resource); } catch (\Exception $e) { $storage->rollBack(); throw $e; } $storage->commit(); return new HttpResponse(WebDav::CODE_NO_CONTENT); }