NEW: Add HTTPRequest::getScheme()/setScheme()

NEW: Add HTTPRequest::setIP()
API: Rely on HTTPRequestBuilder to set scheme and IP

These changes tidy up HTTPRequest making it a container for information
and removing special logic from it.

This makes it less feature-rich: it doesn’t contain trusted-proxy logic.
This will be able to provided by a middleware.

The new getScheme() method is designed to be closish to PSR-7’s
getUri()->getScheme() equivalent.

There are no more direct $_SERVER references in HTTPRequest.
This commit is contained in:
Sam Minnee 2017-06-23 15:47:40 +12:00 committed by Damian Mooyman
parent 4d89daac78
commit c4d038f20d
2 changed files with 56 additions and 23 deletions

View File

@ -52,6 +52,20 @@ class HTTPRequest implements ArrayAccess
*/ */
protected $httpMethod; protected $httpMethod;
/**
* The URL scheme in lowercase: http or https
*
* @var string
*/
protected $scheme;
/**
* The client IP address
*
* @var string
*/
protected $ip;
/** /**
* Contains alls HTTP GET parameters passed into this request. * Contains alls HTTP GET parameters passed into this request.
* *
@ -146,6 +160,7 @@ class HTTPRequest implements ArrayAccess
$this->getVars = (array) $getVars; $this->getVars = (array) $getVars;
$this->postVars = (array) $postVars; $this->postVars = (array) $postVars;
$this->body = $body; $this->body = $body;
$this->scheme = "http";
} }
/** /**
@ -757,35 +772,23 @@ class HTTPRequest implements ArrayAccess
} }
/** /**
* Returns the client IP address which * Returns the client IP address which originated this request.
* originated this request.
* *
* @return string * @return string
*/ */
public function getIP() public function getIP()
{ {
$headerOverrideIP = null; return $this->ip;
if (TRUSTED_PROXY) { }
$headers = (getenv('SS_TRUSTED_PROXY_IP_HEADER')) ? array(getenv('SS_TRUSTED_PROXY_IP_HEADER')) : null;
if (!$headers) {
// Backwards compatible defaults
$headers = array('HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR');
}
foreach ($headers as $header) {
if (!empty($_SERVER[$header])) {
$headerOverrideIP = $_SERVER[$header];
break;
}
}
}
if ($headerOverrideIP && filter_var($headerOverrideIP, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) { /**
return $this->getIPFromHeaderValue($headerOverrideIP); * Sets the client IP address which originated this request.
} elseif (isset($_SERVER['REMOTE_ADDR'])) { *
return $_SERVER['REMOTE_ADDR']; * @param $ip string
} else { */
return null; public function setIP($ip)
} {
$this->ip = $ip;
} }
/** /**
@ -837,6 +840,25 @@ class HTTPRequest implements ArrayAccess
return $this->httpMethod; return $this->httpMethod;
} }
/**
* Return the URL scheme (e.g. "http" or "https").
* Equivalent to PSR-7 getUri()->getScheme()
* @return string
*/
public function getScheme() {
return $this->scheme;
}
/**
* Set the URL scheme (e.g. "http" or "https").
* Equivalent to PSR-7 getUri()->getScheme(),
*
* @param string $scheme
*/
public function setScheme($scheme) {
$this->scheme = $scheme;
}
/** /**
* Gets the "real" HTTP method for a request. * Gets the "real" HTTP method for a request.
* *

View File

@ -45,6 +45,17 @@ class HTTPRequestBuilder
$input $input
); );
// Set the scheme to HTTPS if needed
if ((!empty($variables['_SERVER']['HTTPS']) && $variables['_SERVER']['HTTPS'] != 'off')
|| isset($variables['_SERVER']['SSL'])) {
$request->setScheme('https');
}
// Set the client IP
if (!empty($variables['_SERVER']['REMOTE_ADDR'])) {
$request->setIP($variables['_SERVER']['REMOTE_ADDR']);
}
// Add headers // Add headers
$headers = static::extractRequestHeaders($variables['_SERVER']); $headers = static::extractRequestHeaders($variables['_SERVER']);
foreach ($headers as $header => $value) { foreach ($headers as $header => $value) {