Completed
Push — master ( a7c3c6...973485 )
by Peter
04:02
created

ResponseConfigurator::setLifetime()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 15
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 10
CRAP Score 3

Importance

Changes 2
Bugs 0 Features 0
Metric Value
c 2
b 0
f 0
dl 0
loc 15
ccs 10
cts 10
cp 1
rs 9.4285
cc 3
eloc 9
nc 3
nop 2
crap 3
1
<?php
2
/**
3
 * AnimeDb package.
4
 *
5
 * @author    Peter Gribanov <[email protected]>
6
 * @copyright Copyright (c) 2014, Peter Gribanov
7
 * @license   http://opensource.org/licenses/MIT
8
 */
9
namespace AnimeDb\Bundle\CacheTimeKeeperBundle\Service;
10
11
use Symfony\Component\HttpFoundation\Request;
12
use Symfony\Component\HttpFoundation\RequestStack;
13
use Symfony\Component\HttpFoundation\Response;
14
15
class ResponseConfigurator
16
{
17
    /**
18
     * @var CacheKeyBuilder
19
     */
20
    protected $key_builder;
21
22
    /**
23
     * @var RequestStack
24
     */
25
    protected $request_stack;
26
27
    /**
28
     * @var array
29
     */
30
    protected $private_headers = [];
31
32
    /**
33
     * @param CacheKeyBuilder $key_builder
34
     * @param RequestStack $request_stack
35
     * @param array $private_headers
36
     */
37 5
    public function __construct(CacheKeyBuilder $key_builder, RequestStack $request_stack, array $private_headers)
38
    {
39 5
        $this->key_builder = $key_builder;
40 5
        $this->request_stack = $request_stack;
41 5
        $this->private_headers = $private_headers;
42 5
    }
43
44
    /**
45
     * Configure response
46
     *
47
     * Set $lifetime as < 0 for not set max-age
48
     *
49
     * @param Response $response
50
     * @param \DateTime $last_modified
51
     * @param int $lifetime
52
     *
53
     * @return Response
54
     */
55 5
    public function configure(Response $response, \DateTime $last_modified, $lifetime)
56
    {
57 5
        $request = $this->request_stack->getMasterRequest();
58
59 5
        if (!($request instanceof Request)) {
60 1
            return $response;
61
        }
62
63
        // order is important
64 4
        $this
65 4
            ->setPrivateCache($response, $request)
66 4
            ->setLastModified($response, $last_modified)
67 4
            ->setLifetime($response, $lifetime)
68 4
            ->setEtag($response, $request);
69
70 4
        return $response;
71
    }
72
73
    /**
74
     * @param Response $response
75
     * @param Request $request
76
     *
77
     * @return ResponseConfigurator
78
     */
79 4
    protected function setPrivateCache(Response $response, Request $request)
80
    {
81 4
        if (!$response->headers->hasCacheControlDirective('private')) {
82 3
            $response->setPublic();
83 3
            foreach ($this->private_headers as $private_header) {
84 1
                if ($request->headers->has($private_header)) {
85 1
                    $response->setPrivate();
86 1
                    break;
87
                }
88 3
            }
89 3
        }
90
91 4
        return $this;
92
    }
93
94
    /**
95
     * @param Response $response
96
     * @param \DateTime $last_modified
97
     *
98
     * @return ResponseConfigurator
99
     */
100 4
    protected function setLastModified(Response $response, \DateTime $last_modified)
101
    {
102
        $response
103 4
            ->setLastModified($last_modified)
104 4
            ->setDate($last_modified)
105 4
            ->headers
106 4
            ->addCacheControlDirective('must-revalidate', true);
107
108 4
        return $this;
109
    }
110
111
    /**
112
     * Set max-age, s-maxage and expires headers
113
     *
114
     * Set $lifetime as < 0 for not set max-age
115
     * Need set Cache-Control public/private before set lifetime
116
     *
117
     * @param Response $response
118
     * @param int $lifetime
119
     *
120
     * @return ResponseConfigurator
121
     */
122 4
    protected function setLifetime(Response $response, $lifetime)
123
    {
124 4
        if ($lifetime >= 0) {
125 3
            $date = clone $response->getDate();
126
            $response
127 3
                ->setMaxAge($lifetime)
128 3
                ->setExpires($date->modify(sprintf('now +%s seconds', $lifetime)));
129
130 3
            if (!$response->headers->hasCacheControlDirective('private')) {
131 1
                $response->setSharedMaxAge($lifetime);
132 1
            }
133 3
        }
134
135 4
        return $this;
136
    }
137
138
    /**
139
     * Set ETag
140
     *
141
     * Need set Last-Modified before ETag
142
     *
143
     * @param Response $response
144
     * @param Request $request
145
     *
146
     * @return ResponseConfigurator
147
     */
148 4
    protected function setEtag(Response $response, Request $request)
149
    {
150 4
        if (!$response->getEtag()) {
151 3
            $response->setEtag($this->key_builder->getEtag($request, $response));
152 3
        }
153
154 4
        return $this;
155
    }
156
}
157