This commit is contained in:
2021-09-18 11:44:42 +08:00
parent 12ecfecf3e
commit 454b99a360
2 changed files with 96 additions and 21 deletions
+21 -2
View File
@@ -3,6 +3,7 @@
namespace Http\Handler\Abstracts;
use Http\Handler\Handler as CHl;
use Http\Message\ServerRequest;
use Kiri\Core\Help;
use Kiri\Kiri;
use Psr\Http\Message\ResponseInterface;
@@ -35,7 +36,7 @@ abstract class Handler implements RequestHandlerInterface
protected function execute(ServerRequestInterface $request): ResponseInterface
{
if (empty($this->middlewares) || !isset($this->middlewares[$this->offset])) {
return $this->dispatcher();
return $this->dispatcher($request);
}
$middleware = $this->middlewares[$this->offset];
@@ -50,10 +51,11 @@ abstract class Handler implements RequestHandlerInterface
/**
* @param ServerRequestInterface $request
* @return mixed
* @throws \Exception
*/
protected function dispatcher(): mixed
protected function dispatcher(ServerRequestInterface $request): mixed
{
if ($this->handler->callback instanceof \Closure) {
$response = call_user_func($this->handler->callback, ...$this->handler->params);
@@ -67,10 +69,27 @@ abstract class Handler implements RequestHandlerInterface
if (!($response instanceof ResponseInterface)) {
$response = $this->transferToResponse($response);
}
$response->withHeader('Run-Time', $this->_runTime($request));
return $response;
}
/**
* @param ServerRequest $request
* @return float
*/
private function _runTime(ServerRequestInterface $request): float
{
$float = microtime(true) - time();
$serverParams = $request->getServerParams();
$rTime = $serverParams['request_time_float'] - $serverParams['request_time'];
return round($float - $rTime, 6);
}
/**
* @param mixed $responseData
* @return \Server\Constrict\ResponseInterface
+75 -19
View File
@@ -4,12 +4,21 @@ namespace Server\Service;
use Exception;
use Http\Context\Context;
use Http\Exception\RequestException;
use Http\Handler\Abstracts\HandlerManager;
use Http\Handler\Dispatcher;
use Http\Handler\Handler;
use Http\Handler\TestRequest;
use Http\Message\ServerRequest;
use Http\Message\Stream;
use Http\Route\MiddlewareManager;
use Http\Route\Node;
use Kiri\Core\Help;
use Psr\Http\Message\ServerRequestInterface;
use Server\Constant;
use Server\Constrict\Request as ScRequest;
use Server\Constrict\RequestInterface;
use Server\Constrict\ResponseInterface;
use Server\Events\OnAfterRequest;
use Server\SInterface\OnClose;
@@ -54,40 +63,87 @@ class Http extends \Server\Abstracts\Http implements OnClose, OnConnect
*/
public function onRequest(Request $request, Response $response): void
{
$this->request->onRequest($request, $response);
return;
try {
if (!(($node = $this->router->radix_tree($Psr7Request = ScRequest::create($request))) instanceof Node)) {
throw new RequestException(Constant::STATUS_404_MESSAGE, 404);
[$PsrRequest, $PsrResponse] = $this->initRequestResponse($request);
/** @var Handler $handler */
$handler = HandlerManager::get($request->server['request_uri'], $request->getMethod());
if (is_integer($handler)) {
$PsrResponse->withStatus($handler)->withBody(new Stream('Allow Method[' . $request->getMethod() . '].'));
} else if (is_null($handler)) {
$PsrResponse->withStatus(404)->withBody(new Stream('Page not found.'));
} else {
$PsrResponse = $this->handler($handler, $PsrRequest);
}
if (!(($psr7Response = $node->dispatch($Psr7Request)) instanceof ResponseInterface)) {
$psr7Response = $this->transferToResponse($psr7Response);
}
$psr7Response->withHeader('Run-Time', $this->_runTime($request));
} catch (Error | \Throwable $exception) {
$psr7Response = $this->exceptionHandler->emit($exception, $this->response);
} catch (\Throwable $throwable) {
$PsrResponse = \response()->withStatus($throwable->getCode())
->withContentType(\Http\Message\Response::CONTENT_TYPE_HTML)
->withBody(new Stream(jTraceEx($throwable, null, true)));
} finally {
$this->responseEmitter->sender($response, $psr7Response);
$this->eventDispatch->dispatch(new OnAfterRequest());
$this->response->sender($response, $PsrResponse);
}
}
/**
* @param Request $request
* @return float
* @param Handler $handler
* @param $PsrRequest
* @return ResponseInterface
* @throws Exception
*/
private function _runTime(Request $request): float
protected function handler(Handler $handler, $PsrRequest): \Psr\Http\Message\ResponseInterface
{
$float = microtime(true) - time();
$middlewares = MiddlewareManager::get($handler->callback);
$rTime = $request->server['request_time_float'] - $request->server['request_time'];
$dispatcher = new Dispatcher($handler, $middlewares);
return round($float - $rTime, 6);
return $dispatcher->handle($PsrRequest);
}
/**
* @param Request $request
* @return array<ServerRequestInterface, ResponseInterface>
* @throws Exception
*/
private function initRequestResponse(Request $request): array
{
$PsrResponse = Context::setContext(ResponseInterface::class, new \Http\Message\Response());
$PsrRequest = Context::setContext(RequestInterface::class, ServerRequest::createServerRequest($request));
return [$PsrRequest, $PsrResponse];
}
//
//
//
// /**
// * @param Request $request
// * @param Response $response
// * @throws Exception
// */
// public function onRequest(Request $request, Response $response): void
// {
// $this->request->onRequest($request, $response);
// return;
//
// try {
// if (!(($node = $this->router->radix_tree($Psr7Request = ScRequest::create($request))) instanceof Node)) {
// throw new RequestException(Constant::STATUS_404_MESSAGE, 404);
// }
// if (!(($psr7Response = $node->dispatch($Psr7Request)) instanceof ResponseInterface)) {
// $psr7Response = $this->transferToResponse($psr7Response);
// }
// $psr7Response->withHeader('Run-Time', $this->_runTime($request));
// } catch (Error | \Throwable $exception) {
// $psr7Response = $this->exceptionHandler->emit($exception, $this->response);
// } finally {
// $this->responseEmitter->sender($response, $psr7Response);
// $this->eventDispatch->dispatch(new OnAfterRequest());
// }
// }
/**
* @param mixed $responseData
* @return ResponseInterface