From ac99861c543ee67baa3c731342ce6ca81386d217 Mon Sep 17 00:00:00 2001 From: Niklas Keller Date: Wed, 30 Aug 2023 07:12:35 +0200 Subject: [PATCH] Introduce separate push event for pushed requests --- .../Internal/Http2ConnectionProcessor.php | 1 + src/EventListener.php | 5 +++++ src/EventListener/LogHttpArchive.php | 5 +++++ src/Internal/EventInvoker.php | 14 +++++++++++++- src/Internal/Phase.php | 1 + 5 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/Connection/Internal/Http2ConnectionProcessor.php b/src/Connection/Internal/Http2ConnectionProcessor.php index c48da9f4..3d7f7751 100644 --- a/src/Connection/Internal/Http2ConnectionProcessor.php +++ b/src/Connection/Internal/Http2ConnectionProcessor.php @@ -642,6 +642,7 @@ static function () { ); events()->requestStart($request); + events()->push($request); events()->requestHeaderStart($request, $stream->stream); events()->requestHeaderEnd($request, $stream->stream); events()->requestBodyStart($request, $stream->stream); diff --git a/src/EventListener.php b/src/EventListener.php index 93a6d928..bca36d09 100644 --- a/src/EventListener.php +++ b/src/EventListener.php @@ -53,6 +53,11 @@ public function networkInterceptorEnd(Request $request, NetworkInterceptor $inte */ public function connectionAcquired(Request $request, Connection $connection): void; + /** + * Called after the server initiated a push. + */ + public function push(Request $request): void; + /** * Called before the request headers are sent. */ diff --git a/src/EventListener/LogHttpArchive.php b/src/EventListener/LogHttpArchive.php index 2754ae1f..9b69b8e3 100644 --- a/src/EventListener/LogHttpArchive.php +++ b/src/EventListener/LogHttpArchive.php @@ -359,4 +359,9 @@ public function networkInterceptorEnd(Request $request, NetworkInterceptor $inte { // nothing to do } + + public function push(Request $request): void + { + // nothing to do + } } diff --git a/src/Internal/EventInvoker.php b/src/Internal/EventInvoker.php index a220e8ca..d9d31bc9 100644 --- a/src/Internal/EventInvoker.php +++ b/src/Internal/EventInvoker.php @@ -89,10 +89,22 @@ public function connectionAcquired(Request $request, Connection $connection): vo $this->invoke($request, fn (EventListener $eventListener) => $eventListener->connectionAcquired($request, $connection)); } + public function push(Request $request): void + { + $previousPhase = self::getPhase($request); + if ($previousPhase !== Phase::Blocked) { + throw new \Error('Invalid request phase transition from ' . $previousPhase->name . ' to Push'); + } + + $this->requestPhase[$request] = Phase::Push; + + $this->invoke($request, fn (EventListener $eventListener) => $eventListener->push($request)); + } + public function requestHeaderStart(Request $request, Stream $stream): void { $previousPhase = self::getPhase($request); - if ($previousPhase !== Phase::Connected && $previousPhase !== Phase::Blocked) { + if ($previousPhase !== Phase::Connected && $previousPhase !== Phase::Push) { throw new \Error('Invalid request phase transition from ' . $previousPhase->name . ' to RequestHeaders'); } diff --git a/src/Internal/Phase.php b/src/Internal/Phase.php index 7090d02c..121fbb32 100644 --- a/src/Internal/Phase.php +++ b/src/Internal/Phase.php @@ -8,6 +8,7 @@ enum Phase case Unprocessed; case Blocked; case Connected; + case Push; case RequestHeaders; case RequestBody; case ServerProcessing;