From 3686e3b1b250826cb55f2f2c93805b928c500e01 Mon Sep 17 00:00:00 2001 From: PJ Dietz Date: Sun, 26 Apr 2015 12:20:24 -0400 Subject: [PATCH] ServerRequest parses uploaded files --- src/Message/ServerRequest.php | 34 ++++++- test/tests/unit/Message/ServerRequestTest.php | 98 +++++++++++++++---- 2 files changed, 107 insertions(+), 25 deletions(-) diff --git a/src/Message/ServerRequest.php b/src/Message/ServerRequest.php index 1001055..84b3855 100644 --- a/src/Message/ServerRequest.php +++ b/src/Message/ServerRequest.php @@ -13,7 +13,7 @@ class ServerRequest extends Request implements ServerRequestInterface /** @var array */ private $cookieParams; /** @var array */ - private $fileParams; + private $uploadedFiles; /** @var array */ private $queryParams; /** @var array */ @@ -27,6 +27,7 @@ class ServerRequest extends Request implements ServerRequestInterface { parent::__construct(); $this->attributes = []; + $this->uploadedFiles = []; } public function __clone() @@ -150,7 +151,7 @@ class ServerRequest extends Request implements ServerRequestInterface */ public function getUploadedFiles() { - // TODO: Implement getUploadedFiles() method. + return $this->uploadedFiles; } /** @@ -307,13 +308,12 @@ class ServerRequest extends Request implements ServerRequestInterface // ------------------------------------------------------------------------ - protected function readFromServerRequest(array $attributes = null) { $this->attributes = $attributes ?: []; $this->serverParams = $_SERVER; $this->cookieParams = $_COOKIE; - $this->fileParams = $_FILES; + $this->readUploadedFiles($_FILES); $this->queryParams = []; if (isset($_SERVER["QUERY_STRING"])) { parse_str($_SERVER["QUERY_STRING"], $this->queryParams); @@ -340,6 +340,32 @@ class ServerRequest extends Request implements ServerRequestInterface } } + protected function readUploadedFiles($files) + { + $uploadedFiles = []; + foreach ($files as $name => $file) { + if (is_array($file["name"])) { + for ($index = 0, $u = count($file["name"]); $index < $u; ++$index) { + $uploadedFile = new UploadedFile( + $file["name"][$index], + $file["type"][$index], + $file["size"][$index], + $file["tmp_name"][$index], + $file["error"][$index] + ); + $uploadedFiles[$name][$index] = $uploadedFile; + } + } else { + $index = 0; + $uploadedFile = new UploadedFile( + $file["name"], $file["type"], $file["size"], $file["tmp_name"], $file["error"] + ); + $uploadedFiles[$name][$index] = $uploadedFile; + } + } + $this->uploadedFiles = $uploadedFiles; + } + /** * Return a reference to the singleton instance of the Request derived * from the server's information about the request sent to the server. diff --git a/test/tests/unit/Message/ServerRequestTest.php b/test/tests/unit/Message/ServerRequestTest.php index 83f5e96..c642a59 100644 --- a/test/tests/unit/Message/ServerRequestTest.php +++ b/test/tests/unit/Message/ServerRequestTest.php @@ -3,6 +3,7 @@ namespace WellRESTed\Test\Unit\Message; use WellRESTed\Message\ServerRequest; +use WellRESTed\Message\UploadedFile; /** * @uses WellRESTed\Message\ServerRequest @@ -10,6 +11,7 @@ use WellRESTed\Message\ServerRequest; * @uses WellRESTed\Message\Message * @uses WellRESTed\Message\HeaderCollection * @uses WellRESTed\Message\Stream + * @uses WellRESTed\Message\UploadedFile */ class ServerRequestTest extends \PHPUnit_Framework_TestCase { @@ -43,15 +45,7 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase $_COOKIE = [ "cat" => "Molly" ]; - $_FILES = [ - "file" => [ - "name" => "MyFile.jpg", - "type" => "image/jpeg", - "tmp_name" => "/tmp/php/php6hst32", - "error" => "UPLOAD_ERR_OK", - "size" => 98174 - ] - ]; + $_FILES = []; $_POST = [ "dog" => "Bear" ]; @@ -233,6 +227,80 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase // ------------------------------------------------------------------------ // Uploaded Files + /** + * @covers WellRESTed\Message\ServerRequest::getUploadedFiles + * @preserveGlobalState disabled + */ + public function testGetUploadedFilesReturnsEmptyArrayWhenNoFilesAreUploaded() + { + $_SERVER = [ + "HTTP_HOST" => "localhost", + "HTTP_ACCEPT" => "application/json", + "HTTP_CONTENT_TYPE" => "application/x-www-form-urlencoded" + ]; + $_FILES = []; + $request = ServerRequest::getServerRequest(); + $this->assertSame([], $request->getUploadedFiles()); + } + + /** + * @covers WellRESTed\Message\ServerRequest::getServerRequest + * @covers WellRESTed\Message\ServerRequest::readUploadedFiles + * @covers WellRESTed\Message\ServerRequest::getUploadedFiles + * @preserveGlobalState disabled + * @dataProvider uploadedFileProvider + */ + public function testGetServerRequestProvidesUploadedFiles($file, $name, $index) + { + $_SERVER = [ + "HTTP_HOST" => "localhost", + "HTTP_ACCEPT" => "application/json", + "HTTP_CONTENT_TYPE" => "application/x-www-form-urlencoded" + ]; + $_FILES = [ + "file" => [ + "name" => "index.html", + "type" => "text/html", + "tmp_name" => "/tmp/php9hNlHe", + "error" => 0, + "size" => 524 + ], + "fileList" => [ + "name" => [ + "data.json", + "" + ], + "type" => [ + "application/json", + "" + ], + "tmp_name" => [ + "/tmp/phpUigZSO", + "" + ], + "error" => [ + 0, + 4 + ], + "size" => [ + 1024, + 0 + ] + ] + ]; + $request = ServerRequest::getServerRequest(); + $this->assertEquals($file, $request->getUploadedFiles()[$name][$index]); + } + + public function uploadedFileProvider() + { + return [ + [new UploadedFile("index.html", "text/html", 524, "/tmp/php9hNlHe", 0), "file", 0], + [new UploadedFile("data.json", "application/json", 1024, "/tmp/phpUigZSO", 0), "fileList", 0], + [new UploadedFile("", "", 0, "", 4), "fileList", 1] + ]; + } + // ------------------------------------------------------------------------ // Parsed Body @@ -380,18 +448,6 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase $this->assertEquals("Molly", $attributes["cat"]); $this->assertEquals("Bear", $attributes["dog"]); } - -// -// /** -// * @covers WellRESTed\Message\ServerRequest::getFileParams -// * @depends testGetServerRequestReadsFromRequest -// */ -// public function testServerRequestProvidesFilesParams($request) -// { -// /** @var ServerRequest $request */ -// $this->assertEquals("MyFile.jpg", $request->getFileParams()["file"]["name"]); -// } -// } // ----------------------------------------------------------------------------