Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 /*
|
Chris@0
|
4 * This file is part of the Symfony package.
|
Chris@0
|
5 *
|
Chris@0
|
6 * (c) Fabien Potencier <fabien@symfony.com>
|
Chris@0
|
7 *
|
Chris@0
|
8 * For the full copyright and license information, please view the LICENSE
|
Chris@0
|
9 * file that was distributed with this source code.
|
Chris@0
|
10 */
|
Chris@0
|
11
|
Chris@0
|
12 namespace Symfony\Component\HttpFoundation;
|
Chris@0
|
13
|
Chris@0
|
14 /**
|
Chris@0
|
15 * RequestMatcher compares a pre-defined set of checks against a Request instance.
|
Chris@0
|
16 *
|
Chris@0
|
17 * @author Fabien Potencier <fabien@symfony.com>
|
Chris@0
|
18 */
|
Chris@0
|
19 class RequestMatcher implements RequestMatcherInterface
|
Chris@0
|
20 {
|
Chris@0
|
21 /**
|
Chris@0
|
22 * @var string|null
|
Chris@0
|
23 */
|
Chris@0
|
24 private $path;
|
Chris@0
|
25
|
Chris@0
|
26 /**
|
Chris@0
|
27 * @var string|null
|
Chris@0
|
28 */
|
Chris@0
|
29 private $host;
|
Chris@0
|
30
|
Chris@0
|
31 /**
|
Chris@0
|
32 * @var string[]
|
Chris@0
|
33 */
|
Chris@17
|
34 private $methods = [];
|
Chris@0
|
35
|
Chris@0
|
36 /**
|
Chris@0
|
37 * @var string[]
|
Chris@0
|
38 */
|
Chris@17
|
39 private $ips = [];
|
Chris@0
|
40
|
Chris@0
|
41 /**
|
Chris@0
|
42 * @var array
|
Chris@0
|
43 */
|
Chris@17
|
44 private $attributes = [];
|
Chris@0
|
45
|
Chris@0
|
46 /**
|
Chris@0
|
47 * @var string[]
|
Chris@0
|
48 */
|
Chris@17
|
49 private $schemes = [];
|
Chris@0
|
50
|
Chris@0
|
51 /**
|
Chris@0
|
52 * @param string|null $path
|
Chris@0
|
53 * @param string|null $host
|
Chris@0
|
54 * @param string|string[]|null $methods
|
Chris@0
|
55 * @param string|string[]|null $ips
|
Chris@0
|
56 * @param array $attributes
|
Chris@0
|
57 * @param string|string[]|null $schemes
|
Chris@0
|
58 */
|
Chris@17
|
59 public function __construct($path = null, $host = null, $methods = null, $ips = null, array $attributes = [], $schemes = null)
|
Chris@0
|
60 {
|
Chris@0
|
61 $this->matchPath($path);
|
Chris@0
|
62 $this->matchHost($host);
|
Chris@0
|
63 $this->matchMethod($methods);
|
Chris@0
|
64 $this->matchIps($ips);
|
Chris@0
|
65 $this->matchScheme($schemes);
|
Chris@0
|
66
|
Chris@0
|
67 foreach ($attributes as $k => $v) {
|
Chris@0
|
68 $this->matchAttribute($k, $v);
|
Chris@0
|
69 }
|
Chris@0
|
70 }
|
Chris@0
|
71
|
Chris@0
|
72 /**
|
Chris@0
|
73 * Adds a check for the HTTP scheme.
|
Chris@0
|
74 *
|
Chris@0
|
75 * @param string|string[]|null $scheme An HTTP scheme or an array of HTTP schemes
|
Chris@0
|
76 */
|
Chris@0
|
77 public function matchScheme($scheme)
|
Chris@0
|
78 {
|
Chris@17
|
79 $this->schemes = null !== $scheme ? array_map('strtolower', (array) $scheme) : [];
|
Chris@0
|
80 }
|
Chris@0
|
81
|
Chris@0
|
82 /**
|
Chris@0
|
83 * Adds a check for the URL host name.
|
Chris@0
|
84 *
|
Chris@0
|
85 * @param string|null $regexp A Regexp
|
Chris@0
|
86 */
|
Chris@0
|
87 public function matchHost($regexp)
|
Chris@0
|
88 {
|
Chris@0
|
89 $this->host = $regexp;
|
Chris@0
|
90 }
|
Chris@0
|
91
|
Chris@0
|
92 /**
|
Chris@0
|
93 * Adds a check for the URL path info.
|
Chris@0
|
94 *
|
Chris@0
|
95 * @param string|null $regexp A Regexp
|
Chris@0
|
96 */
|
Chris@0
|
97 public function matchPath($regexp)
|
Chris@0
|
98 {
|
Chris@0
|
99 $this->path = $regexp;
|
Chris@0
|
100 }
|
Chris@0
|
101
|
Chris@0
|
102 /**
|
Chris@0
|
103 * Adds a check for the client IP.
|
Chris@0
|
104 *
|
Chris@0
|
105 * @param string $ip A specific IP address or a range specified using IP/netmask like 192.168.1.0/24
|
Chris@0
|
106 */
|
Chris@0
|
107 public function matchIp($ip)
|
Chris@0
|
108 {
|
Chris@0
|
109 $this->matchIps($ip);
|
Chris@0
|
110 }
|
Chris@0
|
111
|
Chris@0
|
112 /**
|
Chris@0
|
113 * Adds a check for the client IP.
|
Chris@0
|
114 *
|
Chris@0
|
115 * @param string|string[]|null $ips A specific IP address or a range specified using IP/netmask like 192.168.1.0/24
|
Chris@0
|
116 */
|
Chris@0
|
117 public function matchIps($ips)
|
Chris@0
|
118 {
|
Chris@17
|
119 $this->ips = null !== $ips ? (array) $ips : [];
|
Chris@0
|
120 }
|
Chris@0
|
121
|
Chris@0
|
122 /**
|
Chris@0
|
123 * Adds a check for the HTTP method.
|
Chris@0
|
124 *
|
Chris@0
|
125 * @param string|string[]|null $method An HTTP method or an array of HTTP methods
|
Chris@0
|
126 */
|
Chris@0
|
127 public function matchMethod($method)
|
Chris@0
|
128 {
|
Chris@17
|
129 $this->methods = null !== $method ? array_map('strtoupper', (array) $method) : [];
|
Chris@0
|
130 }
|
Chris@0
|
131
|
Chris@0
|
132 /**
|
Chris@0
|
133 * Adds a check for request attribute.
|
Chris@0
|
134 *
|
Chris@0
|
135 * @param string $key The request attribute name
|
Chris@0
|
136 * @param string $regexp A Regexp
|
Chris@0
|
137 */
|
Chris@0
|
138 public function matchAttribute($key, $regexp)
|
Chris@0
|
139 {
|
Chris@0
|
140 $this->attributes[$key] = $regexp;
|
Chris@0
|
141 }
|
Chris@0
|
142
|
Chris@0
|
143 /**
|
Chris@0
|
144 * {@inheritdoc}
|
Chris@0
|
145 */
|
Chris@0
|
146 public function matches(Request $request)
|
Chris@0
|
147 {
|
Chris@17
|
148 if ($this->schemes && !\in_array($request->getScheme(), $this->schemes, true)) {
|
Chris@0
|
149 return false;
|
Chris@0
|
150 }
|
Chris@0
|
151
|
Chris@17
|
152 if ($this->methods && !\in_array($request->getMethod(), $this->methods, true)) {
|
Chris@0
|
153 return false;
|
Chris@0
|
154 }
|
Chris@0
|
155
|
Chris@0
|
156 foreach ($this->attributes as $key => $pattern) {
|
Chris@0
|
157 if (!preg_match('{'.$pattern.'}', $request->attributes->get($key))) {
|
Chris@0
|
158 return false;
|
Chris@0
|
159 }
|
Chris@0
|
160 }
|
Chris@0
|
161
|
Chris@0
|
162 if (null !== $this->path && !preg_match('{'.$this->path.'}', rawurldecode($request->getPathInfo()))) {
|
Chris@0
|
163 return false;
|
Chris@0
|
164 }
|
Chris@0
|
165
|
Chris@0
|
166 if (null !== $this->host && !preg_match('{'.$this->host.'}i', $request->getHost())) {
|
Chris@0
|
167 return false;
|
Chris@0
|
168 }
|
Chris@0
|
169
|
Chris@0
|
170 if (IpUtils::checkIp($request->getClientIp(), $this->ips)) {
|
Chris@0
|
171 return true;
|
Chris@0
|
172 }
|
Chris@0
|
173
|
Chris@0
|
174 // Note to future implementors: add additional checks above the
|
Chris@0
|
175 // foreach above or else your check might not be run!
|
Chris@17
|
176 return 0 === \count($this->ips);
|
Chris@0
|
177 }
|
Chris@0
|
178 }
|