From 2cb448ab9abbf730a5edce5ace140c6b911ab5a7 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 8 Nov 2026 04:08:01 +0000 Subject: [PATCH 1/2] Initial plan From 86f1677eb948b5b141f0de323cbce768f6dff08e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 8 Nov 2026 04:10:14 +0000 Subject: [PATCH 2/2] Extract shared server middleware behavior Co-authored-by: asika32764 <1639206+asika32764@users.noreply.github.com> --- packages/http/src/Server/HttpServerTrait.php | 60 +--------------- .../http/src/Server/MiddlewareAwareTrait.php | 69 +++++++++++++++++++ packages/http/src/Server/ReactServer.php | 43 +----------- packages/http/test/Server/ReactServerTest.php | 8 +-- 4 files changed, 77 insertions(+), 103 deletions(-) create mode 100644 packages/http/src/Server/MiddlewareAwareTrait.php diff --git a/packages/http/src/Server/HttpServerTrait.php b/packages/http/src/Server/HttpServerTrait.php index a36a99a20..54515cbd8 100644 --- a/packages/http/src/Server/HttpServerTrait.php +++ b/packages/http/src/Server/HttpServerTrait.php @@ -16,20 +16,19 @@ use Windwalker\Http\Middleware\RequestRunner; use Windwalker\Http\Output\OutputInterface; -use function Windwalker\DI\create; - /** * Trait HttpServerTrait */ trait HttpServerTrait { - protected ?Closure $middlewareResolver = null; + use MiddlewareAwareTrait; public function __construct( - protected array $middlewares = [], + array $middlewares = [], protected ?HttpFactory $httpFactory = null, protected ?Closure $outputBuilder = null, ) { + $this->middlewares = $middlewares; $this->adaptLegacyEvents(); } @@ -186,59 +185,6 @@ public function setHttpFactory(?HttpFactory $httpFactory): static return $this; } - public function middleware(mixed $middleware, mixed ...$args): static - { - if (is_string($middleware)) { - $middleware = create($middleware, ...$args); - } - - $this->middlewares[] = $middleware; - - return $this; - } - - /** - * @return array - */ - public function getMiddlewares(): array - { - return $this->middlewares; - } - - /** - * @param array $middlewares - * - * @return static Return self to support chaining. - * - * @codeCoverageIgnore - */ - public function setMiddlewares(array $middlewares): static - { - $this->middlewares = $middlewares; - - return $this; - } - - /** - * @return Closure - */ - public function getMiddlewareResolver(): Closure - { - return $this->middlewareResolver ?? static fn($entry) => $entry; - } - - /** - * @param Closure|null $middlewareResolver - * - * @return static Return self to support chaining. - */ - public function setMiddlewareResolver(?Closure $middlewareResolver): static - { - $this->middlewareResolver = $middlewareResolver; - - return $this; - } - /** * @return Closure|null */ diff --git a/packages/http/src/Server/MiddlewareAwareTrait.php b/packages/http/src/Server/MiddlewareAwareTrait.php new file mode 100644 index 000000000..9af1bb649 --- /dev/null +++ b/packages/http/src/Server/MiddlewareAwareTrait.php @@ -0,0 +1,69 @@ +middlewares[] = $middleware; + + return $this; + } + + /** + * @return array + */ + public function getMiddlewares(): array + { + return $this->middlewares; + } + + /** + * @param array $middlewares + * + * @return static Return self to support chaining. + * + * @codeCoverageIgnore + */ + public function setMiddlewares(array $middlewares): static + { + $this->middlewares = $middlewares; + + return $this; + } + + /** + * @return Closure + */ + public function getMiddlewareResolver(): Closure + { + return $this->middlewareResolver ?? static fn($entry) => $entry; + } + + /** + * @param Closure|null $middlewareResolver + * + * @return static Return self to support chaining. + */ + public function setMiddlewareResolver(?Closure $middlewareResolver): static + { + $this->middlewareResolver = $middlewareResolver; + + return $this; + } +} diff --git a/packages/http/src/Server/ReactServer.php b/packages/http/src/Server/ReactServer.php index 93db799bf..05f245a06 100644 --- a/packages/http/src/Server/ReactServer.php +++ b/packages/http/src/Server/ReactServer.php @@ -4,7 +4,6 @@ namespace Windwalker\Http\Server; -use Closure; use Psr\Http\Message\ServerRequestInterface; use React\EventLoop\Loop; use React\EventLoop\LoopInterface; @@ -22,18 +21,13 @@ use Windwalker\Http\Output\Output; use Windwalker\Http\Request\ServerRequest; -use function Windwalker\DI\create; - /** * The ReactServerAdapter class. */ class ReactServer implements ServerInterface { use EventAwareTrait; - - protected array $middlewares = []; - - protected ?Closure $middlewareResolver = null; + use MiddlewareAwareTrait; protected ?HttpFactory $httpFactory = null; @@ -206,41 +200,6 @@ function (Throwable $e) use ($output) { return $server; } - public function middleware(mixed $middleware, mixed ...$args): static - { - if (is_string($middleware)) { - $middleware = create($middleware, ...$args); - } - - $this->middlewares[] = $middleware; - - return $this; - } - - public function getMiddlewares(): array - { - return $this->middlewares; - } - - public function setMiddlewares(array $middlewares): static - { - $this->middlewares = $middlewares; - - return $this; - } - - public function getMiddlewareResolver(): Closure - { - return $this->middlewareResolver ?? static fn($entry) => $entry; - } - - public function setMiddlewareResolver(?Closure $middlewareResolver): static - { - $this->middlewareResolver = $middlewareResolver; - - return $this; - } - public function getHttpFactory(): HttpFactory { return $this->httpFactory ??= new HttpFactory(); diff --git a/packages/http/test/Server/ReactServerTest.php b/packages/http/test/Server/ReactServerTest.php index d1cb31a8b..50cdd6e56 100644 --- a/packages/http/test/Server/ReactServerTest.php +++ b/packages/http/test/Server/ReactServerTest.php @@ -189,10 +189,10 @@ function (RequestEvent $event) use (&$names) { #[Test] public function handleRunsMiddlewaresBeforeRequestEvent(): void { - $this->instance->middleware( - function (ServerRequestInterface $request, RequestHandlerInterface $handler) { - return $handler->handle($request->withAttribute('middleware', 'ran')); - }, + $this->instance->middleware('ran'); + $this->instance->setMiddlewareResolver( + fn(string $name) => fn(ServerRequestInterface $request, RequestHandlerInterface $handler) + => $handler->handle($request->withAttribute('middleware', $name)), ); $this->instance->on( 'request',