diff --git a/.docs/README.md b/.docs/README.md index e754de2..8a9b559 100644 --- a/.docs/README.md +++ b/.docs/README.md @@ -17,6 +17,7 @@ The middlewares / relay conception is a strong pattern with many benefits. - [BasicAuthMiddleware](#basicauthmiddleware) - [BuilderMiddleware](#buildermiddleware) - [EnforceHttpsMiddleware](#enforcehttpsmiddleware) + - [LoggingMiddleware](#loggingmiddleware) - [PresenterMiddleware](#presentermiddleware) - [SecurityMiddleware](#securitymiddleware) - [TracyMiddleware](#tracymiddleware) @@ -269,6 +270,17 @@ middleware: - Contributte\Middlewares\EnforceHttpsMiddleware ``` +#### `LoggingMiddleware` + +Log uri for each request. +Also removes password from that uri for security reasons. + +```yaml +middleware: + middlewares: + - Contributte\Middlewares\LoggingMiddleware($psr3Logger) +``` + #### `PresenterMiddleware` This middleware simulates original nette application behaviours. It converts Psr7Request to `Nette\Application\Request` diff --git a/src/LoggingMiddleware.php b/src/LoggingMiddleware.php new file mode 100644 index 0000000..afafab1 --- /dev/null +++ b/src/LoggingMiddleware.php @@ -0,0 +1,30 @@ +logger = $logger; + } + + public function __invoke(ServerRequestInterface $request, ResponseInterface $response, callable $next): ResponseInterface + { + $uri = $request->getUri(); + [$user, $password] = explode(':', $uri->getUserInfo()); + $loggableUri = (string) $uri->withUserInfo($user, ''); // Remove password for security reasons + $this->logger->info($loggableUri); + + return $next($request, $response); + } + +} diff --git a/tests/cases/LoggingMiddleware.phpt b/tests/cases/LoggingMiddleware.phpt new file mode 100644 index 0000000..47c4989 --- /dev/null +++ b/tests/cases/LoggingMiddleware.phpt @@ -0,0 +1,124 @@ +url = $message; + } + + /** + * @param string $message + * @param mixed[] $context + * @phpcsSuppress SlevomatCodingStandard.TypeHints.TypeHintDeclaration.MissingParameterTypeHint + */ + public function debug($message, array $context = []): void + { + } + + /** + * @param string $message + * @param mixed[] $context + * @phpcsSuppress SlevomatCodingStandard.TypeHints.TypeHintDeclaration.MissingParameterTypeHint + */ + public function log($level, $message, array $context = []): void + { + } + + public function get(): string + { + return $this->url; + } + + }; + + $response = Psr7ResponseFactory::fromGlobal(); + $middleware = new LoggingMiddleware($logger); + $response = $middleware( + Psr7ServerRequestFactory::fromSuperGlobal()->withNewUri('https://user:password@example.com/foo/bar'), + $response, + function (ServerRequestInterface $psr7Request, ResponseInterface $psr7Response): ResponseInterface { + return $psr7Response; + } + ); + + Assert::same('https://user@example.com/foo/bar', $logger->get()); +});