mirror of
https://github.com/Karaka-Management/phpOMS.git
synced 2026-02-10 05:58:42 +00:00
add webserver and webserver tests
This commit is contained in:
parent
01837d3755
commit
05a1437bca
|
|
@ -18,7 +18,6 @@ use phpOMS\Localization\Localization;
|
||||||
use phpOMS\Message\RequestAbstract;
|
use phpOMS\Message\RequestAbstract;
|
||||||
use phpOMS\Router\RouteVerb;
|
use phpOMS\Router\RouteVerb;
|
||||||
use phpOMS\Uri\HttpUri;
|
use phpOMS\Uri\HttpUri;
|
||||||
use phpOMS\Uri\UriFactory;
|
|
||||||
use phpOMS\Uri\UriInterface;
|
use phpOMS\Uri\UriInterface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -108,7 +107,6 @@ final class HttpRequest extends RequestAbstract
|
||||||
$this->initCurrentRequest();
|
$this->initCurrentRequest();
|
||||||
$this->lock();
|
$this->lock();
|
||||||
self::cleanupGlobals();
|
self::cleanupGlobals();
|
||||||
$this->setupUriBuilder();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->data = \array_change_key_case($this->data, \CASE_LOWER);
|
$this->data = \array_change_key_case($this->data, \CASE_LOWER);
|
||||||
|
|
@ -147,6 +145,8 @@ final class HttpRequest extends RequestAbstract
|
||||||
}
|
}
|
||||||
|
|
||||||
if (\stripos($_SERVER['CONTENT_TYPE'], 'application/json') !== false) {
|
if (\stripos($_SERVER['CONTENT_TYPE'], 'application/json') !== false) {
|
||||||
|
// @codeCoverageIgnoreStart
|
||||||
|
// Tested but coverage doesn't show up
|
||||||
$input = \file_get_contents('php://input');
|
$input = \file_get_contents('php://input');
|
||||||
|
|
||||||
if ($input === false || empty($input)) {
|
if ($input === false || empty($input)) {
|
||||||
|
|
@ -159,7 +159,10 @@ final class HttpRequest extends RequestAbstract
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->data = $json + $this->data;
|
$this->data = $json + $this->data;
|
||||||
|
// @codeCoverageIgnoreEnd
|
||||||
} elseif (\stripos($_SERVER['CONTENT_TYPE'], 'application/x-www-form-urlencoded') !== false) {
|
} elseif (\stripos($_SERVER['CONTENT_TYPE'], 'application/x-www-form-urlencoded') !== false) {
|
||||||
|
// @codeCoverageIgnoreStart
|
||||||
|
// Tested but coverage doesn't show up
|
||||||
$content = \file_get_contents('php://input');
|
$content = \file_get_contents('php://input');
|
||||||
|
|
||||||
if ($content === false || empty($content)) {
|
if ($content === false || empty($content)) {
|
||||||
|
|
@ -168,7 +171,10 @@ final class HttpRequest extends RequestAbstract
|
||||||
|
|
||||||
\parse_str($content, $temp);
|
\parse_str($content, $temp);
|
||||||
$this->data += $temp;
|
$this->data += $temp;
|
||||||
|
// @codeCoverageIgnoreEnd
|
||||||
} elseif (\stripos($_SERVER['CONTENT_TYPE'], 'multipart/form-data') !== false) {
|
} elseif (\stripos($_SERVER['CONTENT_TYPE'], 'multipart/form-data') !== false) {
|
||||||
|
// @codeCoverageIgnoreStart
|
||||||
|
// Tested but coverage doesn't show up
|
||||||
$stream = \fopen('php://input', 'r');
|
$stream = \fopen('php://input', 'r');
|
||||||
$partInfo = null;
|
$partInfo = null;
|
||||||
$boundary = null;
|
$boundary = null;
|
||||||
|
|
@ -177,7 +183,10 @@ final class HttpRequest extends RequestAbstract
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// @codeCoverageIgnoreEnd
|
||||||
while (($lineRaw = \fgets($stream)) !== false) {
|
while (($lineRaw = \fgets($stream)) !== false) {
|
||||||
|
// @codeCoverageIgnoreStart
|
||||||
|
// Tested but coverage doesn't show up
|
||||||
if (\strpos($lineRaw, '--') === 0) {
|
if (\strpos($lineRaw, '--') === 0) {
|
||||||
if ($boundary === null) {
|
if ($boundary === null) {
|
||||||
$boundary = \rtrim($lineRaw);
|
$boundary = \rtrim($lineRaw);
|
||||||
|
|
@ -187,6 +196,7 @@ final class HttpRequest extends RequestAbstract
|
||||||
}
|
}
|
||||||
|
|
||||||
$line = \rtrim($lineRaw);
|
$line = \rtrim($lineRaw);
|
||||||
|
// @codeCoverageIgnoreEnd
|
||||||
if ($line === '') {
|
if ($line === '') {
|
||||||
if (!empty($partInfo['Content-Disposition']['filename'])) { /* Is file */
|
if (!empty($partInfo['Content-Disposition']['filename'])) { /* Is file */
|
||||||
$tempdir = \sys_get_temp_dir();
|
$tempdir = \sys_get_temp_dir();
|
||||||
|
|
@ -238,6 +248,8 @@ final class HttpRequest extends RequestAbstract
|
||||||
$this->files[$name]['size'] = \filesize($tempname);
|
$this->files[$name]['size'] = \filesize($tempname);
|
||||||
$this->files[$name]['tmp_name'] = $tempname;
|
$this->files[$name]['tmp_name'] = $tempname;
|
||||||
} elseif ($partInfo !== null) { /* Is variable */
|
} elseif ($partInfo !== null) { /* Is variable */
|
||||||
|
// @codeCoverageIgnoreStart
|
||||||
|
// Tested but coverage doesn't show up
|
||||||
$fullValue = '';
|
$fullValue = '';
|
||||||
$lastLine = null;
|
$lastLine = null;
|
||||||
|
|
||||||
|
|
@ -254,6 +266,7 @@ final class HttpRequest extends RequestAbstract
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->data[$partInfo['Content-Disposition']['name']] = $fullValue;
|
$this->data[$partInfo['Content-Disposition']['name']] = $fullValue;
|
||||||
|
// @codeCoverageIgnoreEnd
|
||||||
}
|
}
|
||||||
|
|
||||||
$partInfo = null;
|
$partInfo = null;
|
||||||
|
|
@ -261,6 +274,8 @@ final class HttpRequest extends RequestAbstract
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// @codeCoverageIgnoreStart
|
||||||
|
// Tested but coverage doesn't show up
|
||||||
$delim = \strpos($line, ':');
|
$delim = \strpos($line, ':');
|
||||||
|
|
||||||
if ($delim === false) {
|
if ($delim === false) {
|
||||||
|
|
@ -295,6 +310,7 @@ final class HttpRequest extends RequestAbstract
|
||||||
}
|
}
|
||||||
|
|
||||||
$partInfo[$headerKey] = $header;
|
$partInfo[$headerKey] = $header;
|
||||||
|
// @codeCoverageIgnoreEnd
|
||||||
}
|
}
|
||||||
|
|
||||||
\fclose($stream);
|
\fclose($stream);
|
||||||
|
|
@ -340,9 +356,11 @@ final class HttpRequest extends RequestAbstract
|
||||||
return 'en';
|
return 'en';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// @codeCoverageIgnoreStart
|
||||||
$components = \explode(';', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
|
$components = \explode(';', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
|
||||||
$locals = \stripos($components[0], ',') !== false ? $locals = \explode(',', $components[0]) : $components;
|
$locals = \stripos($components[0], ',') !== false ? $locals = \explode(',', $components[0]) : $components;
|
||||||
$firstLocalComponents = \explode('-', $locals[0]);
|
$firstLocalComponents = \explode('-', $locals[0]);
|
||||||
|
// @codeCoverageIgnoreEnd
|
||||||
|
|
||||||
return \strtolower($firstLocalComponents[0]);
|
return \strtolower($firstLocalComponents[0]);
|
||||||
}
|
}
|
||||||
|
|
@ -360,8 +378,10 @@ final class HttpRequest extends RequestAbstract
|
||||||
return 'en_US';
|
return 'en_US';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// @codeCoverageIgnoreStart
|
||||||
$components = \explode(';', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
|
$components = \explode(';', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
|
||||||
$locals = \stripos($components[0], ',') !== false ? $locals = \explode(',', $components[0]) : $components;
|
$locals = \stripos($components[0], ',') !== false ? $locals = \explode(',', $components[0]) : $components;
|
||||||
|
// @codeCoverageIgnoreEnd
|
||||||
|
|
||||||
return \str_replace('-', '_', $locals[0]);
|
return \str_replace('-', '_', $locals[0]);
|
||||||
}
|
}
|
||||||
|
|
@ -381,27 +401,6 @@ final class HttpRequest extends RequestAbstract
|
||||||
unset($_REQUEST);
|
unset($_REQUEST);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Setup uri builder based on current request
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*
|
|
||||||
* @since 1.0.0
|
|
||||||
*/
|
|
||||||
private function setupUriBuilder() : void
|
|
||||||
{
|
|
||||||
UriFactory::clean('?');
|
|
||||||
UriFactory::setQuery('/lang', $this->header->getL11n()->getLanguage());
|
|
||||||
|
|
||||||
foreach ($this->data as $key => $value) {
|
|
||||||
if (\is_array($value)) {
|
|
||||||
UriFactory::setQuery('?' . $key, \implode(',', $value));
|
|
||||||
} else {
|
|
||||||
UriFactory::setQuery('?' . $key, $value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create request from superglobals.
|
* Create request from superglobals.
|
||||||
*
|
*
|
||||||
|
|
@ -467,7 +466,7 @@ final class HttpRequest extends RequestAbstract
|
||||||
$useragent = $_SERVER['HTTP_USER_AGENT'] ?? '';
|
$useragent = $_SERVER['HTTP_USER_AGENT'] ?? '';
|
||||||
|
|
||||||
if (\preg_match('/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i', $useragent) || \preg_match('/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i', $useragent)) {
|
if (\preg_match('/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i', $useragent) || \preg_match('/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i', $useragent)) {
|
||||||
return true;
|
return true; // @codeCoverageIgnore
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
|
@ -497,13 +496,15 @@ final class HttpRequest extends RequestAbstract
|
||||||
{
|
{
|
||||||
if (!isset($this->browser)) {
|
if (!isset($this->browser)) {
|
||||||
$arr = BrowserType::getConstants();
|
$arr = BrowserType::getConstants();
|
||||||
$httpUserAgent = \strtolower($_SERVER['HTTP_USER_AGENT']);
|
$httpUserAgent = \strtolower($_SERVER['HTTP_USER_AGENT'] ?? '');
|
||||||
|
|
||||||
foreach ($arr as $key => $val) {
|
foreach ($arr as $key => $val) {
|
||||||
if (\stripos($httpUserAgent, $val)) {
|
if (\stripos($httpUserAgent, $val)) {
|
||||||
|
// @codeCoverageIgnoreStart
|
||||||
$this->browser = $val;
|
$this->browser = $val;
|
||||||
|
|
||||||
return $this->browser;
|
return $this->browser;
|
||||||
|
// @codeCoverageIgnoreEnd
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -538,13 +539,15 @@ final class HttpRequest extends RequestAbstract
|
||||||
{
|
{
|
||||||
if (!isset($this->os)) {
|
if (!isset($this->os)) {
|
||||||
$arr = OSType::getConstants();
|
$arr = OSType::getConstants();
|
||||||
$httpUserAgent = \strtolower($_SERVER['HTTP_USER_AGENT']);
|
$httpUserAgent = \strtolower($_SERVER['HTTP_USER_AGENT'] ?? '');
|
||||||
|
|
||||||
foreach ($arr as $key => $val) {
|
foreach ($arr as $val) {
|
||||||
if (\stripos($httpUserAgent, $val)) {
|
if (\stripos($httpUserAgent, $val)) {
|
||||||
|
// @codeCoverageIgnoreStart
|
||||||
$this->os = $val;
|
$this->os = $val;
|
||||||
|
|
||||||
return $this->os;
|
return $this->os;
|
||||||
|
// @codeCoverageIgnoreEnd
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,8 @@ declare(strict_types=1);
|
||||||
|
|
||||||
namespace phpOMS\Message\Http;
|
namespace phpOMS\Message\Http;
|
||||||
|
|
||||||
|
use phpOMS\System\MimeType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Rest request class.
|
* Rest request class.
|
||||||
*
|
*
|
||||||
|
|
@ -45,8 +47,11 @@ final class Rest
|
||||||
|
|
||||||
\curl_setopt($curl, \CURLOPT_NOBODY, true);
|
\curl_setopt($curl, \CURLOPT_NOBODY, true);
|
||||||
|
|
||||||
$headers = $request->getHeader()->get();
|
// handle header
|
||||||
foreach ($headers as $key => $header) {
|
$requestHeaders = $request->getHeader()->get();
|
||||||
|
$headers = [];
|
||||||
|
|
||||||
|
foreach ($requestHeaders as $key => $header) {
|
||||||
$headers[$key] = $key . ': ' . \implode('', $header);
|
$headers[$key] = $key . ': ' . \implode('', $header);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -57,6 +62,9 @@ final class Rest
|
||||||
case RequestMethod::GET:
|
case RequestMethod::GET:
|
||||||
\curl_setopt($curl, \CURLOPT_HTTPGET, true);
|
\curl_setopt($curl, \CURLOPT_HTTPGET, true);
|
||||||
break;
|
break;
|
||||||
|
case RequestMethod::POST:
|
||||||
|
\curl_setopt($curl, \CURLOPT_CUSTOMREQUEST, 'POST');
|
||||||
|
break;
|
||||||
case RequestMethod::PUT:
|
case RequestMethod::PUT:
|
||||||
\curl_setopt($curl, \CURLOPT_CUSTOMREQUEST, 'PUT');
|
\curl_setopt($curl, \CURLOPT_CUSTOMREQUEST, 'PUT');
|
||||||
break;
|
break;
|
||||||
|
|
@ -65,14 +73,39 @@ final class Rest
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// handle none-get
|
||||||
if ($request->getMethod() !== RequestMethod::GET) {
|
if ($request->getMethod() !== RequestMethod::GET) {
|
||||||
\curl_setopt($curl, \CURLOPT_POST, 1);
|
\curl_setopt($curl, \CURLOPT_POST, 1);
|
||||||
|
|
||||||
if ($request->getData() !== null) {
|
// handle different content types
|
||||||
\curl_setopt($curl, \CURLOPT_POSTFIELDS, $request->getData());
|
$contentType = $requestHeaders['content-type'] ?? [];
|
||||||
|
if ($request->getData() !== null && (empty($contentType) || \in_array(MimeType::M_POST, $contentType))) {
|
||||||
|
\curl_setopt($curl, \CURLOPT_POSTFIELDS, \http_build_query($request->getData()));
|
||||||
|
} elseif ($request->getData() !== null && \in_array(MimeType::M_JSON, $contentType)) {
|
||||||
|
\curl_setopt($curl, \CURLOPT_POSTFIELDS, \json_encode($request->getData()));
|
||||||
|
} elseif ($request->getData() !== null && \in_array(MimeType::M_MULT, $contentType)) {
|
||||||
|
$boundary = '----' . \uniqid();
|
||||||
|
$data = self::createMultipartData($boundary, $request->getData());
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @todo:
|
||||||
|
* there is a very weird bug where boundary= fails to create the correct request
|
||||||
|
* while removing the = or putting it at a different location works (e.g. bound=ary).
|
||||||
|
* Maybe boundary= is a reserved keyword?
|
||||||
|
*
|
||||||
|
* according to the verbose output of curl the request is correct. this means the server must have a problem with it
|
||||||
|
*
|
||||||
|
* the php webserver and apache2 both seem to be unable to populate the php://input correctly -> not a server isue but a php issue?
|
||||||
|
*/
|
||||||
|
$headers['content-type'] = 'Content-Type: multipart/form-data; boundary/' . $boundary;
|
||||||
|
$headers['content-length'] = 'Content-Length: ' . \strlen($data);
|
||||||
|
|
||||||
|
\curl_setopt($curl, \CURLOPT_HTTPHEADER, $headers);
|
||||||
|
\curl_setopt($curl, \CURLOPT_POSTFIELDS, $data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// handle user auth
|
||||||
if ($request->getUri()->getUser() !== '') {
|
if ($request->getUri()->getUser() !== '') {
|
||||||
\curl_setopt($curl, \CURLOPT_HTTPAUTH, \CURLAUTH_BASIC);
|
\curl_setopt($curl, \CURLOPT_HTTPAUTH, \CURLAUTH_BASIC);
|
||||||
\curl_setopt($curl, \CURLOPT_USERPWD, $request->getUri()->getUserInfo());
|
\curl_setopt($curl, \CURLOPT_USERPWD, $request->getUri()->getUserInfo());
|
||||||
|
|
@ -111,4 +144,38 @@ final class Rest
|
||||||
|
|
||||||
return $response;
|
return $response;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create multipart data
|
||||||
|
*
|
||||||
|
* @param string $boundary Unique boundary id
|
||||||
|
* @param array $fields Data array (key value pair)
|
||||||
|
* @param array $files Files to upload
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*
|
||||||
|
* @since 1.0.0
|
||||||
|
*/
|
||||||
|
private static function createMultipartData(string $boundary, array $fields = [], array $files = []) : string
|
||||||
|
{
|
||||||
|
$data = '';
|
||||||
|
$delim = $boundary;
|
||||||
|
|
||||||
|
foreach ($fields as $name => $content) {
|
||||||
|
$data .= '--' . $delim . "\r\n"
|
||||||
|
. 'Content-Disposition: form-data; name="' . $name . "\"\r\n\r\n"
|
||||||
|
. $content . "\r\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($files as $name => $content) {
|
||||||
|
$data .= '--' . $delim . "\r\n"
|
||||||
|
. 'Content-Disposition: form-data; name="' . $name . '"; filename="' . $name . "\"\r\n\r\n"
|
||||||
|
. 'Content-Transfer-Encoding: binary' . "\r\n"
|
||||||
|
. $content . "\r\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
$data .= '--' . $delim . "--\r\n";
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -513,6 +513,7 @@ abstract class MimeType extends Enum
|
||||||
public const M_MSI = 'application/x-msdownload';
|
public const M_MSI = 'application/x-msdownload';
|
||||||
public const M_MSL = 'application/vnd.mobius.msl';
|
public const M_MSL = 'application/vnd.mobius.msl';
|
||||||
public const M_MSTY = 'application/vnd.muvee.style';
|
public const M_MSTY = 'application/vnd.muvee.style';
|
||||||
|
public const M_MULT = 'multipart/form-data';
|
||||||
public const M_MTS = 'model/vnd.mts';
|
public const M_MTS = 'model/vnd.mts';
|
||||||
public const M_MUS = 'application/vnd.musician';
|
public const M_MUS = 'application/vnd.musician';
|
||||||
public const M_MUSICXML = 'application/vnd.recordare.musicxml+xml';
|
public const M_MUSICXML = 'application/vnd.recordare.musicxml+xml';
|
||||||
|
|
@ -629,6 +630,7 @@ abstract class MimeType extends Enum
|
||||||
public const M_PNG = 'image/png';
|
public const M_PNG = 'image/png';
|
||||||
public const M_PNM = 'image/x-portable-anymap';
|
public const M_PNM = 'image/x-portable-anymap';
|
||||||
public const M_PORTPKG = 'application/vnd.macports.portpkg';
|
public const M_PORTPKG = 'application/vnd.macports.portpkg';
|
||||||
|
public const M_POST = 'application/x-www-form-urlencoded';
|
||||||
public const M_POT = 'application/vnd.ms-powerpoint';
|
public const M_POT = 'application/vnd.ms-powerpoint';
|
||||||
public const M_POTM = 'application/vnd.ms-powerpoint.template.macroenabled.12';
|
public const M_POTM = 'application/vnd.ms-powerpoint.template.macroenabled.12';
|
||||||
public const M_POTX = 'application/vnd.openxmlformats-officedocument.presentationml.template';
|
public const M_POTX = 'application/vnd.openxmlformats-officedocument.presentationml.template';
|
||||||
|
|
|
||||||
|
|
@ -327,3 +327,64 @@ $GLOBALS['dbpool']->create('delete', $CONFIG['db']['core']['masters']['delete'])
|
||||||
$GLOBALS['dbpool']->create('schema', $CONFIG['db']['core']['masters']['schema']);
|
$GLOBALS['dbpool']->create('schema', $CONFIG['db']['core']['masters']['schema']);
|
||||||
|
|
||||||
DataMapperAbstract::setConnection($GLOBALS['dbpool']->get());
|
DataMapperAbstract::setConnection($GLOBALS['dbpool']->get());
|
||||||
|
|
||||||
|
function phpServe()
|
||||||
|
{
|
||||||
|
// OS detection
|
||||||
|
$isWindows = \stristr(\php_uname('s'), 'Windows') !== false;
|
||||||
|
|
||||||
|
// Command that starts the built-in web server
|
||||||
|
if ($isWindows) {
|
||||||
|
$command = \sprintf(
|
||||||
|
'wmic process call create "php -S %s:%d -t %s" | find "ProcessId"',
|
||||||
|
WEB_SERVER_HOST,
|
||||||
|
WEB_SERVER_PORT,
|
||||||
|
__DIR__ . '/../' . WEB_SERVER_DOCROOT
|
||||||
|
);
|
||||||
|
|
||||||
|
$killCommand = 'taskkill /f /pid ';
|
||||||
|
} else {
|
||||||
|
$command = \sprintf(
|
||||||
|
'php -S %s:%d -t %s >/dev/null 2>&1 & echo $!',
|
||||||
|
WEB_SERVER_HOST,
|
||||||
|
WEB_SERVER_PORT,
|
||||||
|
WEB_SERVER_DOCROOT
|
||||||
|
);
|
||||||
|
|
||||||
|
$killCommand = 'kill ';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Execute the command and store the process ID
|
||||||
|
$output = [];
|
||||||
|
echo \sprintf('Starting server...') . PHP_EOL;
|
||||||
|
echo \sprintf(' Current directory: %s', \getcwd()) . PHP_EOL;
|
||||||
|
echo \sprintf(' %s', $command);
|
||||||
|
\exec($command, $output);
|
||||||
|
|
||||||
|
// Get PID
|
||||||
|
if ($isWindows) {
|
||||||
|
$pid = \explode('=', $output[0]);
|
||||||
|
$pid = \str_replace(' ', '', $pid[1]);
|
||||||
|
$pid = \str_replace(';', '', $pid);
|
||||||
|
} else {
|
||||||
|
$pid = (int) $output[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Log
|
||||||
|
echo \sprintf(
|
||||||
|
' %s - Web server started on %s:%d with PID %d',
|
||||||
|
date('r'),
|
||||||
|
WEB_SERVER_HOST,
|
||||||
|
WEB_SERVER_PORT,
|
||||||
|
$pid
|
||||||
|
) . PHP_EOL;
|
||||||
|
|
||||||
|
// Kill the web server when the process ends
|
||||||
|
\register_shutdown_function(function() use ($killCommand, $pid) {
|
||||||
|
echo PHP_EOL . \sprintf('Stopping server...') . PHP_EOL;
|
||||||
|
echo \sprintf(' %s - Killing process with ID %d', \date('r'), $pid) . PHP_EOL;
|
||||||
|
\exec($killCommand . $pid);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
phpServe();
|
||||||
9
tests/Message/Http/HttpRequestBrowser.php
Normal file
9
tests/Message/Http/HttpRequestBrowser.php
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
require_once __DIR__ . '/../../../Autoloader.php';
|
||||||
|
|
||||||
|
use phpOMS\Message\Http\HttpRequest;
|
||||||
|
|
||||||
|
$request = HttpRequest::createFromSuperglobals();
|
||||||
|
|
||||||
|
echo $request->getBrowser();
|
||||||
9
tests/Message/Http/HttpRequestLanguage.php
Normal file
9
tests/Message/Http/HttpRequestLanguage.php
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
require_once __DIR__ . '/../../../Autoloader.php';
|
||||||
|
|
||||||
|
use phpOMS\Message\Http\HttpRequest;
|
||||||
|
|
||||||
|
$request = HttpRequest::createFromSuperglobals();
|
||||||
|
|
||||||
|
echo $request->getRequestLanguage();
|
||||||
9
tests/Message/Http/HttpRequestLocale.php
Normal file
9
tests/Message/Http/HttpRequestLocale.php
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
require_once __DIR__ . '/../../../Autoloader.php';
|
||||||
|
|
||||||
|
use phpOMS\Message\Http\HttpRequest;
|
||||||
|
|
||||||
|
$request = HttpRequest::createFromSuperglobals();
|
||||||
|
|
||||||
|
echo $request->getLocale();
|
||||||
9
tests/Message/Http/HttpRequestMobile.php
Normal file
9
tests/Message/Http/HttpRequestMobile.php
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
require_once __DIR__ . '/../../../Autoloader.php';
|
||||||
|
|
||||||
|
use phpOMS\Message\Http\HttpRequest;
|
||||||
|
|
||||||
|
$request = HttpRequest::createFromSuperglobals();
|
||||||
|
|
||||||
|
echo (string) $request->isMobile();
|
||||||
9
tests/Message/Http/HttpRequestOS.php
Normal file
9
tests/Message/Http/HttpRequestOS.php
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
require_once __DIR__ . '/../../../Autoloader.php';
|
||||||
|
|
||||||
|
use phpOMS\Message\Http\HttpRequest;
|
||||||
|
|
||||||
|
$request = HttpRequest::createFromSuperglobals();
|
||||||
|
|
||||||
|
echo $request->getOS();
|
||||||
9
tests/Message/Http/HttpRequestPost.php
Normal file
9
tests/Message/Http/HttpRequestPost.php
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
require_once __DIR__ . '/../../../Autoloader.php';
|
||||||
|
|
||||||
|
use phpOMS\Message\Http\HttpRequest;
|
||||||
|
|
||||||
|
$request = HttpRequest::createFromSuperglobals();
|
||||||
|
|
||||||
|
echo \json_encode($request->getData());
|
||||||
|
|
@ -21,6 +21,8 @@ use phpOMS\Message\Http\OSType;
|
||||||
use phpOMS\Message\Http\RequestMethod;
|
use phpOMS\Message\Http\RequestMethod;
|
||||||
use phpOMS\Router\RouteVerb;
|
use phpOMS\Router\RouteVerb;
|
||||||
use phpOMS\Uri\HttpUri;
|
use phpOMS\Uri\HttpUri;
|
||||||
|
use phpOMS\Message\Http\Rest;
|
||||||
|
use phpOMS\System\MimeType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @testdox phpOMS\tests\Message\Http\RequestTest: HttpRequest wrapper for http requests
|
* @testdox phpOMS\tests\Message\Http\RequestTest: HttpRequest wrapper for http requests
|
||||||
|
|
@ -377,6 +379,140 @@ class HttpRequestTest extends \PHPUnit\Framework\TestCase
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @testdox A request can be made with post data
|
||||||
|
* @covers phpOMS\Message\Http\HttpRequest<extended>
|
||||||
|
* @group framework
|
||||||
|
*/
|
||||||
|
public function testPostData() : void
|
||||||
|
{
|
||||||
|
$request = new HttpRequest(new HttpUri('http://localhost:1234/phpOMS/tests/Message/Http/HttpRequestPost.php'));
|
||||||
|
$request->setMethod(RequestMethod::POST);
|
||||||
|
$request->getHeader()->set('Content-Type', MimeType::M_POST);
|
||||||
|
$request->setData('testKey', 'testValue');
|
||||||
|
|
||||||
|
self::assertEquals(
|
||||||
|
\json_encode($request->getData()),
|
||||||
|
Rest::request($request)->getBody()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @testdox A request can be made with json data
|
||||||
|
* @covers phpOMS\Message\Http\HttpRequest<extended>
|
||||||
|
* @group framework
|
||||||
|
*/
|
||||||
|
public function testJsonData() : void
|
||||||
|
{
|
||||||
|
$request = new HttpRequest(new HttpUri('http://localhost:1234/phpOMS/tests/Message/Http/HttpRequestPost.php'));
|
||||||
|
$request->setMethod(RequestMethod::POST);
|
||||||
|
$request->getHeader()->set('Content-Type', MimeType::M_JSON);
|
||||||
|
$request->setData('testKey', 'testValue');
|
||||||
|
|
||||||
|
self::assertEquals(
|
||||||
|
\json_encode($request->getData()),
|
||||||
|
Rest::request($request)->getBody()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @testdox A request can be made with multipart data
|
||||||
|
* @covers phpOMS\Message\Http\HttpRequest<extended>
|
||||||
|
* @group framework
|
||||||
|
*/
|
||||||
|
public function testMultipartData() : void
|
||||||
|
{
|
||||||
|
$request = new HttpRequest(new HttpUri('http://localhost:1234/phpOMS/tests/Message/Http/HttpRequestPost.php'));
|
||||||
|
$request->setMethod(RequestMethod::POST);
|
||||||
|
$request->getHeader()->set('Content-Type', MimeType::M_MULT);
|
||||||
|
$request->setData('testKey', 'testValue');
|
||||||
|
|
||||||
|
self::assertEquals(
|
||||||
|
\json_encode($request->getData()),
|
||||||
|
Rest::request($request)->getBody()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @testdox If no language can be identified en is returned
|
||||||
|
* @covers phpOMS\Message\Http\HttpRequest<extended>
|
||||||
|
* @group framework
|
||||||
|
*/
|
||||||
|
public function testLanguage() : void
|
||||||
|
{
|
||||||
|
$request = new HttpRequest(new HttpUri('http://localhost:1234/phpOMS/tests/Message/Http/HttpRequestLanguage.php'));
|
||||||
|
$request->setMethod(RequestMethod::GET);
|
||||||
|
|
||||||
|
self::assertEquals(
|
||||||
|
'en',
|
||||||
|
Rest::request($request)->getBody()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @testdox If no locale can be identified en_US is returned
|
||||||
|
* @covers phpOMS\Message\Http\HttpRequest<extended>
|
||||||
|
* @group framework
|
||||||
|
*/
|
||||||
|
public function testLocale() : void
|
||||||
|
{
|
||||||
|
$request = new HttpRequest(new HttpUri('http://localhost:1234/phpOMS/tests/Message/Http/HttpRequestLocale.php'));
|
||||||
|
$request->setMethod(RequestMethod::GET);
|
||||||
|
|
||||||
|
self::assertEquals(
|
||||||
|
'en_US',
|
||||||
|
Rest::request($request)->getBody()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @testdox A none-mobile request is recognized as none-mobile
|
||||||
|
* @covers phpOMS\Message\Http\HttpRequest<extended>
|
||||||
|
* @group framework
|
||||||
|
*/
|
||||||
|
public function testMobile() : void
|
||||||
|
{
|
||||||
|
$request = new HttpRequest(new HttpUri('http://localhost:1234/phpOMS/tests/Message/Http/HttpRequestMobile.php'));
|
||||||
|
$request->setMethod(RequestMethod::GET);
|
||||||
|
|
||||||
|
self::assertEquals(
|
||||||
|
(string) false,
|
||||||
|
Rest::request($request)->getBody()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @testdox If the OS type is unknown a unknwon OS type is returned
|
||||||
|
* @covers phpOMS\Message\Http\HttpRequest<extended>
|
||||||
|
* @group framework
|
||||||
|
*/
|
||||||
|
public function testOS() : void
|
||||||
|
{
|
||||||
|
$request = new HttpRequest(new HttpUri('http://localhost:1234/phpOMS/tests/Message/Http/HttpRequestOS.php'));
|
||||||
|
$request->setMethod(RequestMethod::GET);
|
||||||
|
|
||||||
|
self::assertEquals(
|
||||||
|
OSType::UNKNOWN,
|
||||||
|
Rest::request($request)->getBody()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @testdox If the browser type is unknown a unknwon browser type is returned
|
||||||
|
* @covers phpOMS\Message\Http\HttpRequest<extended>
|
||||||
|
* @group framework
|
||||||
|
*/
|
||||||
|
public function testBrowser() : void
|
||||||
|
{
|
||||||
|
$request = new HttpRequest(new HttpUri('http://localhost:1234/phpOMS/tests/Message/Http/HttpRequestBrowser.php'));
|
||||||
|
$request->setMethod(RequestMethod::GET);
|
||||||
|
|
||||||
|
self::assertEquals(
|
||||||
|
BrowserType::UNKNOWN,
|
||||||
|
Rest::request($request)->getBody()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @testdox A invalid https port throws a OutOfRangeException
|
* @testdox A invalid https port throws a OutOfRangeException
|
||||||
* @covers phpOMS\Message\Http\HttpRequest<extended>
|
* @covers phpOMS\Message\Http\HttpRequest<extended>
|
||||||
|
|
|
||||||
|
|
@ -34,4 +34,9 @@
|
||||||
</exclude>
|
</exclude>
|
||||||
</whitelist>
|
</whitelist>
|
||||||
</filter>
|
</filter>
|
||||||
|
<php>
|
||||||
|
<const name="WEB_SERVER_HOST" value="localhost" />
|
||||||
|
<const name="WEB_SERVER_PORT" value="1234" />
|
||||||
|
<const name="WEB_SERVER_DOCROOT" value="./../" />
|
||||||
|
</php>
|
||||||
</phpunit>
|
</phpunit>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user