SessionMiddleware::__construct()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 1
dl 0
loc 3
ccs 2
cts 2
cp 1
crap 1
rs 10
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Jasny\Session;
6
7
use Psr\Http\Server\MiddlewareInterface;
8
use Psr\Http\Server\RequestHandlerInterface as RequestHandler;
9
use Psr\Http\Message\ServerRequestInterface as ServerRequest;
10
use Psr\Http\Message\ResponseInterface as Response;
11
12
/**
13
 * Middleware to start a session.
14
 * The session can be mocked by setting the 'session' attribute of the server request.
15
 */
16
class SessionMiddleware implements MiddlewareInterface
17
{
18
    protected SessionInterface $defaultSession;
19
20
    /**
21
     * Class constructor.
22
     */
23 5
    public function __construct(?SessionInterface $session = null)
24
    {
25 5
        $this->defaultSession = $session ?? new GlobalSession();
26 5
    }
27
28
    /**
29
     * Process an incoming server request (PSR-15).
30
     *
31
     * @param ServerRequest  $request
32
     * @param RequestHandler $handler
33
     * @return Response
34
     */
35 3
    public function process(ServerRequest $request, RequestHandler $handler): Response
36
    {
37 3
        return $this->run($request, \Closure::fromCallable([$handler, 'handle']));
38
    }
39
40
    /**
41
     * Get a callback that can be used as double pass middleware.
42
     *
43
     * @return callable(ServerRequest,Response,callable):Response
44
     */
45 2
    public function asDoublePass(): callable
46
    {
47
        return function (ServerRequest $request, Response $response, callable $next): Response {
48 2
            return $this->run($request, fn($request) => $next($request, $response));
49 2
        };
50
    }
51
52
    /**
53
     * @param ServerRequest $request
54
     * @param callable      $handle
55
     * @return Response
56
     */
57 5
    protected function run(ServerRequest $request, callable $handle): Response
58
    {
59 5
        $session = $request->getAttribute('session');
60
61 5
        if ($session !== null && !$session instanceof SessionInterface) {
62 1
            trigger_error("'session' attribute of server request isn't a session object", E_USER_WARNING);
63 1
            return $handle($request);
64
        }
65
66 4
        if ($session === null) {
67 2
            $session = $this->defaultSession;
68 2
            $request = $request->withAttribute('session', $session);
69
        }
70
71 4
        $session->start();
72
73
        try {
74 4
            return $handle($request);
75
        } finally {
76 4
            $session->stop();
77
        }
78
    }
79
}
80