Skip to content

Commit 91daeec

Browse files
authored
Merge pull request #37 from pdsinterop/fix/file-mime-type
rework: follow file mime if accepted
2 parents 2ce4ca9 + d4d6f87 commit 91daeec

1 file changed

Lines changed: 22 additions & 14 deletions

File tree

src/Server.php

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ private function handle(string $method, string $path, $contents, $request): Resp
175175
break;
176176
case 'GET':
177177
case 'HEAD':
178-
$mime = $this->getRequestedMimeType($request->getHeaderLine("Accept"));
178+
$mime = $this->getRequestedMimeTypes($request->getHeaderLine("Accept"));
179179
$response = $this->handleReadRequest($response, $path, $contents, $mime);
180180
if ($method === 'HEAD') {
181181
$response->getBody()->rewind();
@@ -672,27 +672,29 @@ private function handleUpdateRequest(Response $response, string $path, string $c
672672
return $response;
673673
}
674674

675-
private function getRequestedMimeType($accept)
675+
private function getRequestedMimeTypes($accept)
676676
{
677+
$requestedTypes = [];
678+
677679
// text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
678680
$mimes = explode(",", $accept);
679681
foreach ($mimes as $mime) {
680-
$parts = explode(";", $mime);
681-
$mimeInfo = $parts[0];
682-
switch ($mimeInfo) {
683-
case "text/turtle": // turtle
684-
case "application/ld+json": //json
685-
case "application/rdf+xml": //rdf
686-
return $mimeInfo;
687-
break;
688-
}
682+
$parts = explode(";", $mime);
683+
$mimeInfo = $parts[0];
684+
$requestedTypes[] = $mimeInfo;
689685
}
690-
return '';
686+
return $requestedTypes;
691687
}
692688

693-
private function handleReadRequest(Response $response, string $path, $contents, $mime=''): Response
689+
private function handleReadRequest(Response $response, string $path, $contents, $acceptedMimeTypes=[]): Response
694690
{
695691
$filesystem = $this->filesystem;
692+
if (empty($acceptedMimeTypes)) {
693+
$mime = '';
694+
} else {
695+
$mime = $acceptedMimeTypes[0];
696+
}
697+
696698
if ($path === "/") { // FIXME: this is a patch to make it work for Solid-Nextcloud; we should be able to just list '/';
697699
$contents = $this->listDirectoryAsTurtle($path);
698700
$response->getBody()->write($contents);
@@ -734,7 +736,13 @@ private function handleReadRequest(Response $response, string $path, $contents,
734736
$mimetype = $filesystem->asMime($mime)->getMimetype($path);
735737
}
736738

737-
$contents = $filesystem->asMime($mime)->read($path);
739+
$fileMimeType = $filesystem->asMime('')->getMimetype($path);
740+
if (in_array($fileMimeType, $acceptedMimeTypes)) {
741+
$contents = $filesystem->asMime('')->read($path);
742+
$mimetype = $fileMimeType;
743+
} else {
744+
$contents = $filesystem->asMime($mime)->read($path);
745+
}
738746

739747
if ($contents !== false) {
740748
$response->getBody()->write($contents);

0 commit comments

Comments
 (0)