Skip to content

Commit

Permalink
[REST] Support simple key-value format for file uploads (#3244)
Browse files Browse the repository at this point in the history
  • Loading branch information
Naktibalda authored and DavertMik committed Jun 21, 2016
1 parent 3f4521e commit e433c03
Show file tree
Hide file tree
Showing 2 changed files with 69 additions and 6 deletions.
6 changes: 3 additions & 3 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -75,13 +75,13 @@ install:
- '[[ -z "$SYMFONY" ]] || composer require -d frameworks-symfony symfony/symfony=~$SYMFONY --no-update'
- '[[ -z "$SYMFONY" ]] || composer update -d frameworks-symfony $composer_parameters'
# ZF1
- git clone -q -b 2.2 --recursive https://github.com/Naktibalda/codeception-zf1-tests frameworks-zf1
- git clone -q -b 2.2-simple-file-upload --recursive https://github.com/Naktibalda/codeception-zf1-tests frameworks-zf1
- composer update -d frameworks-zf1 $composer_parameters
# ZF2
- git clone -q -b 2.2-doctrine2 --recursive https://github.com/Naktibalda/codeception-zf2-tests frameworks-zf2
- git clone -q -b 2.2-simple-file-upload --recursive https://github.com/Naktibalda/codeception-zf2-tests frameworks-zf2
- composer update -d frameworks-zf2 $composer_parameters
# Zend Expressive
- '[[ "$TRAVIS_PHP_VERSION" == "5.4" ]] || git clone -q -b 2.2 --recursive https://github.com/Naktibalda/codeception-zend-expressive-tests frameworks-zend-expressive'
- '[[ "$TRAVIS_PHP_VERSION" == "5.4" ]] || git clone -q -b 2.2-simple-file-upload --recursive https://github.com/Naktibalda/codeception-zend-expressive-tests frameworks-zend-expressive'
- '[[ "$TRAVIS_PHP_VERSION" == "5.4" ]] || composer update -d frameworks-zend-expressive $composer_parameters'

before_script:
Expand Down
69 changes: 66 additions & 3 deletions src/Codeception/Module/REST.php
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@
class REST extends CodeceptionModule implements DependsOnModule, PartedModule, API, ConflictsWithModule
{
protected $config = [
'url' => '',
'url' => '',
'xdebug_remote' => false
];

Expand Down Expand Up @@ -492,19 +492,21 @@ protected function execute($method, $url, $parameters = [], $files = [])
}
if ($method == 'GET') {
$this->debugSection("Request", "$method $url");
$files = [];
} else {
$this->debugSection("Request", "$method $url " . json_encode($parameters));
$files = $this->formatFilesArray($files);
}
$this->response = (string)$this->connectionModule->_request($method, $url, $parameters, $files);
} else {
$requestData = $parameters;
if (!ctype_print($requestData) && false === mb_detect_encoding($requestData, mb_detect_order(), true)) {
// if the request data has non-printable bytes and it is not a valid unicode string, reformat the
// display string to signify the presence of request data
$requestData = '[binary-data length:'.strlen($requestData).' md5:'.md5($requestData).']';
$requestData = '[binary-data length:' . strlen($requestData) . ' md5:' . md5($requestData) . ']';
}
$this->debugSection("Request", "$method $url " . $requestData);
$this->response = (string) $this->connectionModule->_request($method, $url, [], $files, [], $parameters);
$this->response = (string)$this->connectionModule->_request($method, $url, [], $files, [], $parameters);
}
$this->debugSection("Response", $this->response);
}
Expand All @@ -527,6 +529,67 @@ protected function encodeApplicationJson($method, $parameters)
return $parameters;
}

private function formatFilesArray(array $files)
{
foreach ($files as $name => $value) {
if (is_string($value)) {
$this->checkFileBeforeUpload($value);

$files[$name] = [
'name' => basename($value),
'tmp_name' => $value,
'size' => filesize($value),
'type' => $this->getFileType($value),
'error' => 0,
];
continue;
} elseif (is_array($value)) {
if (isset($value['tmp_name'])) {
$this->checkFileBeforeUpload($value['tmp_name']);
if (!isset($value['name'])) {
$value['name'] = basename($value);
}
if (!isset($value['size'])) {
$value['size'] = filesize($value);
}
if (!isset($value['type'])) {
$value['type'] = $this->getFileType($value);
}
if (!isset($value['error'])) {
$value['error'] = 0;
}
} else {
$files[$name] = $this->formatFilesArray($value);
}
} else {
throw new ModuleException(__CLASS__, "Invalid value of key $name in files array");
}
}

return $files;
}

private function getFileType($file)
{
if (function_exists('mime_content_type') && mime_content_type($file)) {
return mime_content_type($file);
}
return 'application/octet-stream';
}

private function checkFileBeforeUpload($file)
{
if (!file_exists($file)) {
throw new ModuleException(__CLASS__, "File $file does not exist");
}
if (!is_readable($file)) {
throw new ModuleException(__CLASS__, "File $file is not readable");
}
if (!is_file($file)) {
throw new ModuleException(__CLASS__, "File $file is not a regular file");
}
}

/**
* Checks whether last response was valid JSON.
* This is done with json_last_error function.
Expand Down

0 comments on commit e433c03

Please sign in to comment.