x Sorry, these patches are not available anymore due to data migration. Please run a fresh inspection.
Completed
Push — master ( 51ee65...8f289c )
by Tobias
08:44 queued 07:14
created

CookieJar::processSetCookieHeaders()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 7
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 2

Importance

Changes 0
Metric Value
cc 2
eloc 5
nc 2
nop 2
dl 0
loc 7
ccs 6
cts 6
cp 1
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 5
    public function getCookies(): array
32
    {
33 5
        return $this->cookies;
34
    }
35
36
    /**
37
     * Adds a cookie to the current cookie jar.
38
     */
39 5
    public function addCookie(Cookie $cookie): void
40
    {
41 5
        $this->cookies[$this->getHash($cookie)] = $cookie;
42 5
    }
43
44
    /**
45
     * Adds Cookie headers to the supplied request.
46
     */
47 2
    public function addCookieHeaders(RequestInterface $request): RequestInterface
48
    {
49 2
        $cookies = [];
50 2
        foreach ($this->getCookies() as $cookie) {
51 2
            if ($cookie->matchesRequest($request)) {
52 2
                $cookies[] = $cookie->toCookieHeader();
53
            }
54
        }
55 2
        if ($cookies) {
56 2
            $request = $request->withAddedHeader('Cookie', implode('; ', $cookies));
57
        }
58
59 2
        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
    /**
92
     * Create an unique identifier for the cookie. Two cookies with the same identifier
93
     * may have different values.
94
     */
95 5
    private function getHash(Cookie $cookie): string
96
    {
97 5
        return sha1(sprintf(
98 5
            '%s|%s|%s|%s',
99 5
            $cookie->getName(),
100 5
            $cookie->getAttribute('domain'),
101 5
            $cookie->getAttribute('path'),
102 5
            $cookie->getAttribute('http')
103
        ));
104
    }
105
}
106