SessionRetriever   A
last analyzed

Complexity

Total Complexity 5

Size/Duplication

Total Lines 57
Duplicated Lines 0 %

Test Coverage

Coverage 40%

Importance

Changes 2
Bugs 0 Features 0
Metric Value
wmc 5
eloc 25
c 2
b 0
f 0
dl 0
loc 57
ccs 10
cts 25
cp 0.4
rs 10

4 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
A fake() 0 7 1
A insecure() 0 5 1
A retrieve() 0 25 2
1
<?php declare(strict_types=1);
2
3
namespace CustomerGauge\Session;
4
5
final class SessionRetriever
6
{
7
    private $path;
8
9
    private $domain;
10
11
    private $secure = true;
12
13
    private $session = null;
14
15 2
    public function __construct(string $path, string $domain)
16
    {
17 2
        $this->path = $path;
18 2
        $this->domain = $domain;
19
    }
20
21 2
    public static function fake(array $session): self
22
    {
23 2
        $instance = new self('', '');
24
25 2
        $instance->session = $session;
26
27 2
        return $instance;
28
    }
29
30
    public function insecure(): self
31
    {
32
        $this->secure = false;
33
34
        return $this;
35
    }
36
37 2
    public function retrieve(): array
38
    {
39 2
        if ($this->session !== null) {
40 2
            return $this->session;
41
        }
42
43
        ini_set('session.gc_maxlifetime', '28800');
44
        ini_set('session.save_handler', 'redis');
45
        ini_set('session.save_path', $this->path);
46
        ini_set('session.cookie_domain', $this->domain);
47
        ini_set('session.cookie_secure', (string) $this->secure);
48
        ini_set('session.cookie_httponly', '1');
49
        ini_set('session.cookie_samesite', 'Lax');
50
51
        // When AWS Elasticache DNS resolution fails, PHP throws an error
52
        // session_start(): php_network_getaddresses: getaddrinfo failed: Name or service not known
53
        // This error is happening on 0.02% of our requests and AWS treat it as transient network
54
        // issues. Retrying before giving up might mitigate the problem.
55
        retry(3, function () {
56
            session_start();
57
        });
58
59
        $this->session = $_SESSION;
60
61
        return $this->session;
62
    }
63
}
64