55namespace Phenix ;
66
77use Amp \Cluster \Cluster ;
8- use Amp \Http \Server \DefaultErrorHandler ;
98use Amp \Http \Server \Driver \ConnectionLimitingClientFactory ;
109use Amp \Http \Server \Driver \ConnectionLimitingServerSocketFactory ;
1110use Amp \Http \Server \Driver \SocketClientFactory ;
11+ use Amp \Http \Server \ExceptionHandler as ExceptionHandlerContract ;
1212use Amp \Http \Server \Middleware ;
1313use Amp \Http \Server \Middleware \CompressionMiddleware ;
14+ use Amp \Http \Server \Middleware \ExceptionHandlerMiddleware ;
1415use Amp \Http \Server \Middleware \ForwardedHeaderType ;
1516use Amp \Http \Server \RequestHandler ;
1617use Amp \Http \Server \Router ;
3334use Phenix \Facades \Config ;
3435use Phenix \Facades \Route ;
3536use Phenix \Http \Constants \Protocol ;
37+ use Phenix \Http \ErrorHandler as AppErrorHandler ;
38+ use Phenix \Http \ExceptionHandler as AppExceptionHandler ;
3639use Phenix \Logging \LoggerFactory ;
3740use Phenix \Runtime \Log ;
3841use Phenix \Scheduling \TimerRegistry ;
@@ -60,7 +63,9 @@ class App implements AppContract, Makeable
6063
6164 protected bool $ signalTrapping = true ;
6265
63- protected DefaultErrorHandler $ errorHandler ;
66+ protected AppErrorHandler $ errorHandler ;
67+
68+ protected ExceptionHandlerContract $ exceptionHandler ;
6469
6570 protected Protocol $ protocol = Protocol::HTTP ;
6671
@@ -75,7 +80,8 @@ public function __construct(string $path)
7580 self ::$ path = $ path ;
7681 self ::$ container = new Container ();
7782
78- $ this ->errorHandler = new DefaultErrorHandler ();
83+ $ this ->errorHandler = new AppErrorHandler ();
84+ $ this ->exceptionHandler = new AppExceptionHandler ($ this ->errorHandler );
7985 }
8086
8187 public function setup (): void
@@ -242,18 +248,24 @@ protected function createServer(): SocketHttpServer
242248 }
243249
244250 return SocketHttpServer::createForBehindProxy (
245- $ this ->logger ,
246- ForwardedHeaderType::XForwardedFor,
247- $ trustedProxies
251+ logger: $ this ->logger ,
252+ headerType: ForwardedHeaderType::XForwardedFor,
253+ trustedProxies: $ trustedProxies ,
254+ exceptionHandler: $ this ->exceptionHandler
248255 );
249256 }
250257
251- return SocketHttpServer::createForDirectAccess ($ this ->logger );
258+ return SocketHttpServer::createForDirectAccess (
259+ logger: $ this ->logger ,
260+ exceptionHandler: $ this ->exceptionHandler
261+ );
252262 }
253263
254264 protected function createClusterServer (): SocketHttpServer
255265 {
256- $ middleware = [];
266+ $ middleware = [
267+ new ExceptionHandlerMiddleware ($ this ->exceptionHandler ),
268+ ];
257269 $ allowedMethods = Middleware \AllowedMethodsMiddleware::DEFAULT_ALLOWED_METHODS ;
258270
259271 if (extension_loaded ('zlib ' )) {
@@ -271,34 +283,34 @@ protected function createClusterServer(): SocketHttpServer
271283 $ middleware [] = new Middleware \ForwardedMiddleware (ForwardedHeaderType::XForwardedFor, $ trustedProxies );
272284
273285 return new SocketHttpServer (
274- $ this ->logger ,
275- Cluster::getServerSocketFactory (),
276- new SocketClientFactory ($ this ->logger ),
277- $ middleware ,
278- $ allowedMethods ,
286+ logger: $ this ->logger ,
287+ serverSocketFactory: Cluster::getServerSocketFactory (),
288+ clientFactory: new SocketClientFactory (logger: $ this ->logger ),
289+ middleware: $ middleware ,
290+ allowedMethods: $ allowedMethods ,
279291 );
280292 }
281293
282294 $ connectionLimit = 1000 ;
283295 $ connectionLimitPerIp = 10 ;
284296
285297 $ serverSocketFactory = new ConnectionLimitingServerSocketFactory (
286- new LocalSemaphore ($ connectionLimit ),
287- Cluster::getServerSocketFactory (),
298+ semaphore: new LocalSemaphore ($ connectionLimit ),
299+ socketServerFactory: Cluster::getServerSocketFactory (),
288300 );
289301
290302 $ clientFactory = new ConnectionLimitingClientFactory (
291- new SocketClientFactory ($ this ->logger ),
292- $ this ->logger ,
293- $ connectionLimitPerIp ,
303+ clientFactory: new SocketClientFactory (logger: $ this ->logger ),
304+ logger: $ this ->logger ,
305+ connectionsPerIpLimit: $ connectionLimitPerIp ,
294306 );
295307
296308 return new SocketHttpServer (
297- $ this ->logger ,
298- $ serverSocketFactory ,
299- $ clientFactory ,
300- $ middleware ,
301- $ allowedMethods ,
309+ logger: $ this ->logger ,
310+ serverSocketFactory: $ serverSocketFactory ,
311+ clientFactory: $ clientFactory ,
312+ middleware: $ middleware ,
313+ allowedMethods: $ allowedMethods ,
302314 );
303315 }
304316
0 commit comments