Skip to content

Commit 9430008

Browse files
committed
improve
1 parent fb3c599 commit 9430008

File tree

3 files changed

+58
-19
lines changed

3 files changed

+58
-19
lines changed

src/Renderer/HeaderRenderer.php

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,25 +15,40 @@
1515
*/
1616
final class HeaderRenderer implements ThrowableRendererInterface
1717
{
18-
private const CONTENT_TYPE = '*/*';
18+
public function __construct(
19+
private readonly ?string $contentType = null,
20+
) {
21+
}
1922

2023
public function render(Throwable $t, ?ServerRequestInterface $request = null): ErrorData
2124
{
22-
return new ErrorData('', [
23-
'X-Error-Message' => self::DEFAULT_ERROR_MESSAGE,
24-
Header::CONTENT_TYPE => self::CONTENT_TYPE,
25-
]);
25+
return new ErrorData(
26+
'',
27+
$this->addContentTypeHeader([
28+
'X-Error-Message' => self::DEFAULT_ERROR_MESSAGE,
29+
]),
30+
);
2631
}
2732

2833
public function renderVerbose(Throwable $t, ?ServerRequestInterface $request = null): ErrorData
2934
{
30-
return new ErrorData('', [
31-
'X-Error-Type' => $t::class,
32-
'X-Error-Message' => $t->getMessage(),
33-
'X-Error-Code' => (string) $t->getCode(),
34-
'X-Error-File' => $t->getFile(),
35-
'X-Error-Line' => (string) $t->getLine(),
36-
Header::CONTENT_TYPE => self::CONTENT_TYPE,
37-
]);
35+
return new ErrorData(
36+
'',
37+
$this->addContentTypeHeader([
38+
'X-Error-Type' => $t::class,
39+
'X-Error-Message' => $t->getMessage(),
40+
'X-Error-Code' => (string) $t->getCode(),
41+
'X-Error-File' => $t->getFile(),
42+
'X-Error-Line' => (string) $t->getLine(),
43+
]),
44+
);
45+
}
46+
47+
private function addContentTypeHeader(array $headers): array
48+
{
49+
if ($this->contentType !== null) {
50+
$headers[Header::CONTENT_TYPE] = $this->contentType;
51+
}
52+
return $headers;
3853
}
3954
}

src/Renderer/PlainTextRenderer.php

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,21 +17,24 @@
1717
*/
1818
final class PlainTextRenderer implements ThrowableRendererInterface
1919
{
20-
private const CONTENT_TYPE = 'text/plain';
20+
public function __construct(
21+
private readonly string $contentType = 'text/plain',
22+
) {
23+
}
2124

2225
public function render(Throwable $t, ?ServerRequestInterface $request = null): ErrorData
2326
{
2427
return new ErrorData(
2528
self::DEFAULT_ERROR_MESSAGE,
26-
[Header::CONTENT_TYPE => self::CONTENT_TYPE],
29+
[Header::CONTENT_TYPE => $this->contentType],
2730
);
2831
}
2932

3033
public function renderVerbose(Throwable $t, ?ServerRequestInterface $request = null): ErrorData
3134
{
3235
return new ErrorData(
3336
self::throwableToString($t),
34-
[Header::CONTENT_TYPE => self::CONTENT_TYPE],
37+
[Header::CONTENT_TYPE => $this->contentType],
3538
);
3639
}
3740

src/RendererProvider/HeadRendererProvider.php

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,38 @@
44

55
namespace Yiisoft\ErrorHandler\RendererProvider;
66

7+
use InvalidArgumentException;
78
use Psr\Http\Message\ServerRequestInterface;
89
use Yiisoft\ErrorHandler\Renderer\HeaderRenderer;
910
use Yiisoft\ErrorHandler\ThrowableRendererInterface;
11+
use Yiisoft\Http\Header;
12+
use Yiisoft\Http\HeaderValueHelper;
1013
use Yiisoft\Http\Method;
1114

1215
final class HeadRendererProvider implements RendererProviderInterface
1316
{
1417
public function get(ServerRequestInterface $request): ?ThrowableRendererInterface
1518
{
16-
return $request->getMethod() === Method::HEAD
17-
? new HeaderRenderer()
18-
: null;
19+
if ($request->getMethod() === Method::HEAD) {
20+
return new HeaderRenderer(
21+
$this->getAcceptContentType($request),
22+
);
23+
}
24+
25+
return null;
26+
}
27+
28+
private function getAcceptContentType(ServerRequestInterface $request): ?string
29+
{
30+
$acceptHeader = $request->getHeader(Header::ACCEPT);
31+
32+
try {
33+
$contentTypes = HeaderValueHelper::getSortedAcceptTypes($acceptHeader);
34+
} catch (InvalidArgumentException) {
35+
// The "Accept" header contains an invalid "q" factor.
36+
return null;
37+
}
38+
39+
return empty($contentTypes) ? null : reset($contentTypes);
1940
}
2041
}

0 commit comments

Comments
 (0)