This commit is contained in:
Yurii
2026-04-15 12:28:51 +03:00
parent 8398235f4a
commit b00f4a0c56

View File

@@ -119,19 +119,7 @@ class ErrorOutput
bool $toPrintBody = false
): void {
$message = $exception->getMessage();
$logMessage = $message;
if ($exception->getPrevious() && $exception->getPrevious()->getMessage()) {
$logMessage .= " " . $exception->getPrevious()->getMessage();
}
$statusCode = $exception->getCode();
if ($exception instanceof HasLogMessage) {
$message = $exception->getLogMessage();
$logMessage = $message;
}
[$message, $logMessage] = $this->prepareMessages($exception);
if ($route) {
$this->processRoute($route, $request, $exception);
@@ -144,11 +132,7 @@ class ErrorOutput
'request' => $request,
]);
$statusCode = $this->statusCodeMap[$exception::class] ?? $statusCode;
if (!in_array($statusCode, $this->allowedStatusCodeList)) {
$statusCode = 500;
}
$statusCode = $this->getStatusCode($exception);
$response->setStatus($statusCode);
@@ -156,25 +140,13 @@ class ErrorOutput
$response->setHeader('X-Status-Reason', $this->stripInvalidCharactersFromHeaderValue($message));
}
if ($exception instanceof HasBody && $this->exceptionHasBody($exception)) {
$response->writeBody($exception->getBody() ?? '');
$toPrintBody = false;
}
if ($toPrintBody) {
$codeDescription = $this->getCodeDescription($statusCode);
$statusText = isset($codeDescription) ?
$statusCode . ' '. $codeDescription :
'HTTP ' . $statusCode;
if ($message) {
$message = htmlspecialchars($message);
}
$response->writeBody(self::generateErrorBody($statusText, $message));
}
$this->printBody(
exception: $exception,
response: $response,
toPrintBody: $toPrintBody,
statusCode: $statusCode,
message: $message,
);
}
private function exceptionHasBody(Throwable $exception): bool
@@ -285,4 +257,69 @@ class ErrorOutput
return LogLevel::ERROR;
}
private function printBody(
Throwable $exception,
Response $response,
bool $toPrintBody,
int $statusCode,
string $message,
): void {
if ($exception instanceof HasBody && $this->exceptionHasBody($exception)) {
$response->writeBody($exception->getBody() ?? '');
$toPrintBody = false;
}
if (!$toPrintBody) {
return;
}
$codeDescription = $this->getCodeDescription($statusCode);
$statusText = isset($codeDescription) ?
$statusCode . ' ' . $codeDescription :
'HTTP ' . $statusCode;
if ($message) {
$message = htmlspecialchars($message);
}
$response->writeBody(self::generateErrorBody($statusText, $message));
}
/**
* @return array{0: string, 1: string}
*/
private function prepareMessages(Throwable $exception): array
{
$message = $exception->getMessage();
$logMessage = $message;
if ($exception->getPrevious() && $exception->getPrevious()->getMessage()) {
$logMessage .= " " . $exception->getPrevious()->getMessage();
}
if ($exception instanceof HasLogMessage) {
$message = $exception->getLogMessage();
$logMessage = $message;
}
return [$message, $logMessage];
}
/**
* @return int
*/
private function getStatusCode(Throwable $exception): int
{
$statusCode = $this->statusCodeMap[$exception::class] ?? $exception->getCode();
if (!in_array($statusCode, $this->allowedStatusCodeList)) {
$statusCode = 500;
}
return $statusCode;
}
}