annotate vendor/symfony/http-foundation/RequestMatcher.php @ 19:fa3358dc1485 tip

Add ndrum files
author Chris Cannam
date Wed, 28 Aug 2019 13:14:47 +0100
parents 129ea1e6d783
children
rev   line source
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 }