241 lines
7.2 KiB
PHP
241 lines
7.2 KiB
PHP
<?php
|
|
/**
|
|
* @see https://github.com/zendframework/zend-diactoros for the canonical source repository
|
|
* @copyright Copyright (c) 2015-2017 Zend Technologies USA Inc. (http://www.zend.com)
|
|
* @license https://github.com/zendframework/zend-diactoros/blob/master/LICENSE.md New BSD License
|
|
*/
|
|
|
|
namespace Zend\Diactoros;
|
|
|
|
use InvalidArgumentException;
|
|
use Psr\Http\Message\UploadedFileInterface;
|
|
use stdClass;
|
|
use UnexpectedValueException;
|
|
|
|
use function array_change_key_case;
|
|
use function array_key_exists;
|
|
use function explode;
|
|
use function implode;
|
|
use function is_array;
|
|
use function is_callable;
|
|
use function strtolower;
|
|
|
|
use const CASE_LOWER;
|
|
|
|
/**
|
|
* Class for marshaling a request object from the current PHP environment.
|
|
*
|
|
* Logic largely refactored from the ZF2 Zend\Http\PhpEnvironment\Request class.
|
|
*
|
|
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
|
|
* @license http://framework.zend.com/license/new-bsd New BSD License
|
|
*/
|
|
abstract class ServerRequestFactory
|
|
{
|
|
/**
|
|
* Function to use to get apache request headers; present only to simplify mocking.
|
|
*
|
|
* @var callable
|
|
*/
|
|
private static $apacheRequestHeaders = 'apache_request_headers';
|
|
|
|
/**
|
|
* Create a request from the supplied superglobal values.
|
|
*
|
|
* If any argument is not supplied, the corresponding superglobal value will
|
|
* be used.
|
|
*
|
|
* The ServerRequest created is then passed to the fromServer() method in
|
|
* order to marshal the request URI and headers.
|
|
*
|
|
* @see fromServer()
|
|
* @param array $server $_SERVER superglobal
|
|
* @param array $query $_GET superglobal
|
|
* @param array $body $_POST superglobal
|
|
* @param array $cookies $_COOKIE superglobal
|
|
* @param array $files $_FILES superglobal
|
|
* @return ServerRequest
|
|
* @throws InvalidArgumentException for invalid file values
|
|
*/
|
|
public static function fromGlobals(
|
|
array $server = null,
|
|
array $query = null,
|
|
array $body = null,
|
|
array $cookies = null,
|
|
array $files = null
|
|
) {
|
|
$server = normalizeServer(
|
|
$server ?: $_SERVER,
|
|
is_callable(self::$apacheRequestHeaders) ? self::$apacheRequestHeaders : null
|
|
);
|
|
$files = normalizeUploadedFiles($files ?: $_FILES);
|
|
$headers = marshalHeadersFromSapi($server);
|
|
|
|
if (null === $cookies && array_key_exists('cookie', $headers)) {
|
|
$cookies = parseCookieHeader($headers['cookie']);
|
|
}
|
|
|
|
return new ServerRequest(
|
|
$server,
|
|
$files,
|
|
marshalUriFromSapi($server, $headers),
|
|
marshalMethodFromSapi($server),
|
|
'php://input',
|
|
$headers,
|
|
$cookies ?: $_COOKIE,
|
|
$query ?: $_GET,
|
|
$body ?: $_POST,
|
|
marshalProtocolVersionFromSapi($server)
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Access a value in an array, returning a default value if not found
|
|
*
|
|
* @deprecated since 1.8.0; no longer used internally.
|
|
* @param string $key
|
|
* @param array $values
|
|
* @param mixed $default
|
|
* @return mixed
|
|
*/
|
|
public static function get($key, array $values, $default = null)
|
|
{
|
|
if (array_key_exists($key, $values)) {
|
|
return $values[$key];
|
|
}
|
|
|
|
return $default;
|
|
}
|
|
|
|
/**
|
|
* Search for a header value.
|
|
*
|
|
* Does a case-insensitive search for a matching header.
|
|
*
|
|
* If found, it is returned as a string, using comma concatenation.
|
|
*
|
|
* If not, the $default is returned.
|
|
*
|
|
* @deprecated since 1.8.0; no longer used internally.
|
|
* @param string $header
|
|
* @param array $headers
|
|
* @param mixed $default
|
|
* @return string
|
|
*/
|
|
public static function getHeader($header, array $headers, $default = null)
|
|
{
|
|
$header = strtolower($header);
|
|
$headers = array_change_key_case($headers, CASE_LOWER);
|
|
if (array_key_exists($header, $headers)) {
|
|
$value = is_array($headers[$header]) ? implode(', ', $headers[$header]) : $headers[$header];
|
|
return $value;
|
|
}
|
|
|
|
return $default;
|
|
}
|
|
|
|
/**
|
|
* Marshal the $_SERVER array
|
|
*
|
|
* Pre-processes and returns the $_SERVER superglobal.
|
|
*
|
|
* @deprected since 1.8.0; use Zend\Diactoros\normalizeServer() instead.
|
|
* @param array $server
|
|
* @return array
|
|
*/
|
|
public static function normalizeServer(array $server)
|
|
{
|
|
return normalizeServer(
|
|
$server ?: $_SERVER,
|
|
is_callable(self::$apacheRequestHeaders) ? self::$apacheRequestHeaders : null
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Normalize uploaded files
|
|
*
|
|
* Transforms each value into an UploadedFileInterface instance, and ensures
|
|
* that nested arrays are normalized.
|
|
*
|
|
* @deprecated since 1.8.0; use \Zend\Diactoros\normalizeUploadedFiles instead.
|
|
* @param array $files
|
|
* @return array
|
|
* @throws InvalidArgumentException for unrecognized values
|
|
*/
|
|
public static function normalizeFiles(array $files)
|
|
{
|
|
return normalizeUploadedFiles($files);
|
|
}
|
|
|
|
/**
|
|
* Marshal headers from $_SERVER
|
|
*
|
|
* @deprecated since 1.8.0; use Zend\Diactoros\marshalHeadersFromSapi().
|
|
* @param array $server
|
|
* @return array
|
|
*/
|
|
public static function marshalHeaders(array $server)
|
|
{
|
|
return marshalHeadersFromSapi($server);
|
|
}
|
|
|
|
/**
|
|
* Marshal the URI from the $_SERVER array and headers
|
|
*
|
|
* @deprecated since 1.8.0; use Zend\Diactoros\marshalUriFromSapi() instead.
|
|
* @param array $server
|
|
* @param array $headers
|
|
* @return Uri
|
|
*/
|
|
public static function marshalUriFromServer(array $server, array $headers)
|
|
{
|
|
return marshalUriFromSapi($server, $headers);
|
|
}
|
|
|
|
/**
|
|
* Marshal the host and port from HTTP headers and/or the PHP environment
|
|
*
|
|
* @deprecated since 1.8.0; use Zend\Diactoros\marshalUriFromSapi() instead,
|
|
* and pull the host and port from the Uri instance that function
|
|
* returns.
|
|
* @param stdClass $accumulator
|
|
* @param array $server
|
|
* @param array $headers
|
|
*/
|
|
public static function marshalHostAndPortFromHeaders(stdClass $accumulator, array $server, array $headers)
|
|
{
|
|
$uri = marshalUriFromSapi($server, $headers);
|
|
$accumulator->host = $uri->getHost();
|
|
$accumulator->port = $uri->getPort();
|
|
}
|
|
|
|
/**
|
|
* Detect the base URI for the request
|
|
*
|
|
* Looks at a variety of criteria in order to attempt to autodetect a base
|
|
* URI, including rewrite URIs, proxy URIs, etc.
|
|
*
|
|
* @deprecated since 1.8.0; use Zend\Diactoros\marshalUriFromSapi() instead,
|
|
* and pull the path from the Uri instance that function returns.
|
|
* @param array $server
|
|
* @return string
|
|
*/
|
|
public static function marshalRequestUri(array $server)
|
|
{
|
|
$uri = marshalUriFromSapi($server, []);
|
|
return $uri->getPath();
|
|
}
|
|
|
|
/**
|
|
* Strip the query string from a path
|
|
*
|
|
* @deprecated since 1.8.0; no longer used internally.
|
|
* @param mixed $path
|
|
* @return string
|
|
*/
|
|
public static function stripQueryString($path)
|
|
{
|
|
return explode('?', $path, 2)[0];
|
|
}
|
|
}
|