SessionRetriever::fake()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 7
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 1

Importance

Changes 0
Metric Value
eloc 3
c 0
b 0
f 0
dl 0
loc 7
ccs 4
cts 4
cp 1
rs 10
cc 1
nc 1
nop 1
crap 1
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