annotate vendor/zendframework/zend-diactoros/src/ServerRequest.php @ 0:c75dbcec494b

Initial commit from drush-created site
author Chris Cannam
date Thu, 05 Jul 2018 14:24:15 +0000
parents
children 5311817fb629
rev   line source
Chris@0 1 <?php
Chris@0 2 /**
Chris@0 3 * Zend Framework (http://framework.zend.com/)
Chris@0 4 *
Chris@0 5 * @see http://github.com/zendframework/zend-diactoros for the canonical source repository
Chris@0 6 * @copyright Copyright (c) 2015-2016 Zend Technologies USA Inc. (http://www.zend.com)
Chris@0 7 * @license https://github.com/zendframework/zend-diactoros/blob/master/LICENSE.md New BSD License
Chris@0 8 */
Chris@0 9
Chris@0 10 namespace Zend\Diactoros;
Chris@0 11
Chris@0 12 use InvalidArgumentException;
Chris@0 13 use Psr\Http\Message\ServerRequestInterface;
Chris@0 14 use Psr\Http\Message\StreamInterface;
Chris@0 15 use Psr\Http\Message\UploadedFileInterface;
Chris@0 16 use Psr\Http\Message\UriInterface;
Chris@0 17
Chris@0 18 /**
Chris@0 19 * Server-side HTTP request
Chris@0 20 *
Chris@0 21 * Extends the Request definition to add methods for accessing incoming data,
Chris@0 22 * specifically server parameters, cookies, matched path parameters, query
Chris@0 23 * string arguments, body parameters, and upload file information.
Chris@0 24 *
Chris@0 25 * "Attributes" are discovered via decomposing the request (and usually
Chris@0 26 * specifically the URI path), and typically will be injected by the application.
Chris@0 27 *
Chris@0 28 * Requests are considered immutable; all methods that might change state are
Chris@0 29 * implemented such that they retain the internal state of the current
Chris@0 30 * message and return a new instance that contains the changed state.
Chris@0 31 */
Chris@0 32 class ServerRequest implements ServerRequestInterface
Chris@0 33 {
Chris@0 34 use RequestTrait;
Chris@0 35
Chris@0 36 /**
Chris@0 37 * @var array
Chris@0 38 */
Chris@0 39 private $attributes = [];
Chris@0 40
Chris@0 41 /**
Chris@0 42 * @var array
Chris@0 43 */
Chris@0 44 private $cookieParams = [];
Chris@0 45
Chris@0 46 /**
Chris@0 47 * @var null|array|object
Chris@0 48 */
Chris@0 49 private $parsedBody;
Chris@0 50
Chris@0 51 /**
Chris@0 52 * @var array
Chris@0 53 */
Chris@0 54 private $queryParams = [];
Chris@0 55
Chris@0 56 /**
Chris@0 57 * @var array
Chris@0 58 */
Chris@0 59 private $serverParams;
Chris@0 60
Chris@0 61 /**
Chris@0 62 * @var array
Chris@0 63 */
Chris@0 64 private $uploadedFiles;
Chris@0 65
Chris@0 66 /**
Chris@0 67 * @param array $serverParams Server parameters, typically from $_SERVER
Chris@0 68 * @param array $uploadedFiles Upload file information, a tree of UploadedFiles
Chris@0 69 * @param null|string|UriInterface $uri URI for the request, if any.
Chris@0 70 * @param null|string $method HTTP method for the request, if any.
Chris@0 71 * @param string|resource|StreamInterface $body Message body, if any.
Chris@0 72 * @param array $headers Headers for the message, if any.
Chris@0 73 * @param array $cookies Cookies for the message, if any.
Chris@0 74 * @param array $queryParams Query params for the message, if any.
Chris@0 75 * @param null|array|object $parsedBody The deserialized body parameters, if any.
Chris@0 76 * @param string $protocol HTTP protocol version.
Chris@0 77 * @throws InvalidArgumentException for any invalid value.
Chris@0 78 */
Chris@0 79 public function __construct(
Chris@0 80 array $serverParams = [],
Chris@0 81 array $uploadedFiles = [],
Chris@0 82 $uri = null,
Chris@0 83 $method = null,
Chris@0 84 $body = 'php://input',
Chris@0 85 array $headers = [],
Chris@0 86 array $cookies = [],
Chris@0 87 array $queryParams = [],
Chris@0 88 $parsedBody = null,
Chris@0 89 $protocol = '1.1'
Chris@0 90 ) {
Chris@0 91 $this->validateUploadedFiles($uploadedFiles);
Chris@0 92
Chris@0 93 if ($body === 'php://input') {
Chris@0 94 $body = new PhpInputStream();
Chris@0 95 }
Chris@0 96
Chris@0 97 $this->initialize($uri, $method, $body, $headers);
Chris@0 98 $this->serverParams = $serverParams;
Chris@0 99 $this->uploadedFiles = $uploadedFiles;
Chris@0 100 $this->cookieParams = $cookies;
Chris@0 101 $this->queryParams = $queryParams;
Chris@0 102 $this->parsedBody = $parsedBody;
Chris@0 103 $this->protocol = $protocol;
Chris@0 104 }
Chris@0 105
Chris@0 106 /**
Chris@0 107 * {@inheritdoc}
Chris@0 108 */
Chris@0 109 public function getServerParams()
Chris@0 110 {
Chris@0 111 return $this->serverParams;
Chris@0 112 }
Chris@0 113
Chris@0 114 /**
Chris@0 115 * {@inheritdoc}
Chris@0 116 */
Chris@0 117 public function getUploadedFiles()
Chris@0 118 {
Chris@0 119 return $this->uploadedFiles;
Chris@0 120 }
Chris@0 121
Chris@0 122 /**
Chris@0 123 * {@inheritdoc}
Chris@0 124 */
Chris@0 125 public function withUploadedFiles(array $uploadedFiles)
Chris@0 126 {
Chris@0 127 $this->validateUploadedFiles($uploadedFiles);
Chris@0 128 $new = clone $this;
Chris@0 129 $new->uploadedFiles = $uploadedFiles;
Chris@0 130 return $new;
Chris@0 131 }
Chris@0 132
Chris@0 133 /**
Chris@0 134 * {@inheritdoc}
Chris@0 135 */
Chris@0 136 public function getCookieParams()
Chris@0 137 {
Chris@0 138 return $this->cookieParams;
Chris@0 139 }
Chris@0 140
Chris@0 141 /**
Chris@0 142 * {@inheritdoc}
Chris@0 143 */
Chris@0 144 public function withCookieParams(array $cookies)
Chris@0 145 {
Chris@0 146 $new = clone $this;
Chris@0 147 $new->cookieParams = $cookies;
Chris@0 148 return $new;
Chris@0 149 }
Chris@0 150
Chris@0 151 /**
Chris@0 152 * {@inheritdoc}
Chris@0 153 */
Chris@0 154 public function getQueryParams()
Chris@0 155 {
Chris@0 156 return $this->queryParams;
Chris@0 157 }
Chris@0 158
Chris@0 159 /**
Chris@0 160 * {@inheritdoc}
Chris@0 161 */
Chris@0 162 public function withQueryParams(array $query)
Chris@0 163 {
Chris@0 164 $new = clone $this;
Chris@0 165 $new->queryParams = $query;
Chris@0 166 return $new;
Chris@0 167 }
Chris@0 168
Chris@0 169 /**
Chris@0 170 * {@inheritdoc}
Chris@0 171 */
Chris@0 172 public function getParsedBody()
Chris@0 173 {
Chris@0 174 return $this->parsedBody;
Chris@0 175 }
Chris@0 176
Chris@0 177 /**
Chris@0 178 * {@inheritdoc}
Chris@0 179 */
Chris@0 180 public function withParsedBody($data)
Chris@0 181 {
Chris@0 182 $new = clone $this;
Chris@0 183 $new->parsedBody = $data;
Chris@0 184 return $new;
Chris@0 185 }
Chris@0 186
Chris@0 187 /**
Chris@0 188 * {@inheritdoc}
Chris@0 189 */
Chris@0 190 public function getAttributes()
Chris@0 191 {
Chris@0 192 return $this->attributes;
Chris@0 193 }
Chris@0 194
Chris@0 195 /**
Chris@0 196 * {@inheritdoc}
Chris@0 197 */
Chris@0 198 public function getAttribute($attribute, $default = null)
Chris@0 199 {
Chris@0 200 if (! array_key_exists($attribute, $this->attributes)) {
Chris@0 201 return $default;
Chris@0 202 }
Chris@0 203
Chris@0 204 return $this->attributes[$attribute];
Chris@0 205 }
Chris@0 206
Chris@0 207 /**
Chris@0 208 * {@inheritdoc}
Chris@0 209 */
Chris@0 210 public function withAttribute($attribute, $value)
Chris@0 211 {
Chris@0 212 $new = clone $this;
Chris@0 213 $new->attributes[$attribute] = $value;
Chris@0 214 return $new;
Chris@0 215 }
Chris@0 216
Chris@0 217 /**
Chris@0 218 * {@inheritdoc}
Chris@0 219 */
Chris@0 220 public function withoutAttribute($attribute)
Chris@0 221 {
Chris@0 222 $new = clone $this;
Chris@0 223 unset($new->attributes[$attribute]);
Chris@0 224 return $new;
Chris@0 225 }
Chris@0 226
Chris@0 227 /**
Chris@0 228 * Proxy to receive the request method.
Chris@0 229 *
Chris@0 230 * This overrides the parent functionality to ensure the method is never
Chris@0 231 * empty; if no method is present, it returns 'GET'.
Chris@0 232 *
Chris@0 233 * @return string
Chris@0 234 */
Chris@0 235 public function getMethod()
Chris@0 236 {
Chris@0 237 if (empty($this->method)) {
Chris@0 238 return 'GET';
Chris@0 239 }
Chris@0 240 return $this->method;
Chris@0 241 }
Chris@0 242
Chris@0 243 /**
Chris@0 244 * Set the request method.
Chris@0 245 *
Chris@0 246 * Unlike the regular Request implementation, the server-side
Chris@0 247 * normalizes the method to uppercase to ensure consistency
Chris@0 248 * and make checking the method simpler.
Chris@0 249 *
Chris@0 250 * This methods returns a new instance.
Chris@0 251 *
Chris@0 252 * @param string $method
Chris@0 253 * @return self
Chris@0 254 */
Chris@0 255 public function withMethod($method)
Chris@0 256 {
Chris@0 257 $this->validateMethod($method);
Chris@0 258 $new = clone $this;
Chris@0 259 $new->method = $method;
Chris@0 260 return $new;
Chris@0 261 }
Chris@0 262
Chris@0 263 /**
Chris@0 264 * Recursively validate the structure in an uploaded files array.
Chris@0 265 *
Chris@0 266 * @param array $uploadedFiles
Chris@0 267 * @throws InvalidArgumentException if any leaf is not an UploadedFileInterface instance.
Chris@0 268 */
Chris@0 269 private function validateUploadedFiles(array $uploadedFiles)
Chris@0 270 {
Chris@0 271 foreach ($uploadedFiles as $file) {
Chris@0 272 if (is_array($file)) {
Chris@0 273 $this->validateUploadedFiles($file);
Chris@0 274 continue;
Chris@0 275 }
Chris@0 276
Chris@0 277 if (! $file instanceof UploadedFileInterface) {
Chris@0 278 throw new InvalidArgumentException('Invalid leaf in uploaded files structure');
Chris@0 279 }
Chris@0 280 }
Chris@0 281 }
Chris@0 282 }