output = $output; } public function handleRequest(RequestInterface $request, callable $next, callable $first): Promise { return $next($request)->then( function (ResponseInterface $response) use ($request) { $this->logSuccess($request, $response); return $response; }, function (ClientExceptionInterface $exception) use ($request) { $this->logError($request, $exception); throw $exception; } ); } private function logSuccess(RequestInterface $request, ResponseInterface $response): void { $methodAndPath = $request->getMethod() . ' ' . $request->getUri()->getPath(); $protocol = $response->getProtocolVersion(); $responseCode = $response->getStatusCode(); \fprintf($this->output, '<%s HTTP/%s> %s', $methodAndPath, $protocol, $responseCode); \fwrite($this->output, "\n"); } private function logError(RequestInterface $request, ClientExceptionInterface $exception): void { $methodAndPath = $request->getMethod() . ' ' . $request->getUri()->getPath(); $protocol = $request->getProtocolVersion(); $error = $exception->getMessage(); $responseCode = $exception->getCode(); \fprintf($this->output, '<%s HTTP/%s> %s %s', $methodAndPath, $responseCode, $error, $protocol); \fwrite($this->output, "\n"); } }