Passed
Pull Request — master (#394)
by Tobias
02:58
created

CookieJar::getHash()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 7
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 6
nc 1
nop 1
dl 0
loc 8
ccs 7
cts 7
cp 1
crap 1
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 1
                $cookies[] = $cookie->toCookieHeader();
53
            }
54
        }
55 1
        if ($cookies) {
56 1
            $request = $request->withAddedHeader('Cookie', implode('; ', $cookies));
57
        }
58
59 1
        return $request;
60
    }
61
62
    /**
63
     * Processes Set-Cookie headers from a request/response pair.
64
     */
65 1
    public function processSetCookieHeaders(RequestInterface $request, ResponseInterface $response): void
66
    {
67 1
        $host = $request->getUri()->getHost();
68 1
        foreach ($response->getHeader('Set-Cookie') as $header) {
69 1
            $cookie = new Cookie();
70 1
            $cookie->fromSetCookieHeader($header, $host);
71 1
            $this->addCookie($cookie);
72
        }
73 1
    }
74
75
    /**
76
     * Removes expired cookies.
77
     */
78 1
    public function clearExpiredCookies(): void
79
    {
80 1
        $cookies = $this->getCookies();
81 1
        foreach ($cookies as $i => $cookie) {
82 1
            if ($cookie->isExpired()) {
83 1
                unset($cookies[$i]);
84
            }
85
        }
86
87 1
        $this->clear();
88 1
        $this->setCookies(array_values($cookies));
89 1
    }
90
91 4
    private function getHash(Cookie $cookie): string
92
    {
93 4
        return sha1(sprintf(
94 4
            '%s|%s|%s|%s',
95 4
            $cookie->getName(),
96 4
            $cookie->getAttribute('domain'),
97 4
            $cookie->getAttribute('path'),
98 4
            $cookie->getAttribute('http')
99
        ));
100
    }
101
}
102