ServerRequest parses uploaded files

This commit is contained in:
PJ Dietz 2015-04-26 12:20:24 -04:00
parent a254c69607
commit 3686e3b1b2
2 changed files with 107 additions and 25 deletions

View File

@ -13,7 +13,7 @@ class ServerRequest extends Request implements ServerRequestInterface
/** @var array */ /** @var array */
private $cookieParams; private $cookieParams;
/** @var array */ /** @var array */
private $fileParams; private $uploadedFiles;
/** @var array */ /** @var array */
private $queryParams; private $queryParams;
/** @var array */ /** @var array */
@ -27,6 +27,7 @@ class ServerRequest extends Request implements ServerRequestInterface
{ {
parent::__construct(); parent::__construct();
$this->attributes = []; $this->attributes = [];
$this->uploadedFiles = [];
} }
public function __clone() public function __clone()
@ -150,7 +151,7 @@ class ServerRequest extends Request implements ServerRequestInterface
*/ */
public function getUploadedFiles() 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) protected function readFromServerRequest(array $attributes = null)
{ {
$this->attributes = $attributes ?: []; $this->attributes = $attributes ?: [];
$this->serverParams = $_SERVER; $this->serverParams = $_SERVER;
$this->cookieParams = $_COOKIE; $this->cookieParams = $_COOKIE;
$this->fileParams = $_FILES; $this->readUploadedFiles($_FILES);
$this->queryParams = []; $this->queryParams = [];
if (isset($_SERVER["QUERY_STRING"])) { if (isset($_SERVER["QUERY_STRING"])) {
parse_str($_SERVER["QUERY_STRING"], $this->queryParams); 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 * Return a reference to the singleton instance of the Request derived
* from the server's information about the request sent to the server. * from the server's information about the request sent to the server.

View File

@ -3,6 +3,7 @@
namespace WellRESTed\Test\Unit\Message; namespace WellRESTed\Test\Unit\Message;
use WellRESTed\Message\ServerRequest; use WellRESTed\Message\ServerRequest;
use WellRESTed\Message\UploadedFile;
/** /**
* @uses WellRESTed\Message\ServerRequest * @uses WellRESTed\Message\ServerRequest
@ -10,6 +11,7 @@ use WellRESTed\Message\ServerRequest;
* @uses WellRESTed\Message\Message * @uses WellRESTed\Message\Message
* @uses WellRESTed\Message\HeaderCollection * @uses WellRESTed\Message\HeaderCollection
* @uses WellRESTed\Message\Stream * @uses WellRESTed\Message\Stream
* @uses WellRESTed\Message\UploadedFile
*/ */
class ServerRequestTest extends \PHPUnit_Framework_TestCase class ServerRequestTest extends \PHPUnit_Framework_TestCase
{ {
@ -43,15 +45,7 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase
$_COOKIE = [ $_COOKIE = [
"cat" => "Molly" "cat" => "Molly"
]; ];
$_FILES = [ $_FILES = [];
"file" => [
"name" => "MyFile.jpg",
"type" => "image/jpeg",
"tmp_name" => "/tmp/php/php6hst32",
"error" => "UPLOAD_ERR_OK",
"size" => 98174
]
];
$_POST = [ $_POST = [
"dog" => "Bear" "dog" => "Bear"
]; ];
@ -233,6 +227,80 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// Uploaded Files // 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 // Parsed Body
@ -380,18 +448,6 @@ class ServerRequestTest extends \PHPUnit_Framework_TestCase
$this->assertEquals("Molly", $attributes["cat"]); $this->assertEquals("Molly", $attributes["cat"]);
$this->assertEquals("Bear", $attributes["dog"]); $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"]);
// }
//
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------