From fcbdd1ebfba7e2114fb55696a46decea05aa5ab7 Mon Sep 17 00:00:00 2001 From: PJ Dietz Date: Sun, 22 Mar 2015 21:10:54 -0400 Subject: [PATCH] Read headers in ServerRequest - Add withServerRequest - Add updateWithServerRequest - Add getServerRequestHeaders --- src/Message/ServerRequest.php | 63 ++++++++++++--- .../unit/Message/ApacheRequestHeadersTest.php | 48 ++++++++++++ test/tests/unit/Message/ServerRequestTest.php | 77 ++++++++++++++++--- 3 files changed, 167 insertions(+), 21 deletions(-) create mode 100644 test/tests/unit/Message/ApacheRequestHeadersTest.php diff --git a/src/Message/ServerRequest.php b/src/Message/ServerRequest.php index f9ea6e4..91dce41 100644 --- a/src/Message/ServerRequest.php +++ b/src/Message/ServerRequest.php @@ -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; } } diff --git a/test/tests/unit/Message/ApacheRequestHeadersTest.php b/test/tests/unit/Message/ApacheRequestHeadersTest.php new file mode 100644 index 0000000..4b15e64 --- /dev/null +++ b/test/tests/unit/Message/ApacheRequestHeadersTest.php @@ -0,0 +1,48 @@ + "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); + } +} diff --git a/test/tests/unit/Message/ServerRequestTest.php b/test/tests/unit/Message/ServerRequestTest.php index 61c1bb6..325b6b3 100644 --- a/test/tests/unit/Message/ServerRequestTest.php +++ b/test/tests/unit/Message/ServerRequestTest.php @@ -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) {