setMethod($method); if (!is_null($url)) $this->setUrl($url); if (!is_null($headers)) $this->setHeaders($headers); if (!is_null($body)) $this->setBody($body); } /** * Returns the current HTTP method * * @return string */ function getMethod() { return $this->method; } /** * Sets the HTTP method * * @param string $method * @return void */ function setMethod($method) { $this->method = $method; } /** * Returns the request url. * * @return string */ function getUrl() { return $this->url; } /** * Sets the request url. * * @param string $url * @return void */ function setUrl($url) { $this->url = $url; } /** * Returns the list of query parameters. * * This is equivalent to PHP's $_GET superglobal. * * @return array */ function getQueryParameters() { $url = $this->getUrl(); if (($index = strpos($url, '?')) === false) { return []; } else { parse_str(substr($url, $index + 1), $queryParams); return $queryParams; } } /** * Sets the absolute url. * * @param string $url * @return void */ function setAbsoluteUrl($url) { $this->absoluteUrl = $url; } /** * Returns the absolute url. * * @return string */ function getAbsoluteUrl() { return $this->absoluteUrl; } /** * Base url * * @var string */ protected $baseUrl = '/'; /** * Sets a base url. * * This url is used for relative path calculations. * * @param string $url * @return void */ function setBaseUrl($url) { $this->baseUrl = $url; } /** * Returns the current base url. * * @return string */ function getBaseUrl() { return $this->baseUrl; } /** * Returns the relative path. * * This is being calculated using the base url. This path will not start * with a slash, so it will always return something like * 'example/path.html'. * * If the full path is equal to the base url, this method will return an * empty string. * * This method will also urldecode the path, and if the url was incoded as * ISO-8859-1, it will convert it to UTF-8. * * If the path is outside of the base url, a LogicException will be thrown. * * @return string */ function getPath() { // Removing duplicated slashes. $uri = str_replace('//', '/', $this->getUrl()); $uri = Uri\normalize($uri); $baseUri = Uri\normalize($this->getBaseUrl()); if (strpos($uri, $baseUri) === 0) { // We're not interested in the query part (everything after the ?). list($uri) = explode('?', $uri); return trim(URLUtil::decodePath(substr($uri, strlen($baseUri))), '/'); } // A special case, if the baseUri was accessed without a trailing // slash, we'll accept it as well. elseif ($uri . '/' === $baseUri) { return ''; } throw new \LogicException('Requested uri (' . $this->getUrl() . ') is out of base uri (' . $this->getBaseUrl() . ')'); } /** * Equivalent of PHP's $_POST. * * @var array */ protected $postData = []; /** * Sets the post data. * * This is equivalent to PHP's $_POST superglobal. * * This would not have been needed, if POST data was accessible as * php://input, but unfortunately we need to special case it. * * @param array $postData * @return void */ function setPostData(array $postData) { $this->postData = $postData; } /** * Returns the POST data. * * This is equivalent to PHP's $_POST superglobal. * * @return array */ function getPostData() { return $this->postData; } /** * An array containing the raw _SERVER array. * * @var array */ protected $rawServerData; /** * Returns an item from the _SERVER array. * * If the value does not exist in the array, null is returned. * * @param string $valueName * @return string|null */ function getRawServerValue($valueName) { if (isset($this->rawServerData[$valueName])) { return $this->rawServerData[$valueName]; } } /** * Sets the _SERVER array. * * @param array $data * @return void */ function setRawServerData(array $data) { $this->rawServerData = $data; } /** * Serializes the request object as a string. * * This is useful for debugging purposes. * * @return string */ function __toString() { $out = $this->getMethod() . ' ' . $this->getUrl() . ' HTTP/' . $this->getHTTPVersion() . "\r\n"; foreach ($this->getHeaders() as $key => $value) { foreach ($value as $v) { if ($key === 'Authorization') { list($v) = explode(' ', $v, 2); $v .= ' REDACTED'; } $out .= $key . ": " . $v . "\r\n"; } } $out .= "\r\n"; $out .= $this->getBodyAsString(); return $out; } }