public function getDocument(Path $path, Request $request, TokenInfo $tokenInfo = null)
 {
     if (null !== $tokenInfo) {
         if ($path->getUserId() !== $tokenInfo->getUserId()) {
             throw new ForbiddenException('path does not match authorized subject');
         }
         if (!$this->hasReadScope($tokenInfo->getScope(), $path->getModuleName())) {
             throw new ForbiddenException('path does not match authorized scope');
         }
     }
     $documentVersion = $this->remoteStorage->getVersion($path);
     if (null === $documentVersion) {
         throw new NotFoundException(sprintf('document "%s" not found', $path->getPath()));
     }
     $requestedVersion = $this->stripQuotes($request->getHeader('If-None-Match'));
     $documentContentType = $this->remoteStorage->getContentType($path);
     if (null !== $requestedVersion) {
         if (in_array($documentVersion, $requestedVersion)) {
             $response = new Response(304, $documentContentType);
             $response->setHeader('ETag', '"' . $documentVersion . '"');
             return $response;
         }
     }
     $rsr = new Response(200, $documentContentType);
     $rsr->setHeader('ETag', '"' . $documentVersion . '"');
     if ('development' !== $this->options['server_mode']) {
         $rsr->setHeader('Accept-Ranges', 'bytes');
     }
     if ('GET' === $request->getMethod()) {
         if ('development' === $this->options['server_mode']) {
             // use body
             $rsr->setBody(file_get_contents($this->remoteStorage->getDocument($path, $requestedVersion)));
         } else {
             // use X-SendFile
             $rsr->setFile($this->remoteStorage->getDocument($path, $requestedVersion));
         }
     }
     return $rsr;
 }