Skip to content

Commit 35f5a42

Browse files
committed
fix: error handling, cookies
1 parent cb7cf1d commit 35f5a42

File tree

5 files changed

+85
-35
lines changed

5 files changed

+85
-35
lines changed

src/CookieManager.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,14 @@ public function addCookieToResponse(
3636

3737
$this->cookies->offsetGet($request)->add($cookie);
3838
}
39+
40+
/**
41+
* @return Set<Cookie>
42+
*/
43+
public function getRequestCookies(ServerRequestInterface $request): Set
44+
{
45+
return $this->cookies->offsetExists($request)
46+
? $this->cookies->offsetGet($request)
47+
: new Set();
48+
}
3949
}

src/HttpRecursiveResponder.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,11 @@ public function respondRecursive(
3030
$responder = $this->processMiddlewares($request, $response, $responder);
3131

3232
if ($responder instanceof HttpResponderInterface) {
33-
$forwardedResponder = $responder->respond($request, $response);
34-
35-
if ($forwardedResponder !== $responder) {
36-
return $this->respondRecursive($request, $response, $forwardedResponder);
37-
}
33+
return $this->respondRecursive(
34+
$request,
35+
$response,
36+
$responder->respond($request, $response),
37+
);
3838
}
3939

4040
if ($responder instanceof HttpInterceptableInterface) {

src/HttpResponderAggregate.php

Lines changed: 41 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
use Psr\Http\Message\ResponseInterface;
1919
use Psr\Http\Message\ServerRequestInterface;
2020
use Psr\Http\Server\RequestHandlerInterface;
21+
use Psr\Log\LoggerInterface;
2122
use Swoole\Http\Request;
2223
use Swoole\Http\Response;
2324
use Symfony\Component\Routing\Exception\MethodNotAllowedException;
@@ -35,6 +36,7 @@ public function __construct(
3536
private HttpRecursiveResponder $recursiveResponder,
3637
private HttpResponderCollection $httpResponderCollection,
3738
private HttpRouteMatchRegistry $routeMatchRegistry,
39+
private LoggerInterface $logger,
3840
private MethodNotAllowed $methodNotAllowed,
3941
private PageNotFound $pageNotFound,
4042
private PsrSwooleResponder $psrSwooleResponder,
@@ -59,36 +61,53 @@ public function respondToPsrRequest(
5961
ServerRequestInterface $request,
6062
ResponseInterface $response,
6163
): ResponseInterface {
62-
$responder = $this->selectResponder($request);
63-
6464
try {
65-
return $this->recursiveResponder->respondRecursive($request, $response, $responder);
65+
$responder = $this->selectResponder($request);
66+
67+
try {
68+
return $this->recursiveResponder->respondRecursive($request, $response, $responder);
69+
} catch (Throwable $throwable) {
70+
$this->eventDispatcher->dispatch(new UnhandledException($throwable));
71+
72+
return $this->recursiveResponder->respondRecursive(
73+
$request,
74+
$response,
75+
$this->serverError->sendThrowable($request, $response, $throwable),
76+
);
77+
} finally {
78+
$this->eventDispatcher->dispatch(new HttpResponseReady($responder, $request));
79+
}
6680
} catch (Throwable $throwable) {
67-
$this->eventDispatcher->dispatch(new UnhandledException($throwable));
68-
69-
return $this->recursiveResponder->respondRecursive(
70-
$request,
71-
$response,
72-
$this->serverError->sendThrowable($request, $response, $throwable),
73-
);
74-
} finally {
75-
$this->eventDispatcher->dispatch(new HttpResponseReady($responder, $request));
81+
$this->logger->error(sprintf(
82+
'http_psr_responder_failure(%s)',
83+
(string) $throwable,
84+
));
7685
}
7786
}
7887

7988
public function respondToSwooleRequest(Request $request, Response $response): void
8089
{
81-
$this->psrSwooleResponder->respondWithPsrResponse(
82-
$response,
83-
$this->respondToPsrRequest(
84-
new SwooleServerRequest(
85-
applicationConfiguration: $this->applicationConfiguration,
86-
request: $request,
87-
swooleConfiguration: $this->swooleConfiguration,
90+
try {
91+
$psrRequest = new SwooleServerRequest(
92+
applicationConfiguration: $this->applicationConfiguration,
93+
request: $request,
94+
swooleConfiguration: $this->swooleConfiguration,
95+
);
96+
97+
$this->psrSwooleResponder->respondWithPsrResponse(
98+
$psrRequest,
99+
$response,
100+
$this->respondToPsrRequest(
101+
$psrRequest,
102+
new SwooleServerResponse($response),
88103
),
89-
new SwooleServerResponse($response),
90-
),
91-
);
104+
);
105+
} catch (Throwable $throwable) {
106+
$this->logger->error(sprintf(
107+
'http_swoole_responder_failure(%s)',
108+
(string) $throwable,
109+
));
110+
}
92111
}
93112

94113
/**

src/PsrSwooleResponder.php

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,18 @@
66

77
use Distantmagic\Resonance\Attribute\Singleton;
88
use Psr\Http\Message\ResponseInterface;
9+
use Psr\Http\Message\ServerRequestInterface;
910
use Swoole\Http\Response;
1011

1112
#[Singleton]
1213
readonly class PsrSwooleResponder
1314
{
15+
public function __construct(
16+
private CookieManager $cookieManager,
17+
) {}
18+
1419
public function respondWithPsrResponse(
20+
ServerRequestInterface $request,
1521
Response $response,
1622
ResponseInterface $psrResponse,
1723
): void {
@@ -30,16 +36,31 @@ public function respondWithPsrResponse(
3036
}
3137
}
3238

39+
foreach ($this->cookieManager->getRequestCookies($request) as $cookie) {
40+
$response->cookie(
41+
name: $cookie->getName(),
42+
value: $cookie->getValue(),
43+
expires: $cookie->getExpiresTime(),
44+
path: $cookie->getPath(),
45+
domain: $cookie->getDomain() ?? '',
46+
secure: $cookie->isSecure(),
47+
httponly: $cookie->isHttpOnly(),
48+
samesite: $cookie->getSameSite() ?? '',
49+
);
50+
}
51+
3352
if (is_string($sendfile)) {
3453
if (!$response->sendfile($sendfile)) {
3554
$response->status(500, 'Unable to send file');
3655
}
37-
} else {
38-
$response->status(
39-
$psrResponse->getStatusCode(),
40-
$psrResponse->getReasonPhrase(),
41-
);
42-
$response->end($psrResponse->getBody()->getContents());
56+
57+
return;
4358
}
59+
60+
$response->status(
61+
$psrResponse->getStatusCode(),
62+
$psrResponse->getReasonPhrase(),
63+
);
64+
$response->end($psrResponse->getBody()->getContents());
4465
}
4566
}

src/WebSocketServerController.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,14 +69,14 @@ public function handleServerPipeMessage(ServerPipeMessageInterface $serverPipeMe
6969

7070
public function onClose(int $fd): void
7171
{
72-
$this->logger->debug(sprintf('websocket_close(%s)', $fd));
73-
7472
$this->webSocketServerConnectionTable->unregisterConnection($fd);
7573

7674
if (!$this->protocolControllers->hasKey($fd)) {
7775
return;
7876
}
7977

78+
$this->logger->debug(sprintf('websocket_close(%s)', $fd));
79+
8080
$this->protocolControllers->get($fd)->onClose($fd);
8181
$this->protocolControllers->remove($fd);
8282
}

0 commit comments

Comments
 (0)