public function putDocument(Request $request, TokenInfo $tokenInfo) { $path = new Path($request->getUrl()->getPathInfo()); if ($path->getUserId() !== $tokenInfo->getUserId()) { throw new ForbiddenException('path does not match authorized subject'); } if (!$this->hasWriteScope($tokenInfo->getScope(), $path->getModuleName())) { throw new ForbiddenException('path does not match authorized scope'); } $ifMatch = $this->stripQuotes($request->getHeader('If-Match')); $ifNoneMatch = $this->stripQuotes($request->getHeader('If-None-Match')); $documentVersion = $this->remoteStorage->getVersion($path); if (null !== $ifMatch && !in_array($documentVersion, $ifMatch)) { throw new PreconditionFailedException('version mismatch'); } if (null !== $ifNoneMatch && in_array('*', $ifNoneMatch) && null !== $documentVersion) { throw new PreconditionFailedException('document already exists'); } $x = $this->remoteStorage->putDocument($path, $request->getHeader('Content-Type'), $request->getBody(), $ifMatch, $ifNoneMatch); // we have to get the version again after the PUT $documentVersion = $this->remoteStorage->getVersion($path); $rsr = new Response(); $rsr->setHeader('ETag', '"' . $documentVersion . '"'); $rsr->setBody($x); return $rsr; }