From 6a553f890d2e8aeb174e140632ff05d77104f797 Mon Sep 17 00:00:00 2001 From: Cees-Jan Kiewiet Date: Wed, 4 Sep 2024 13:45:17 +0200 Subject: [PATCH] Introduce iterable to headers helper --- README.md | 29 ++++++++++++++++++++-------- src/Headers.php | 20 +++++++++++++++++++ tests/HeadersTest.php | 45 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 86 insertions(+), 8 deletions(-) create mode 100644 src/Headers.php create mode 100644 tests/HeadersTest.php diff --git a/README.md b/README.md index 7675295..f4e2b27 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,12 @@ This middleware adds all the headers passed into the constructor to the response # Usage ```php -$server = new \React\Http\HttpServer([ +use React\Http\HttpServer; +use WyriHaximus\React\Http\Middleware\Header; +use WyriHaximus\React\Http\Middleware\WithHeadersMiddleware; +use WyriHaximus\React\Http\Middleware\WithRandomHeadersMiddleware; + +$server = new HttpServer([ /** Other middleware */ new WithHeadersMiddleware( 'X-Powered-By' => 'wyrihaximus.net (11.0.33)', @@ -39,21 +44,29 @@ Combined with [`wyrihaximus-net/x-headers`](https://github.com/WyriHaximusNet/ph set of Nerdy headers: ```php -$server = new \React\Http\HttpServer([ +use React\Http\HttpServer; +use WyriHaximus\React\Http\Middleware\Headers; +use WyriHaximus\React\Http\Middleware\WithRandomHeadersMiddleware; +use WyriHaximusNet\XHeaders; + +$server = new HttpServer([ /** Other middleware */ new WithRandomHeadersMiddleware( 1, - ceil(count(Headers::HEADERS) / 4), // Add up to 25% of the list to it - ...(static function (array $headers): iterable { - foreach ($headers as $key => $value) { - yield new Header($key, $value); - } - })(Headers::HEADERS), + ceil(count(XHeaders\Headers::HEADERS) / 4), // Add up to 25% of the list to it + ...Headers::fromIterable(XHeaders\Headers::HEADERS), ), /** Other middleware */ ]); ``` +This uses the `Headers` helper that can transform key value iterables like the following to an iterable with `Header` objects: +```php +[ + 'X-Header' => 'contents', +] +``` + # License The MIT License (MIT) diff --git a/src/Headers.php b/src/Headers.php new file mode 100644 index 0000000..0b627ac --- /dev/null +++ b/src/Headers.php @@ -0,0 +1,20 @@ + $headers + * + * @return iterable
+ */ + public static function fromIterable(iterable $headers): iterable + { + foreach ($headers as $header => $contents) { + yield new Header($header, $contents); + } + } +} diff --git a/tests/HeadersTest.php b/tests/HeadersTest.php new file mode 100644 index 0000000..693a5b0 --- /dev/null +++ b/tests/HeadersTest.php @@ -0,0 +1,45 @@ + $headers + * + * @test + * @dataProvider provideHeaderIterables + */ + public function fromIterable(iterable $headers): void + { + $headerObjects = [...Headers::fromIterable($headers)]; + + self::assertCount(2, $headerObjects); + + self::assertSame('X-A', $headerObjects[0]->header); + self::assertSame('a', $headerObjects[0]->contents); + + self::assertSame('X-B', $headerObjects[1]->header); + self::assertSame('b', $headerObjects[1]->contents); + } + + /** @return iterable>> */ + public static function provideHeaderIterables(): iterable + { + $headers = [ + 'X-A' => 'a', + 'X-B' => 'b', + ]; + + yield [$headers]; + + yield [ + (static fn (): iterable => yield from $headers)(), + ]; + } +}