From 817daa88441c680cc43369bef5dd0c872acbdeec Mon Sep 17 00:00:00 2001 From: abdulmohsen Date: Wed, 6 Mar 2024 01:03:45 +0300 Subject: [PATCH] Added access log to the api endpoint. --- src/Libs/Initializer.php | 60 ++++++++++++++++++++++++++++------------ 1 file changed, 43 insertions(+), 17 deletions(-) diff --git a/src/Libs/Initializer.php b/src/Libs/Initializer.php index 1bb490a1..3b3d6f6b 100644 --- a/src/Libs/Initializer.php +++ b/src/Libs/Initializer.php @@ -199,6 +199,11 @@ final class Initializer if (false === $response->hasHeader('X-Application-Version')) { $response = $response->withAddedHeader('X-Application-Version', getAppVersion()); } + + if ($response->hasHeader('X-Log-Response')) { + $this->write($request, Level::Info, $this->formatLog($request, $response)); + $response = $response->withoutHeader('X-Log-Response'); + } } catch (Throwable $e) { $httpException = (true === ($e instanceof HttpException)); @@ -240,19 +245,21 @@ final class Initializer $request = $realRequest; $requestPath = $request->getUri()->getPath(); - // -- health endpoint. if (true === str_starts_with($requestPath, '/healthcheck')) { return api_response(HTTP_STATUS::HTTP_OK); } - // -- favicon endpoint. + // -- favicon. if (true === str_starts_with($requestPath, '/favicon.ico')) { - return api_response(HTTP_STATUS::HTTP_NO_CONTENT); + return api_response(HTTP_STATUS::HTTP_NOT_FOUND) + ->withoutHeader('Content-Type') + ->withHeader('Cache-Control', 'public, max-age=604800, immutable') + ->withHeader('Content-Type', 'image/x-icon'); } // -- Forward requests to API server. - if (str_starts_with($request->getUri()->getPath(), Config::get('api.prefix', '????'))) { + if (true === str_starts_with($requestPath, Config::get('api.prefix', '????'))) { return $this->defaultAPIServer($realRequest); } @@ -264,12 +271,13 @@ final class Initializer $apikey = ag($realRequest->getQueryParams(), 'apikey', $realRequest->getHeaderLine('x-apikey')); if (empty($apikey)) { - $this->write($request, Level::Info, 'No webhook token was found in header or query.', [ - 'uri' => (string)$request->getUri(), - 'headers' => $request->getHeaders(), - 'query' => $request->getQueryParams(), - ], true); - return api_response(HTTP_STATUS::HTTP_UNAUTHORIZED); + $response = api_response(HTTP_STATUS::HTTP_UNAUTHORIZED); + $this->write( + $request, + Level::Info, + $this->formatLog($request, $response, 'No webhook token was found in header or query.') + ); + return $response; } $validUser = $validUUid = null; @@ -536,12 +544,7 @@ final class Initializer })(); try { - $response = $router->dispatch($realRequest); - $this->write($realRequest, Level::Info, 'HTTP: [{status}] \'{uri}\' {method}', [ - 'status' => $response->getStatusCode(), - 'method' => $realRequest->getMethod(), - ], true); - return $response; + return $router->dispatch($realRequest)->withHeader('X-Log-Response', '1'); } /** @noinspection PhpRedundantCatchClauseInspection */ catch (RouterHttpException $e) { throw new HttpException($e->getMessage(), $e->getStatusCode()); @@ -737,10 +740,33 @@ final class Initializer $context['attributes'] = $attributes; } - if (true === ((bool)Config::get('logs.context') || $forceContext)) { + if (true === (Config::get('logs.context') || $forceContext)) { $this->accessLog->log($level, $message, $context); } else { $this->accessLog->log($level, r($message, $context)); } } + + private function formatLog(iRequest $request, ResponseInterface $response, string|null $message = null) + { + $refer = '-'; + + if (true === ag_exists($request->getServerParams(), 'HTTP_REFERER')) { + $refer = (new Uri(ag($request->getServerParams(), 'HTTP_REFERER'))) + ->withQuery('')->withFragment('')->withUserInfo(''); + } + + return r('{ip} - "{method} {uri} {protocol}" {status} {size} "{refer}" "{agent}" "{message}"', [ + 'ip' => getClientIp($request), + 'user' => ag($request->getServerParams(), 'REMOTE_USER', '-'), + 'method' => $request->getMethod(), + 'uri' => $request->getUri()->getPath(), + 'protocol' => 'HTTP/' . $request->getProtocolVersion(), + 'status' => $response->getStatusCode(), + 'size' => $response->getBody()->getSize(), + 'agent' => ag($request->getServerParams(), 'HTTP_USER_AGENT', '-'), + 'refer' => (string)$refer, + 'message' => $message ?? '-', + ]); + } }