Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
90.32% covered (success)
90.32%
28 / 31
50.00% covered (danger)
50.00%
1 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
WebdavController
90.32% covered (success)
90.32%
28 / 31
50.00% covered (danger)
50.00%
1 / 2
3.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
90.00% covered (success)
90.00%
27 / 30
0.00% covered (danger)
0.00%
0 / 1
2.00
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        $sabreRequest = new SabreRequest(
38            $request->getMethod(),
39            (string) $request->getUri()->getPath(),
40            $request->getHeaders(),
41            (string) $request->getBody()
42        );
43
44        $sabreRequest->setHttpVersion($request->getProtocolVersion());
45        $sabreRequest->setRawServerData($request->getServerParams());
46        $sabreResponse = new HTTPResponse();
47
48        $server->httpRequest = $sabreRequest;
49        $server->httpResponse = $sabreResponse;
50        try {
51            ob_start();
52            $server->start();
53        } catch (\Exception $e) {
54            error_log($e->getMessage());
55            $server->emit('exception', [$e]);
56        } finally {
57            $body = ob_get_clean();
58        }
59
60        $psrResponse = new Response(
61            $sabreResponse->getStatus(),
62            $sabreResponse->getHeaders(),
63            $body
64        );
65
66        return $psrResponse;
67    }
68}