Chris@0: >>>>>>>\n{request}\n<<<<<<<<\n{response}\n--------\n{error}"; Chris@0: const SHORT = '[{ts}] "{method} {target} HTTP/{version}" {code}'; Chris@0: Chris@0: /** @var string Template used to format log messages */ Chris@0: private $template; Chris@0: Chris@0: /** Chris@0: * @param string $template Log message template Chris@0: */ Chris@0: public function __construct($template = self::CLF) Chris@0: { Chris@0: $this->template = $template ?: self::CLF; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Returns a formatted message string. Chris@0: * Chris@0: * @param RequestInterface $request Request that was sent Chris@0: * @param ResponseInterface $response Response that was received Chris@0: * @param \Exception $error Exception that was received Chris@0: * Chris@0: * @return string Chris@0: */ Chris@0: public function format( Chris@0: RequestInterface $request, Chris@0: ResponseInterface $response = null, Chris@0: \Exception $error = null Chris@0: ) { Chris@0: $cache = []; Chris@0: Chris@0: return preg_replace_callback( Chris@0: '/{\s*([A-Za-z_\-\.0-9]+)\s*}/', Chris@0: function (array $matches) use ($request, $response, $error, &$cache) { Chris@0: if (isset($cache[$matches[1]])) { Chris@0: return $cache[$matches[1]]; Chris@0: } Chris@0: Chris@0: $result = ''; Chris@0: switch ($matches[1]) { Chris@0: case 'request': Chris@0: $result = Psr7\str($request); Chris@0: break; Chris@0: case 'response': Chris@0: $result = $response ? Psr7\str($response) : ''; Chris@0: break; Chris@0: case 'req_headers': Chris@0: $result = trim($request->getMethod() Chris@0: . ' ' . $request->getRequestTarget()) Chris@0: . ' HTTP/' . $request->getProtocolVersion() . "\r\n" Chris@0: . $this->headers($request); Chris@0: break; Chris@0: case 'res_headers': Chris@0: $result = $response ? Chris@0: sprintf( Chris@0: 'HTTP/%s %d %s', Chris@0: $response->getProtocolVersion(), Chris@0: $response->getStatusCode(), Chris@0: $response->getReasonPhrase() Chris@0: ) . "\r\n" . $this->headers($response) Chris@0: : 'NULL'; Chris@0: break; Chris@0: case 'req_body': Chris@0: $result = $request->getBody(); Chris@0: break; Chris@0: case 'res_body': Chris@0: $result = $response ? $response->getBody() : 'NULL'; Chris@0: break; Chris@0: case 'ts': Chris@0: case 'date_iso_8601': Chris@0: $result = gmdate('c'); Chris@0: break; Chris@0: case 'date_common_log': Chris@0: $result = date('d/M/Y:H:i:s O'); Chris@0: break; Chris@0: case 'method': Chris@0: $result = $request->getMethod(); Chris@0: break; Chris@0: case 'version': Chris@0: $result = $request->getProtocolVersion(); Chris@0: break; Chris@0: case 'uri': Chris@0: case 'url': Chris@0: $result = $request->getUri(); Chris@0: break; Chris@0: case 'target': Chris@0: $result = $request->getRequestTarget(); Chris@0: break; Chris@0: case 'req_version': Chris@0: $result = $request->getProtocolVersion(); Chris@0: break; Chris@0: case 'res_version': Chris@0: $result = $response Chris@0: ? $response->getProtocolVersion() Chris@0: : 'NULL'; Chris@0: break; Chris@0: case 'host': Chris@0: $result = $request->getHeaderLine('Host'); Chris@0: break; Chris@0: case 'hostname': Chris@0: $result = gethostname(); Chris@0: break; Chris@0: case 'code': Chris@0: $result = $response ? $response->getStatusCode() : 'NULL'; Chris@0: break; Chris@0: case 'phrase': Chris@0: $result = $response ? $response->getReasonPhrase() : 'NULL'; Chris@0: break; Chris@0: case 'error': Chris@0: $result = $error ? $error->getMessage() : 'NULL'; Chris@0: break; Chris@0: default: Chris@0: // handle prefixed dynamic headers Chris@0: if (strpos($matches[1], 'req_header_') === 0) { Chris@0: $result = $request->getHeaderLine(substr($matches[1], 11)); Chris@0: } elseif (strpos($matches[1], 'res_header_') === 0) { Chris@0: $result = $response Chris@0: ? $response->getHeaderLine(substr($matches[1], 11)) Chris@0: : 'NULL'; Chris@0: } Chris@0: } Chris@0: Chris@0: $cache[$matches[1]] = $result; Chris@0: return $result; Chris@0: }, Chris@0: $this->template Chris@0: ); Chris@0: } Chris@0: Chris@0: private function headers(MessageInterface $message) Chris@0: { Chris@0: $result = ''; Chris@0: foreach ($message->getHeaders() as $name => $values) { Chris@0: $result .= $name . ': ' . implode(', ', $values) . "\r\n"; Chris@0: } Chris@0: Chris@0: return trim($result); Chris@0: } Chris@0: }