Example #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;
 }
Example #2
0
 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);
 }
Example #3
0
 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;
 }
Example #4
0
 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();
 }
Example #5
0
 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;
 }
Example #6
0
 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);
 }
Example #8
0
 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);
 }