diff --git a/composer.json b/composer.json index 48c032ef6..b29044345 100644 --- a/composer.json +++ b/composer.json @@ -106,7 +106,7 @@ "repositories": { "packagist": { "type": "composer", - "url": "https://packagist.phpcomposer.com" + "url": "https://packagist.laravel-china.org" } }, "scripts": { diff --git a/src/auth/composer.json b/src/auth/composer.json index a1fdb49bb..808bbbe96 100644 --- a/src/auth/composer.json +++ b/src/auth/composer.json @@ -31,7 +31,7 @@ "repositories": [ { "type": "composer", - "url": "https://packagist.phpcomposer.com" + "url": "https://packagist.laravel-china.org" } ], "require-dev": { diff --git a/src/cache/composer.json b/src/cache/composer.json index 7f4a7be48..e182f8d7b 100644 --- a/src/cache/composer.json +++ b/src/cache/composer.json @@ -30,7 +30,7 @@ "repositories": [ { "type": "composer", - "url": "https://packagist.phpcomposer.com" + "url": "https://packagist.laravel-china.org" } ], "require-dev": { diff --git a/src/console/composer.json b/src/console/composer.json index c03212f9b..e63bc3d89 100644 --- a/src/console/composer.json +++ b/src/console/composer.json @@ -29,7 +29,7 @@ "repositories": [ { "type": "composer", - "url": "https://packagist.phpcomposer.com" + "url": "https://packagist.laravel-china.org" } ], "require-dev": { diff --git a/src/db/composer.json b/src/db/composer.json index 521302f90..58520aaea 100644 --- a/src/db/composer.json +++ b/src/db/composer.json @@ -38,7 +38,7 @@ "repositories": [ { "type": "composer", - "url": "https://packagist.phpcomposer.com" + "url": "https://packagist.laravel-china.org" } ], "scripts": { diff --git a/src/devtool/composer.json b/src/devtool/composer.json index c62448664..3b724952f 100644 --- a/src/devtool/composer.json +++ b/src/devtool/composer.json @@ -33,7 +33,7 @@ "repositories": [ { "type": "composer", - "url": "https://packagist.phpcomposer.com" + "url": "https://packagist.laravel-china.org" } ], "require-dev": { diff --git a/src/framework/composer.json b/src/framework/composer.json index c90270524..c659e5064 100644 --- a/src/framework/composer.json +++ b/src/framework/composer.json @@ -43,7 +43,7 @@ "repositories": { "packagist": { "type": "composer", - "url": "https://packagist.phpcomposer.com" + "url": "https://packagist.laravel-china.org" } }, "scripts": { diff --git a/src/http-client/composer.json b/src/http-client/composer.json index c2272c981..255ebc01c 100644 --- a/src/http-client/composer.json +++ b/src/http-client/composer.json @@ -32,7 +32,7 @@ "repositories": [ { "type": "composer", - "url": "https://packagist.phpcomposer.com" + "url": "https://packagist.laravel-china.org" } ], "scripts": { diff --git a/src/http-message/composer.json b/src/http-message/composer.json index 641e82145..8430235bc 100644 --- a/src/http-message/composer.json +++ b/src/http-message/composer.json @@ -29,7 +29,7 @@ "repositories": { "packagist": { "type": "composer", - "url": "https://packagist.phpcomposer.com" + "url": "https://packagist.laravel-china.org" } }, "require-dev": { diff --git a/src/http-server/composer.json b/src/http-server/composer.json index 330e53823..d80402781 100644 --- a/src/http-server/composer.json +++ b/src/http-server/composer.json @@ -20,13 +20,14 @@ }, "autoload-dev": { "psr-4": { - "SwoftTest\\HttpServer\\": "test/Cases" + "SwoftTest\\HttpServer\\": "test/Cases", + "SwoftTest\\Testing\\": "test/Testing" } }, "repositories": [ { "type": "composer", - "url": "https://packagist.phpcomposer.com" + "url": "https://packagist.laravel-china.org" } ], "require-dev": { diff --git a/src/http-server/src/Validator/HttpValidator.php b/src/http-server/src/Validator/HttpValidator.php index 99bc44ae1..0ab856528 100644 --- a/src/http-server/src/Validator/HttpValidator.php +++ b/src/http-server/src/Validator/HttpValidator.php @@ -6,6 +6,7 @@ use Swoft\Bean\Annotation\ValidatorFrom; use Swoft\Helper\ArrayHelper; use Swoft\Helper\JsonHelper; +use Swoft\Helper\StringHelper; use Swoft\Http\Message\Server\Request; use Swoft\Http\Message\Stream\SwooleStream; use Swoft\Validator\AbstractValidator; @@ -58,7 +59,8 @@ private function validateField($request, array $matches, string $type, array $va $post = $request->getParsedBody(); $contentType = $request->getHeader('content-type'); $isPostJson = false; - if ($contentType && \in_array('application/json', $contentType)) { + + if (isset($contentType[0]) && StringHelper::startsWith($contentType[0], 'application/json')) { $isPostJson = true; $post = $request->json(); } diff --git a/src/http-server/test/Cases/AbstractTestCase.php b/src/http-server/test/Cases/AbstractTestCase.php index 8886fccf0..381f7ac42 100644 --- a/src/http-server/test/Cases/AbstractTestCase.php +++ b/src/http-server/test/Cases/AbstractTestCase.php @@ -3,15 +3,179 @@ namespace SwoftTest\HttpServer; use PHPUnit\Framework\TestCase; +use Swoft\App; +use Swoft\Helper\ArrayHelper; +use Swoft\Testing\SwooleRequest as TestSwooleRequest; +use Swoft\Testing\SwooleResponse as TestSwooleResponse; +use Swoft\Http\Message\Testing\Web\Request; +use Swoft\Http\Message\Testing\Web\Response; /** - * @uses AbstractTestCase - * @version 2017年11月03日 - * @author huangzhhui - * @copyright Copyright 2010-2017 Swoft software - * @license PHP Version 7.x {@link http://www.php.net/license/3_0.txt} + * Class AbstractTestCase + * + * @package Swoft\Test\Cases */ -abstract class AbstractTestCase extends TestCase +class AbstractTestCase extends TestCase { + const ACCEPT_VIEW = 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8'; + const ACCEPT_JSON = 'application/json'; + + const ACCEPT_RAW = 'text/plain'; + + /** + * Send a mock request + * + * @param string $method + * @param string $uri + * @param array $parameters + * @param string $accept + * @param array $headers + * @param string $rawContent + * @return bool|\Swoft\Http\Message\Testing\Web\Response + */ + public function request( + string $method, + string $uri, + array $parameters = [], + string $accept = self::ACCEPT_JSON, + array $headers = [], + string $rawContent = '' + ) { + $method = strtoupper($method); + $swooleResponse = new TestSwooleResponse(); + $swooleRequest = new TestSwooleRequest(); + + $this->buildMockRequest($method, $uri, $parameters, $accept, $swooleRequest, $headers); + + $swooleRequest->setRawContent($rawContent); + + $request = Request::loadFromSwooleRequest($swooleRequest); + $response = new Response($swooleResponse); + + /** @var \Swoft\Http\Server\ServerDispatcher $dispatcher */ + $dispatcher = App::getBean('serverDispatcher'); + return $dispatcher->dispatch($request, $response); + } + + /** + * Send a mock json request + * + * @param string $method + * @param string $uri + * @param array $parameters + * @param array $headers + * @param string $rawContent + * @return bool|\Swoft\Http\Message\Testing\Web\Response + */ + public function json( + string $method, + string $uri, + array $parameters = [], + array $headers = [], + string $rawContent = '' + ) { + return $this->request($method, $uri, $parameters, self::ACCEPT_JSON, $headers, $rawContent); + } + + /** + * Send a mock view request + * + * @param string $method + * @param string $uri + * @param array $parameters + * @param array $headers + * @param string $rawContent + * @return bool|\Swoft\Http\Message\Testing\Web\Response + */ + public function view( + string $method, + string $uri, + array $parameters = [], + array $headers = [], + string $rawContent = '' + ) { + return $this->request($method, $uri, $parameters, self::ACCEPT_VIEW, $headers, $rawContent); + } + + /** + * Send a mock raw content request + * + * @param string $method + * @param string $uri + * @param array $parameters + * @param array $headers + * @param string $rawContent + * @return bool|\Swoft\Http\Message\Testing\Web\Response + */ + public function raw( + string $method, + string $uri, + array $parameters = [], + array $headers = [], + string $rawContent = '' + ) { + return $this->request($method, $uri, $parameters, self::ACCEPT_RAW, $headers, $rawContent); + } + + /** + * @param string $method + * @param string $uri + * @param array $parameters + * @param string $accept + * @param \Swoole\Http\Request $swooleRequest + * @param array $headers + */ + protected function buildMockRequest( + string $method, + string $uri, + array $parameters, + string $accept, + &$swooleRequest, + array $headers = [] + ) { + $urlAry = parse_url($uri); + $urlParams = []; + if (isset($urlAry['query'])) { + parse_str($urlAry['query'], $urlParams); + } + $defaultHeaders = [ + 'host' => '127.0.0.1', + 'connection' => 'keep-alive', + 'cache-control' => 'max-age=0', + 'user-agent' => 'PHPUnit', + 'upgrade-insecure-requests' => '1', + 'accept' => $accept, + 'dnt' => '1', + 'accept-encoding' => 'gzip, deflate, br', + 'accept-language' => 'zh-CN,zh;q=0.8,en;q=0.6,it-IT;q=0.4,it;q=0.2', + ]; + + $swooleRequest->fd = 1; + $swooleRequest->header = ArrayHelper::merge($headers, $defaultHeaders); + $swooleRequest->server = [ + 'request_method' => $method, + 'request_uri' => $uri, + 'path_info' => '/', + 'request_time' => microtime(), + 'request_time_float' => microtime(true), + 'server_port' => 80, + 'remote_port' => 54235, + 'remote_addr' => '10.0.2.2', + 'master_time' => microtime(), + 'server_protocol' => 'HTTP/1.1', + 'server_software' => 'swoole-http-server', + ]; + + if ($method == 'GET') { + $swooleRequest->get = $parameters; + } elseif ($method == 'POST') { + $swooleRequest->post = $parameters; + } + + if (! empty($urlParams)) { + $get = empty($swooleRequest->get) ? [] : $swooleRequest->get; + $swooleRequest->get = array_merge($urlParams, $get); + } + } } \ No newline at end of file diff --git a/src/http-server/test/Cases/ValidatorTest.php b/src/http-server/test/Cases/ValidatorTest.php new file mode 100644 index 000000000..197c1ad91 --- /dev/null +++ b/src/http-server/test/Cases/ValidatorTest.php @@ -0,0 +1,35 @@ + 'application/json' + ]; + $raw = JsonHelper::encode([ + 'test' => [ + 'id' => 1 + ] + ]); + $res = $this->raw('POST', '/validator/json', [], $headers, $raw)->getBody()->getContents(); + $this->assertEquals('[1,"limx"]', $res); + + $headers = [ + 'Content-Type' => 'application/json;charset=UTF-8' + ]; + $raw = JsonHelper::encode([ + 'test' => [ + 'id' => 1 + ] + ]); + $res = $this->raw('POST', '/validator/json', [], $headers, $raw)->getBody()->getContents(); + $this->assertEquals('[1,"limx"]', $res); + } + + +} diff --git a/src/http-server/test/Testing/Controllers/ValidatorController.php b/src/http-server/test/Testing/Controllers/ValidatorController.php new file mode 100644 index 000000000..12e0dfe38 --- /dev/null +++ b/src/http-server/test/Testing/Controllers/ValidatorController.php @@ -0,0 +1,30 @@ +json('test.id'); + $name = $request->json('test.name'); + + return $response->json([$id, $name]); + } +} \ No newline at end of file diff --git a/src/http-server/test/config/beans/base.php b/src/http-server/test/config/beans/base.php index b99387158..9ef09d463 100644 --- a/src/http-server/test/config/beans/base.php +++ b/src/http-server/test/config/beans/base.php @@ -1,3 +1,17 @@ [ + 'class' => ServerDispatcher::class, + ], + 'httpRouter' => [ + 'class' => HandlerMapping::class, + ], + 'requestParser' => [ + 'class' => RequestParser::class, + ], +]; \ No newline at end of file diff --git a/src/http-server/test/config/properties/app.php b/src/http-server/test/config/properties/app.php index c39014a5d..7e788ef53 100644 --- a/src/http-server/test/config/properties/app.php +++ b/src/http-server/test/config/properties/app.php @@ -3,7 +3,8 @@ "version" => '1.0', 'autoInitBean' => true, 'beanScan' => [ - 'Swoft\\Http\\Server\\Test\\Testing' => BASE_PATH."/Testing" + 'SwoftTest\\Testing' => BASE_PATH . "/Testing", + 'Swoft\\Http\\Server' => BASE_PATH . '/../src', ], 'I18n' => [ 'sourceLanguage' => '@root/resources/messages/', diff --git a/src/i18n/composer.json b/src/i18n/composer.json index 973e0eb20..576daa95b 100644 --- a/src/i18n/composer.json +++ b/src/i18n/composer.json @@ -29,7 +29,7 @@ "repositories": [ { "type": "composer", - "url": "https://packagist.phpcomposer.com" + "url": "https://packagist.laravel-china.org" } ], "require-dev": { diff --git a/src/memory/composer.json b/src/memory/composer.json index 4dbd94105..278428a93 100644 --- a/src/memory/composer.json +++ b/src/memory/composer.json @@ -34,7 +34,7 @@ "repositories": [ { "type": "composer", - "url": "https://packagist.phpcomposer.com" + "url": "https://packagist.laravel-china.org" } ] } diff --git a/src/process/composer.json b/src/process/composer.json index 235e0c085..886c625d6 100644 --- a/src/process/composer.json +++ b/src/process/composer.json @@ -30,7 +30,7 @@ "repositories": [ { "type": "composer", - "url": "https://packagist.phpcomposer.com" + "url": "https://packagist.laravel-china.org" } ], "require-dev": { diff --git a/src/queue/composer.json b/src/queue/composer.json index 2d13e6625..d6af40695 100644 --- a/src/queue/composer.json +++ b/src/queue/composer.json @@ -32,7 +32,7 @@ "repositories": { "packagist": { "type": "composer", - "url": "https://packagist.phpcomposer.com" + "url": "https://packagist.laravel-china.org" } }, "require-dev": { diff --git a/src/redis/composer.json b/src/redis/composer.json index b304ce2cf..72331b5b3 100644 --- a/src/redis/composer.json +++ b/src/redis/composer.json @@ -31,7 +31,7 @@ "repositories": [ { "type": "composer", - "url": "https://packagist.phpcomposer.com" + "url": "https://packagist.laravel-china.org" } ], "require-dev": { diff --git a/src/rpc-client/composer.json b/src/rpc-client/composer.json index f73a85e6d..2e070d7c4 100644 --- a/src/rpc-client/composer.json +++ b/src/rpc-client/composer.json @@ -29,7 +29,7 @@ "repositories": [ { "type": "composer", - "url": "https://packagist.phpcomposer.com" + "url": "https://packagist.laravel-china.org" } ], "scripts": { diff --git a/src/rpc-server/composer.json b/src/rpc-server/composer.json index aa257b365..f184d619b 100644 --- a/src/rpc-server/composer.json +++ b/src/rpc-server/composer.json @@ -32,7 +32,7 @@ "repositories": [ { "type": "composer", - "url": "https://packagist.phpcomposer.com" + "url": "https://packagist.laravel-china.org" } ], "scripts": { diff --git a/src/rpc/composer.json b/src/rpc/composer.json index b2507e7b9..bf2847fb7 100644 --- a/src/rpc/composer.json +++ b/src/rpc/composer.json @@ -32,7 +32,7 @@ "repositories": [ { "type": "composer", - "url": "https://packagist.phpcomposer.com" + "url": "https://packagist.laravel-china.org" } ], "scripts": { diff --git a/src/service-governance/composer.json b/src/service-governance/composer.json index ebe1cebdd..1b1fd1658 100644 --- a/src/service-governance/composer.json +++ b/src/service-governance/composer.json @@ -32,7 +32,7 @@ "repositories": [ { "type": "composer", - "url": "https://packagist.phpcomposer.com" + "url": "https://packagist.laravel-china.org" } ], "scripts": { diff --git a/src/session/composer.json b/src/session/composer.json index a939c0397..b65a2ee38 100644 --- a/src/session/composer.json +++ b/src/session/composer.json @@ -34,7 +34,7 @@ "repositories": [ { "type": "composer", - "url": "https://packagist.phpcomposer.com" + "url": "https://packagist.laravel-china.org" } ], "scripts": { diff --git a/src/task/composer.json b/src/task/composer.json index 4bcb80392..c18bc2a97 100644 --- a/src/task/composer.json +++ b/src/task/composer.json @@ -34,7 +34,7 @@ "repositories": [ { "type": "composer", - "url": "https://packagist.phpcomposer.com" + "url": "https://packagist.laravel-china.org" } ], "scripts": { diff --git a/src/trace/composer.json b/src/trace/composer.json index cb072d9a7..29876268a 100644 --- a/src/trace/composer.json +++ b/src/trace/composer.json @@ -32,7 +32,7 @@ "repositories": { "packagist": { "type": "composer", - "url": "https://packagist.phpcomposer.com" + "url": "https://packagist.laravel-china.org" } }, "scripts": { diff --git a/src/view/composer.json b/src/view/composer.json index 33c8c969e..f5847910c 100644 --- a/src/view/composer.json +++ b/src/view/composer.json @@ -28,7 +28,7 @@ "repositories": [ { "type": "composer", - "url": "https://packagist.phpcomposer.com" + "url": "https://packagist.laravel-china.org" } ], "require-dev": { diff --git a/src/websocket-server/composer.json b/src/websocket-server/composer.json index 87a218408..338a8a524 100644 --- a/src/websocket-server/composer.json +++ b/src/websocket-server/composer.json @@ -29,7 +29,7 @@ "repositories": { "packagist": { "type": "composer", - "url": "https://packagist.phpcomposer.com" + "url": "https://packagist.laravel-china.org" } }, "require-dev": {