Uh oh!
There was an error while loading. Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork 2k
feat: add OutgoingRequestInterface#6698
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Uh oh!
There was an error while loading. Please reload this page.
Changes from all commits
a7c40b4ed1b0fd118438375cd06eb29a4d3d3b0c7f3a448e8eaa73f1583689cFile filter
Filter by extension
Conversations
Uh oh!
There was an error while loading. Please reload this page.
Jump to
Uh oh!
There was an error while loading. Please reload this page.
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,161 @@ | ||
| <?php | ||
| /** | ||
| * This file is part of CodeIgniter 4 framework. | ||
| * | ||
| * (c) CodeIgniter Foundation <admin@codeigniter.com> | ||
| * | ||
| * For the full copyright and license information, please view | ||
| * the LICENSE file that was distributed with this source code. | ||
| */ | ||
| namespace CodeIgniter\HTTP; | ||
| /** | ||
| * Representation of an outgoing, client-side request. | ||
| */ | ||
| class OutgoingRequest extends Message implements OutgoingRequestInterface | ||
| { | ||
| /** | ||
| * Request method. | ||
| * | ||
| * @var string | ||
| */ | ||
| protected $method; | ||
| /** | ||
| * A URI instance. | ||
| * | ||
| * @var URI|null | ||
| */ | ||
| protected $uri; | ||
| /** | ||
| * @param string $method HTTP method | ||
| * @param string|null $body | ||
| */ | ||
| public function __construct( | ||
| string $method, | ||
| ?URI $uri = null, | ||
| array $headers = [], | ||
| $body = null, | ||
| string $version = '1.1' | ||
| ) { | ||
| $this->method = $method; | ||
| $this->uri = $uri; | ||
| foreach ($headers as $header => $value) { | ||
| $this->setHeader($header, $value); | ||
| } | ||
| $this->body = $body; | ||
| $this->protocolVersion = $version; | ||
| if (! $this->hasHeader('Host') && $this->uri->getHost() !== '') { | ||
| $this->setHeader('Host', $this->getHostFromUri($this->uri)); | ||
| } | ||
| } | ||
| private function getHostFromUri(URI $uri): string | ||
| { | ||
| $host = $uri->getHost(); | ||
| return $host . ($uri->getPort() ? ':' . $uri->getPort() : ''); | ||
| } | ||
| /** | ||
| * Get the request method. | ||
| * | ||
| * @param bool $upper Whether to return in upper or lower case. | ||
| * | ||
| * @deprecated The $upper functionality will be removed and this will revert to its PSR-7 equivalent | ||
| */ | ||
| public function getMethod(bool $upper = false): string | ||
| { | ||
| return ($upper) ? strtoupper($this->method) : strtolower($this->method); | ||
| } | ||
| /** | ||
| * Sets the request method. Used when spoofing the request. | ||
| * | ||
| * @return $this | ||
| * | ||
| * @deprecated Use withMethod() instead for immutability | ||
| */ | ||
| public function setMethod(string $method) | ||
| { | ||
| $this->method = $method; | ||
| return $this; | ||
| } | ||
| /** | ||
| * Returns an instance with the specified method. | ||
| * | ||
| * @param string $method | ||
| * | ||
| * @return static | ||
| */ | ||
| public function withMethod($method) | ||
| { | ||
| $request = clone $this; | ||
| $request->method = $method; | ||
| return $request; | ||
| } | ||
| /** | ||
| * Retrieves the URI instance. | ||
| * | ||
| * @return URI|null | ||
| */ | ||
| public function getUri() | ||
| { | ||
| return $this->uri; | ||
| } | ||
| /** | ||
| * Returns an instance with the provided URI. | ||
| * | ||
| * @param URI $uri New request URI to use. | ||
| * @param bool $preserveHost Preserve the original state of the Host header. | ||
| * | ||
| * @return static | ||
| */ | ||
| public function withUri(URI $uri, $preserveHost = false) | ||
| { | ||
| $request = clone $this; | ||
| $request->uri = $uri; | ||
| if ($preserveHost) { | ||
| if ($this->isHostHeaderMissingOrEmpty() && $uri->getHost() !== '') { | ||
| $request->setHeader('Host', $this->getHostFromUri($uri)); | ||
| return $request; | ||
| } | ||
| if ($this->isHostHeaderMissingOrEmpty() && $uri->getHost() === '') { | ||
| return $request; | ||
| } | ||
| if (! $this->isHostHeaderMissingOrEmpty()) { | ||
| return $request; | ||
| } | ||
| } | ||
| if ($uri->getHost() !== '') { | ||
| $request->setHeader('Host', $this->getHostFromUri($uri)); | ||
| } | ||
| return $request; | ||
| } | ||
| private function isHostHeaderMissingOrEmpty(): bool | ||
MGatner marked this conversation as resolved.
Uh oh!There was an error while loading. Please reload this page. | ||
| { | ||
| if (! $this->hasHeader('Host')) { | ||
| return true; | ||
| } | ||
| return $this->header('Host')->getValue() === ''; | ||
| } | ||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,94 @@ | ||
| <?php | ||
| /** | ||
| * This file is part of CodeIgniter 4 framework. | ||
| * | ||
| * (c) CodeIgniter Foundation <admin@codeigniter.com> | ||
| * | ||
| * For the full copyright and license information, please view | ||
| * the LICENSE file that was distributed with this source code. | ||
| */ | ||
| namespace CodeIgniter\HTTP; | ||
| use InvalidArgumentException; | ||
| /** | ||
| * Representation of an outgoing, client-side request. | ||
| * | ||
| * Corresponds to Psr7\RequestInterface. | ||
| */ | ||
| interface OutgoingRequestInterface extends MessageInterface | ||
MGatner marked this conversation as resolved.
Uh oh!There was an error while loading. Please reload this page. | ||
| { | ||
| /** | ||
| * Get the request method. | ||
| * An extension of PSR-7's getMethod to allow casing. | ||
| * | ||
| * @param bool $upper Whether to return in upper or lower case. | ||
| * | ||
| * @deprecated The $upper functionality will be removed and this will revert to its PSR-7 equivalent | ||
| */ | ||
| public function getMethod(bool $upper = false): string; | ||
| /** | ||
| * Return an instance with the provided HTTP method. | ||
| * | ||
| * While HTTP method names are typically all uppercase characters, HTTP | ||
| * method names are case-sensitive and thus implementations SHOULD NOT | ||
| * modify the given string. | ||
| * | ||
| * This method MUST be implemented in such a way as to retain the | ||
| * immutability of the message, and MUST return an instance that has the | ||
| * changed request method. | ||
| * | ||
| * @param string $method Case-sensitive method. | ||
| * | ||
| * @return static | ||
| * | ||
| * @throws InvalidArgumentException for invalid HTTP methods. | ||
| */ | ||
| public function withMethod($method); | ||
| /** | ||
| * Retrieves the URI instance. | ||
| * | ||
| * @see http://tools.ietf.org/html/rfc3986#section-4.3 | ||
| * | ||
| * @return URI | ||
| */ | ||
| public function getUri(); | ||
| /** | ||
| * Returns an instance with the provided URI. | ||
| * | ||
| * This method MUST update the Host header of the returned request by | ||
| * default if the URI contains a host component. If the URI does not | ||
| * contain a host component, any pre-existing Host header MUST be carried | ||
| * over to the returned request. | ||
| * | ||
| * You can opt-in to preserving the original state of the Host header by | ||
| * setting `$preserveHost` to `true`. When `$preserveHost` is set to | ||
| * `true`, this method interacts with the Host header in the following ways: | ||
| * | ||
| * - If the Host header is missing or empty, and the new URI contains | ||
| * a host component, this method MUST update the Host header in the returned | ||
| * request. | ||
| * - If the Host header is missing or empty, and the new URI does not contain a | ||
| * host component, this method MUST NOT update the Host header in the returned | ||
| * request. | ||
| * - If a Host header is present and non-empty, this method MUST NOT update | ||
| * the Host header in the returned request. | ||
| * | ||
| * This method MUST be implemented in such a way as to retain the | ||
| * immutability of the message, and MUST return an instance that has the | ||
| * new UriInterface instance. | ||
| * | ||
| * @see http://tools.ietf.org/html/rfc3986#section-4.3 | ||
| * | ||
| * @param URI $uri New request URI to use. | ||
| * @param bool $preserveHost Preserve the original state of the Host header. | ||
| * | ||
| * @return static | ||
| */ | ||
| public function withUri(URI $uri, $preserveHost = false); | ||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -12,11 +12,12 @@ | ||
| namespace CodeIgniter\HTTP; | ||
| use CodeIgniter\Validation\FormatRules; | ||
| use Config\App; | ||
| /** | ||
| * Representation of an HTTP request. | ||
| * Representation of an incoming, server-side HTTP request. | ||
| */ | ||
| class Request extends Message implements RequestInterface | ||
| class Request extends OutgoingRequest implements RequestInterface | ||
MGatner marked this conversation as resolved.
Uh oh!There was an error while loading. Please reload this page. | ||
| { | ||
| use RequestTrait; | ||
| @@ -29,24 +30,10 @@ class Request extends Message implements RequestInterface | ||
| */ | ||
| protected $proxyIPs; | ||
| /** | ||
| * Request method. | ||
| * | ||
| * @var string | ||
| */ | ||
| protected $method; | ||
| /** | ||
| * A URI instance. | ||
| * | ||
| * @var URI | ||
| */ | ||
| protected $uri; | ||
| /** | ||
| * Constructor. | ||
| * | ||
| * @param object $config | ||
| * @param App $config | ||
| * | ||
| * @deprecated The $config is no longer needed and will be removed in a future version | ||
| */ | ||
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.