Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
92.86% covered (success)
92.86%
39 / 42
50.00% covered (danger)
50.00%
1 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
WebdavController
92.86% covered (success)
92.86%
39 / 42
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
92.68% covered (success)
92.68%
38 / 41
0.00% covered (danger)
0.00%
0 / 1
3.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(
32                $request,
33                [
34                    ContextConstants::WEBDAV => true,
35                    ContextConstants::RAW_CONTENTS => [],
36                ]
37            );
38        $filesystem = $this->apieFilesystemFactory->create($apieContext);
39        $server = new Server(new ApieDirectory($filesystem->rootFolder));
40        $server->debugExceptions = $this->debug;
41        $server->setBaseUri('/webdav');
42        $server->addPlugin(new Plugin()); // Optional browser UI
43        $uri = $request->getUri();
44        $path = $uri->getPath();
45        $query = $uri->getQuery();
46        if ($query !== '') {
47            $path .= '/?' . $query;
48        }
49        $sabreRequest = new SabreRequest(
50            $request->getMethod(),
51            $path,
52            $request->getHeaders(),
53            (string) $request->getBody()
54        );
55
56        $sabreRequest->setHttpVersion($request->getProtocolVersion());
57        $sabreRequest->setRawServerData($request->getServerParams());
58        $sabreResponse = new HTTPResponse();
59
60        $server->httpRequest = $sabreRequest;
61        $server->httpResponse = $sabreResponse;
62        try {
63            ob_start();
64            $server->start();
65        } catch (\Exception $e) {
66            error_log($e->getMessage());
67            $server->emit('exception', [$e]);
68        } finally {
69            $body = ob_get_clean();
70        }
71
72        $psrResponse = new Response(
73            $sabreResponse->getStatus(),
74            $sabreResponse->getHeaders(),
75            $body
76        );
77
78        return $psrResponse;
79    }
80}