protocol = new Protocol($container, $protocolManager, 'jsonrpc-http'); $this->packer = $this->protocol->getPacker(); $this->responseBuilder = make(ResponseBuilder::class, [ 'dataFormatter' => $this->protocol->getDataFormatter(), 'packer' => $this->packer, ]); } protected function getDefaultExceptionHandler(): array { return [ HttpExceptionHandler::class, ]; } protected function createCoreMiddleware(): CoreMiddlewareInterface { return new HttpCoreMiddleware($this->container, $this->protocol, $this->responseBuilder, $this->serverName); } protected function initRequestAndResponse(SwooleRequest $request, SwooleResponse $response): array { // Initialize PSR-7 Request and Response objects. $psr7Request = Psr7Request::loadFromSwooleRequest($request); Context::set(ResponseInterface::class, $psr7Response = new Psr7Response()); if (! $this->isHealthCheck($psr7Request)) { if (strpos($psr7Request->getHeaderLine('content-type'), 'application/json') === false) { $psr7Response = $this->responseBuilder->buildErrorResponse($psr7Request, ResponseBuilder::PARSE_ERROR); } // @TODO Optimize the error handling of encode. $content = $this->packer->unpack($psr7Request->getBody()->getContents()); if (! isset($content['jsonrpc'], $content['method'], $content['params'])) { $psr7Response = $this->responseBuilder->buildErrorResponse($psr7Request, ResponseBuilder::INVALID_REQUEST); } } $psr7Request = $psr7Request->withUri($psr7Request->getUri()->withPath($content['method'] ?? '/')) ->withParsedBody($content['params'] ?? null) ->withAttribute('data', $content ?? []) ->withAttribute('request_id', $content['id'] ?? null); $this->getContext()->setData($content['context'] ?? []); Context::set(ServerRequestInterface::class, $psr7Request); Context::set(ResponseInterface::class, $psr7Response); return [$psr7Request, $psr7Response]; } protected function isHealthCheck(RequestInterface $request): bool { return $request->getHeaderLine('user-agent') === 'Consul Health Check'; } protected function getContext() { return $this->container->get(RpcContext::class); } }