Read headers in ServerRequest

- Add withServerRequest
- Add updateWithServerRequest
- Add getServerRequestHeaders
This commit is contained in:
PJ Dietz 2015-03-22 21:10:54 -04:00
parent fe93ab13c1
commit fcbdd1ebfb
3 changed files with 167 additions and 21 deletions

View File

@ -291,6 +291,24 @@ class ServerRequest extends Request implements ServerRequestInterface
// -------------------------------------------------------------------------
/**
* Create a new instance based on the request sent to the server.
*/
public function withServerRequest($options = null)
{
$request = clone $this;
self::updateWithServerRequest($request);
return $request;
}
public function __clone()
{
if (is_object($this->parsedBody)) {
$this->parsedBody = clone $this->parsedBody;
}
parent::__clone();
}
/**
* Return a reference to the singleton instance of the Request derived
* from the server's information about the request sent to the server.
@ -302,23 +320,46 @@ class ServerRequest extends Request implements ServerRequestInterface
{
if (!isset(self::$serverRequest)) {
$request = new self();
$request->serverParams = $_SERVER;
$request->cookieParams = $_COOKIE;
$request->fileParams = $_FILES;
$request->queryParams = [];
if (isset($_SERVER["QUERY_STRING"])) {
parse_str($_SERVER["QUERY_STRING"], $request->queryParams);
}
self::updateWithServerRequest($request);
self::$serverRequest = $request;
}
return self::$serverRequest;
}
public function __clone()
private function updateWithServerRequest(&$request)
{
if (is_object($this->parsedBody)) {
$this->parsedBody = clone $this->parsedBody;
$request->serverParams = $_SERVER;
$request->cookieParams = $_COOKIE;
$request->fileParams = $_FILES;
$request->queryParams = [];
if (isset($_SERVER["QUERY_STRING"])) {
parse_str($_SERVER["QUERY_STRING"], $request->queryParams);
}
parent::__clone();
$headers = self::getServerRequestHeaders();
foreach ($headers as $key => $value) {
$request->headers[$key] = $value;
}
}
/**
* Read and return all request headers from the request issued to the server.
*
* @return array Associative array of headers
*/
private static function getServerRequestHeaders()
{
// Prefer apache_request_headers is available.
if (function_exists("apache_request_headers")) {
return apache_request_headers();
}
// http://www.php.net/manual/en/function.getallheaders.php#84262
$headers = array();
foreach ($_SERVER as $name => $value) {
if (substr($name, 0, 5) === "HTTP_") {
$headers[str_replace(" ", "-", ucwords(strtolower(str_replace("_", " ", substr($name, 5)))))] = $value;
}
}
return $headers;
}
}

View File

@ -0,0 +1,48 @@
<?php
// This file must be in the global namespace to add apache_request_headers
use WellRESTed\Message\ServerRequest;
class ApacheRequestHeadersTest extends \PHPUnit_Framework_TestCase
{
/**
* @covers WellRESTed\Message\ServerRequest::getServerRequestHeaders
* @uses WellRESTed\Message\ServerRequest::getServerRequest
* @runInSeparateProcess
* @preserveGlobalState disabled
*/
public function testReadsApacheRequestHeaders()
{
if (!function_exists("apache_request_headers")) {
function apache_request_headers() {
return [];
}
}
$_SERVER = [
"HTTP_HOST" => "localhost",
"HTTP_ACCEPT" => "application/json",
"QUERY_STRING" => "guinea_pig=Claude&hamster=Fizzgig"
];
$_COOKIE = [
"cat" => "Molly"
];
$_FILES = [
"file" => [
"name" => "MyFile.jpg",
"type" => "image/jpeg",
"tmp_name" => "/tmp/php/php6hst32",
"error" => "UPLOAD_ERR_OK",
"size" => 98174
]
];
$_POST = [
"dog" => "Bear"
];
$request = ServerRequest::getServerRequest();
$headers = $request->getHeaders();
$this->assertNotNull($headers);
}
}

View File

@ -19,15 +19,20 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase
/**
* @covers WellRESTed\Message\ServerRequest::getServerRequest
* @covers WellRESTed\Message\ServerRequest::updateWithServerRequest
* @covers WellRESTed\Message\ServerRequest::getServerRequestHeaders
* @uses WellRESTed\Message\ServerRequest::__construct
* @uses WellRESTed\Message\ServerRequest::__clone
* @uses WellRESTed\Message\Request
* @uses WellRESTed\Message\Message
* @uses WellRESTed\Message\HeaderCollection
* @preserveGlobalState disabled
*/
public function testServerRequestProvidesRequest()
public function testGetServerRequestReadsFromRequest()
{
$_SERVER = [
"HTTP_HOST" => "localhost",
"HTTP_ACCEPT" => "application/json",
"QUERY_STRING" => "guinea_pig=Claude&hamster=Fizzgig"
];
$_COOKIE = [
@ -47,13 +52,51 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase
];
$request = ServerRequest::getServerRequest();
$this->assertNotNull($request);
}
/**
* @covers WellRESTed\Message\ServerRequest::withServerRequest
* @covers WellRESTed\Message\ServerRequest::updateWithServerRequest
* @covers WellRESTed\Message\ServerRequest::getServerRequestHeaders
* @uses WellRESTed\Message\ServerRequest::__construct
* @uses WellRESTed\Message\ServerRequest::__clone
* @uses WellRESTed\Message\Request
* @uses WellRESTed\Message\Message
* @uses WellRESTed\Message\HeaderCollection
* @preserveGlobalState disabled
*/
public function testWithServerRequestReadsFromRequest()
{
$_SERVER = [
"HTTP_HOST" => "localhost",
"HTTP_ACCEPT" => "application/json",
"QUERY_STRING" => "guinea_pig=Claude&hamster=Fizzgig"
];
$_COOKIE = [
"cat" => "Molly"
];
$_FILES = [
"file" => [
"name" => "MyFile.jpg",
"type" => "image/jpeg",
"tmp_name" => "/tmp/php/php6hst32",
"error" => "UPLOAD_ERR_OK",
"size" => 98174
]
];
$_POST = [
"dog" => "Bear"
];
$request = new ServerRequest();
$request = $request->withServerRequest();
$this->assertNotNull($request);
return $request;
}
/**
* @covers WellRESTed\Message\ServerRequest::getServerParams
* @preserveGlobalState disabled
* @depends testServerRequestProvidesRequest
* @depends testWithServerRequestReadsFromRequest
*/
public function testServerRequestProvidesServerParams($request)
{
@ -64,7 +107,7 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase
/**
* @covers WellRESTed\Message\ServerRequest::getCookieParams
* @preserveGlobalState disabled
* @depends testServerRequestProvidesRequest
* @depends testWithServerRequestReadsFromRequest
*/
public function testServerRequestProvidesCookieParams($request)
{
@ -75,7 +118,7 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase
/**
* @covers WellRESTed\Message\ServerRequest::getQueryParams
* @preserveGlobalState disabled
* @depends testServerRequestProvidesRequest
* @depends testWithServerRequestReadsFromRequest
*/
public function testServerRequestProvidesQueryParams($request)
{
@ -86,7 +129,7 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase
/**
* @covers WellRESTed\Message\ServerRequest::getFileParams
* @preserveGlobalState disabled
* @depends testServerRequestProvidesRequest
* @depends testWithServerRequestReadsFromRequest
*/
public function testServerRequestProvidesFilesParams($request)
{
@ -94,6 +137,20 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase
$this->assertEquals("MyFile.jpg", $request->getFileParams()["file"]["name"]);
}
/**
* @covers WellRESTed\Message\ServerRequest::getFileParams
* @uses WellRESTed\Message\Request
* @uses WellRESTed\Message\Message
* @uses WellRESTed\Message\HeaderCollection
* @preserveGlobalState disabled
* @depends testWithServerRequestReadsFromRequest
*/
public function testServerRequestProvidesHeaders($request)
{
/** @var ServerRequest $request */
$this->assertEquals("application/json", $request->getHeader("Accept"));
}
/**
* @covers WellRESTed\Message\ServerRequest::withCookieParams
* @uses WellRESTed\Message\ServerRequest::getCookieParams
@ -101,7 +158,7 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase
* @uses WellRESTed\Message\Request
* @uses WellRESTed\Message\Message
* @preserveGlobalState disabled
* @depends testServerRequestProvidesRequest
* @depends testWithServerRequestReadsFromRequest
*/
public function testWithCookieParamsCreatesNewInstance($request1)
{
@ -120,7 +177,7 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase
* @uses WellRESTed\Message\Request
* @uses WellRESTed\Message\Message
* @preserveGlobalState disabled
* @depends testServerRequestProvidesRequest
* @depends testWithServerRequestReadsFromRequest
*/
public function testWithQueryParamsCreatesNewInstance($request1)
{
@ -139,7 +196,7 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase
* @uses WellRESTed\Message\Message
* @uses WellRESTed\Message\HeaderCollection
* @preserveGlobalState disabled
* @depends testServerRequestProvidesRequest
* @depends testWithServerRequestReadsFromRequest
*/
public function testGetParsedBodyReturnsFormFieldsForUrlencodedForm($request)
{
@ -159,7 +216,7 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase
* @uses WellRESTed\Message\Message
* @uses WellRESTed\Message\HeaderCollection
* @preserveGlobalState disabled
* @depends testServerRequestProvidesRequest
* @depends testWithServerRequestReadsFromRequest
*/
public function testGetParsedBodyReturnsFormFieldsForMultipartForm($request)
{
@ -180,7 +237,7 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase
* @uses WellRESTed\Message\Message
* @uses WellRESTed\Message\HeaderCollection
* @preserveGlobalState disabled
* @depends testServerRequestProvidesRequest
* @depends testWithServerRequestReadsFromRequest
*/
public function testWithParsedBodyCreatesNewInstance($request1)
{