From 14a559d1a61c518d26b8e335af170b664bc1dc12 Mon Sep 17 00:00:00 2001 From: alexpts Date: Sun, 5 Apr 2020 09:17:40 +0300 Subject: [PATCH 1/5] Added the ability to replace server request via inheritance --- src/Io/RequestHeaderParser.php | 35 ++++++++++++++++++------------- src/Io/RequestParserInterface.php | 24 +++++++++++++++++++++ src/StreamingServer.php | 11 +++++++++- 3 files changed, 54 insertions(+), 16 deletions(-) create mode 100644 src/Io/RequestParserInterface.php diff --git a/src/Io/RequestHeaderParser.php b/src/Io/RequestHeaderParser.php index f7f77e7e..ea3147fb 100644 --- a/src/Io/RequestHeaderParser.php +++ b/src/Io/RequestHeaderParser.php @@ -4,6 +4,7 @@ use Evenement\EventEmitter; use Psr\Http\Message\ServerRequestInterface; +use Psr\Http\Message\UriInterface; use React\Socket\ConnectionInterface; use Exception; @@ -18,7 +19,7 @@ * * @internal */ -class RequestHeaderParser extends EventEmitter +class RequestHeaderParser extends EventEmitter implements RequestParserInterface { private $maxSize = 8192; @@ -112,12 +113,7 @@ public function handle(ConnectionInterface $conn) } /** - * @param string $headers buffer string containing request headers only - * @param ?string $remoteSocketUri - * @param ?string $localSocketUri - * @return ServerRequestInterface - * @throws \InvalidArgumentException - * @internal + * @inheritDoc */ public function parseRequest($headers, $remoteSocketUri, $localSocketUri) { @@ -219,14 +215,7 @@ public function parseRequest($headers, $remoteSocketUri, $localSocketUri) $serverParams['SERVER_PORT'] = $localParts['port']; } - $request = new ServerRequest( - $start['method'], - $uri, - $fields, - null, - $start['version'], - $serverParams - ); + $request = $this->createRequest($start['method'], $uri, $fields, $start['version'], $serverParams); // only assign request target if it is not in origin-form (happy path for most normal requests) if ($start['target'][0] !== '/') { @@ -274,4 +263,20 @@ public function parseRequest($headers, $remoteSocketUri, $localSocketUri) return $request; } + + /** + * Create PSR7 request + * + * @param string $method + * @param string|UriInterface $uri + * @param array $headers + * @param string $version + * @param array $serverParams + * + * @return ServerRequestInterface + */ + protected function createRequest($method, $uri, $headers, $version, $serverParams) + { + return new ServerRequest($method, $uri, $headers, null, $version, $serverParams); + } } diff --git a/src/Io/RequestParserInterface.php b/src/Io/RequestParserInterface.php new file mode 100644 index 00000000..8f02d675 --- /dev/null +++ b/src/Io/RequestParserInterface.php @@ -0,0 +1,24 @@ +callback = $requestHandler; - $this->parser = new RequestHeaderParser(); + $this->parser = $this->createParser(); $that = $this; $this->parser->on('headers', function (ServerRequestInterface $request, ConnectionInterface $conn) use ($that) { @@ -128,6 +129,14 @@ public function __construct($requestHandler) }); } + /** + * @return RequestParserInterface + */ + protected function createParser() + { + return new RequestHeaderParser(); + } + /** * Starts listening for HTTP requests on the given socket server instance * From 7648ebc97ee1b37f1ada8ea896a9f661945ab3cb Mon Sep 17 00:00:00 2001 From: alexpts Date: Sun, 5 Apr 2020 09:20:00 +0300 Subject: [PATCH 2/5] optimize imports --- src/StreamingServer.php | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/StreamingServer.php b/src/StreamingServer.php index fb7256e9..99443c15 100644 --- a/src/StreamingServer.php +++ b/src/StreamingServer.php @@ -5,14 +5,11 @@ use Evenement\EventEmitter; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; -use React\Http\Io\ChunkedDecoder; use React\Http\Io\ChunkedEncoder; -use React\Http\Io\CloseProtectionStream; use React\Http\Io\HttpBodyStream; -use React\Http\Io\LengthLimitedStream; use React\Http\Io\MiddlewareRunner; -use React\Http\Io\RequestParserInterface; use React\Http\Io\RequestHeaderParser; +use React\Http\Io\RequestParserInterface; use React\Http\Io\ServerRequest; use React\Promise; use React\Promise\CancellablePromiseInterface; From f3788b5ea06439906ec19559e94c100dc604cb58 Mon Sep 17 00:00:00 2001 From: alexpts Date: Sun, 5 Apr 2020 09:26:23 +0300 Subject: [PATCH 3/5] codestyle --- src/StreamingServer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/StreamingServer.php b/src/StreamingServer.php index 99443c15..918af819 100644 --- a/src/StreamingServer.php +++ b/src/StreamingServer.php @@ -107,7 +107,7 @@ public function __construct($requestHandler) } $this->callback = $requestHandler; - $this->parser = $this->createParser(); + $this->parser = $this->createParser(); $that = $this; $this->parser->on('headers', function (ServerRequestInterface $request, ConnectionInterface $conn) use ($that) { From b59b5b02dee874f04ba2d45ff5d60a85570344c7 Mon Sep 17 00:00:00 2001 From: alexpts Date: Sun, 5 Apr 2020 09:35:18 +0300 Subject: [PATCH 4/5] Added the ability to inheritance --- src/StreamingServer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/StreamingServer.php b/src/StreamingServer.php index 918af819..f8e5c9f9 100644 --- a/src/StreamingServer.php +++ b/src/StreamingServer.php @@ -82,7 +82,7 @@ * @see Response * @see self::listen() */ -final class StreamingServer extends EventEmitter +class StreamingServer extends EventEmitter { private $callback; private $parser; From e684a090f2138f6d1f7001a9b9d9f5fb84df49d7 Mon Sep 17 00:00:00 2001 From: alexpts Date: Sun, 5 Apr 2020 10:02:53 +0300 Subject: [PATCH 5/5] remove @internal in RequestHeaderParser --- src/Io/RequestHeaderParser.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/Io/RequestHeaderParser.php b/src/Io/RequestHeaderParser.php index ea3147fb..0d998316 100644 --- a/src/Io/RequestHeaderParser.php +++ b/src/Io/RequestHeaderParser.php @@ -9,15 +9,13 @@ use Exception; /** - * [Internal] Parses an incoming request header from an input stream + * Parses an incoming request header from an input stream * * This is used internally to parse the request header from the connection and * then process the remaining connection as the request body. * * @event headers * @event error - * - * @internal */ class RequestHeaderParser extends EventEmitter implements RequestParserInterface {