Chris@0: validateUploadedFiles($uploadedFiles); Chris@0: Chris@0: if ($body === 'php://input') { Chris@0: $body = new PhpInputStream(); Chris@0: } Chris@0: Chris@0: $this->initialize($uri, $method, $body, $headers); Chris@0: $this->serverParams = $serverParams; Chris@0: $this->uploadedFiles = $uploadedFiles; Chris@0: $this->cookieParams = $cookies; Chris@0: $this->queryParams = $queryParams; Chris@0: $this->parsedBody = $parsedBody; Chris@0: $this->protocol = $protocol; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getServerParams() Chris@0: { Chris@0: return $this->serverParams; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getUploadedFiles() Chris@0: { Chris@0: return $this->uploadedFiles; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function withUploadedFiles(array $uploadedFiles) Chris@0: { Chris@0: $this->validateUploadedFiles($uploadedFiles); Chris@0: $new = clone $this; Chris@0: $new->uploadedFiles = $uploadedFiles; Chris@0: return $new; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getCookieParams() Chris@0: { Chris@0: return $this->cookieParams; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function withCookieParams(array $cookies) Chris@0: { Chris@0: $new = clone $this; Chris@0: $new->cookieParams = $cookies; Chris@0: return $new; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getQueryParams() Chris@0: { Chris@0: return $this->queryParams; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function withQueryParams(array $query) Chris@0: { Chris@0: $new = clone $this; Chris@0: $new->queryParams = $query; Chris@0: return $new; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getParsedBody() Chris@0: { Chris@0: return $this->parsedBody; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function withParsedBody($data) Chris@0: { Chris@17: if (! is_array($data) && ! is_object($data) && null !== $data) { Chris@17: throw new InvalidArgumentException(sprintf( Chris@17: '%s expects a null, array, or object argument; received %s', Chris@17: __METHOD__, Chris@17: gettype($data) Chris@17: )); Chris@17: } Chris@17: Chris@0: $new = clone $this; Chris@0: $new->parsedBody = $data; Chris@0: return $new; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getAttributes() Chris@0: { Chris@0: return $this->attributes; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getAttribute($attribute, $default = null) Chris@0: { Chris@0: if (! array_key_exists($attribute, $this->attributes)) { Chris@0: return $default; Chris@0: } Chris@0: Chris@0: return $this->attributes[$attribute]; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function withAttribute($attribute, $value) Chris@0: { Chris@0: $new = clone $this; Chris@0: $new->attributes[$attribute] = $value; Chris@0: return $new; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function withoutAttribute($attribute) Chris@0: { Chris@0: $new = clone $this; Chris@0: unset($new->attributes[$attribute]); Chris@0: return $new; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Proxy to receive the request method. Chris@0: * Chris@0: * This overrides the parent functionality to ensure the method is never Chris@0: * empty; if no method is present, it returns 'GET'. Chris@0: * Chris@0: * @return string Chris@0: */ Chris@0: public function getMethod() Chris@0: { Chris@0: if (empty($this->method)) { Chris@0: return 'GET'; Chris@0: } Chris@0: return $this->method; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Set the request method. Chris@0: * Chris@0: * Unlike the regular Request implementation, the server-side Chris@0: * normalizes the method to uppercase to ensure consistency Chris@0: * and make checking the method simpler. Chris@0: * Chris@0: * This methods returns a new instance. Chris@0: * Chris@0: * @param string $method Chris@0: * @return self Chris@0: */ Chris@0: public function withMethod($method) Chris@0: { Chris@0: $this->validateMethod($method); Chris@0: $new = clone $this; Chris@0: $new->method = $method; Chris@0: return $new; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Recursively validate the structure in an uploaded files array. Chris@0: * Chris@0: * @param array $uploadedFiles Chris@0: * @throws InvalidArgumentException if any leaf is not an UploadedFileInterface instance. Chris@0: */ Chris@0: private function validateUploadedFiles(array $uploadedFiles) Chris@0: { Chris@0: foreach ($uploadedFiles as $file) { Chris@0: if (is_array($file)) { Chris@0: $this->validateUploadedFiles($file); Chris@0: continue; Chris@0: } Chris@0: Chris@0: if (! $file instanceof UploadedFileInterface) { Chris@0: throw new InvalidArgumentException('Invalid leaf in uploaded files structure'); Chris@0: } Chris@0: } Chris@0: } Chris@0: }