Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
91.67% covered (success)
91.67%
33 / 36
50.00% covered (danger)
50.00%
1 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
WebdavController
91.67% covered (success)
91.67%
33 / 36
50.00% covered (danger)
50.00%
1 / 2
4.01
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 __invoke
91.43% covered (success)
91.43%
32 / 35
0.00% covered (danger)
0.00%
0 / 1
3.01
1<?php
2namespace Apie\Webdav\Controller;
3
4use Apie\ApieFileSystem\ApieFilesystemFactory;
5use Apie\Core\ContextBuilders\ContextBuilderFactory;
6use Apie\Core\ContextConstants;
7use Apie\Webdav\Dav\ApieDirectory;
8use Nyholm\Psr7\Response;
9use Psr\Http\Message\ResponseInterface;
10use Psr\Http\Message\ServerRequestInterface;
11use Sabre\DAV\Browser\Plugin;
12use Sabre\DAV\Server;
13use Sabre\HTTP\Request as SabreRequest;
14use Sabre\HTTP\Response as HTTPResponse;
15
16/**
17 * PSR-15 compatible WebDAV controller.
18 */
19class WebdavController
20{
21    public function __construct(
22        private readonly ApieFilesystemFactory $apieFilesystemFactory,
23        private readonly ContextBuilderFactory $contextBuilderFactory,
24        private readonly bool $debug = false,
25    ) {
26    }
27
28    public function __invoke(ServerRequestInterface $request): ResponseInterface
29    {
30        $apieContext = $this->contextBuilderFactory
31            ->createFromRequest($request, [ContextConstants::WEBDAV => true, ContextConstants::RAW_CONTENTS => []]);
32        $filesystem = $this->apieFilesystemFactory->create($apieContext);
33        $server = new Server(new ApieDirectory($filesystem->rootFolder));
34        $server->debugExceptions = $this->debug;
35        $server->setBaseUri('/webdav');
36        $server->addPlugin(new Plugin()); // Optional browser UI
37        $uri = $request->getUri();
38        $path = $uri->getPath();
39        $query = $uri->getQuery();
40        if ($query !== '') {
41            $path .= '/?' . $query;
42        }
43        $sabreRequest = new SabreRequest(
44            $request->getMethod(),
45            $path,
46            $request->getHeaders(),
47            (string) $request->getBody()
48        );
49
50        $sabreRequest->setHttpVersion($request->getProtocolVersion());
51        $sabreRequest->setRawServerData($request->getServerParams());
52        $sabreResponse = new HTTPResponse();
53
54        $server->httpRequest = $sabreRequest;
55        $server->httpResponse = $sabreResponse;
56        try {
57            ob_start();
58            $server->start();
59        } catch (\Exception $e) {
60            error_log($e->getMessage());
61            $server->emit('exception', [$e]);
62        } finally {
63            $body = ob_get_clean();
64        }
65
66        $psrResponse = new Response(
67            $sabreResponse->getStatus(),
68            $sabreResponse->getHeaders(),
69            $body
70        );
71
72        return $psrResponse;
73    }
74}