Completed
Pull Request — master (#394)
by Tobias
07:16
created

CookieJar::getHash()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
cc 1
eloc 6
nc 1
nop 1
dl 0
loc 8
ccs 0
cts 0
cp 0
crap 2
rs 10
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Buzz\Middleware\Cookie;
6
7
use Psr\Http\Message\RequestInterface;
8
use Psr\Http\Message\ResponseInterface;
9
10
class CookieJar
11
{
12
    /** @var Cookie[] */
13
    private $cookies = [];
14
15 2
    public function clear(): void
16
    {
17 2
        $this->cookies = [];
18 2
    }
19
20 2
    public function setCookies(array $cookies): void
21
    {
22 2
        $this->cookies = [];
23 2
        foreach ($cookies as $cookie) {
24 1
            $this->addCookie($cookie);
25
        }
26 2
    }
27
28
    /**
29
     * @return Cookie[]
30
     */
31 4
    public function getCookies(): array
32
    {
33 4
        return $this->cookies;
34
    }
35
36
    /**
37
     * Adds a cookie to the current cookie jar.
38
     */
39 4
    public function addCookie(Cookie $cookie): void
40
    {
41 4
        $this->cookies[$this->getHash($cookie)] = $cookie;
42 4
    }
43
44
    /**
45
     * Adds Cookie headers to the supplied request.
46
     */
47 1
    public function addCookieHeaders(RequestInterface $request): RequestInterface
48
    {
49 1
        $cookies = [];
50 1
        foreach ($this->getCookies() as $cookie) {
51 1
            if ($cookie->matchesRequest($request)) {
52
                $cookies[] = $cookie->toCookieHeader();
53
            }
54
        }
55 1
        if ($cookies) {
56
            $request = $request->withAddedHeader('Cookie', implode('; ', $cookies));
57
        }
58
59
        return $request;
60
    }
61 1
62
    /**
63 1
     * Processes Set-Cookie headers from a request/response pair.
64 1
     */
65 1
    public function processSetCookieHeaders(RequestInterface $request, ResponseInterface $response): void
66 1
    {
67
        $host = $request->getUri()->getHost();
68 1
        foreach ($response->getHeader('Set-Cookie') as $header) {
69
            $cookie = new Cookie();
70 1
            $cookie->fromSetCookieHeader($header, $host);
71
            $this->addCookie($cookie);
72
        }
73
    }
74
75 1
    /**
76
     * Removes expired cookies.
77 1
     */
78 1
    public function clearExpiredCookies(): void
79 1
    {
80 1
        $cookies = $this->getCookies();
81
        foreach ($cookies as $i => $cookie) {
82
            if ($cookie->isExpired()) {
83
                unset($cookies[$i]);
84 1
            }
85 1
        }
86 1
87
        $this->clear();
88
        $this->setCookies(array_values($cookies));
89
    }
90
91
    /**
92
     * Create an unique identifier for the cookie. Two cookies with the same identifier
93
     * may have different values.
94
     */
95
    private function getHash(Cookie $cookie): string
96
    {
97
        return sha1(sprintf(
98
            '%s|%s|%s|%s',
99
            $cookie->getName(),
100
            $cookie->getAttribute('domain'),
101
            $cookie->getAttribute('path'),
102
            $cookie->getAttribute('http')
103
        ));
104
    }
105
}
106