Skip to content

Commit 0fadb0e

Browse files
authored
Merge pull request #53 from WyriHaximus/introduce-iterable-to-header-helper
Introduce iterable to headers helper
2 parents eaee4bd + 6a553f8 commit 0fadb0e

File tree

3 files changed

+86
-8
lines changed

3 files changed

+86
-8
lines changed

README.md

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,12 @@ This middleware adds all the headers passed into the constructor to the response
1919
# Usage
2020

2121
```php
22-
$server = new \React\Http\HttpServer([
22+
use React\Http\HttpServer;
23+
use WyriHaximus\React\Http\Middleware\Header;
24+
use WyriHaximus\React\Http\Middleware\WithHeadersMiddleware;
25+
use WyriHaximus\React\Http\Middleware\WithRandomHeadersMiddleware;
26+
27+
$server = new HttpServer([
2328
/** Other middleware */
2429
new WithHeadersMiddleware(
2530
'X-Powered-By' => 'wyrihaximus.net (11.0.33)',
@@ -39,21 +44,29 @@ Combined with [`wyrihaximus-net/x-headers`](https://github.com/WyriHaximusNet/ph
3944
set of Nerdy headers:
4045

4146
```php
42-
$server = new \React\Http\HttpServer([
47+
use React\Http\HttpServer;
48+
use WyriHaximus\React\Http\Middleware\Headers;
49+
use WyriHaximus\React\Http\Middleware\WithRandomHeadersMiddleware;
50+
use WyriHaximusNet\XHeaders;
51+
52+
$server = new HttpServer([
4353
/** Other middleware */
4454
new WithRandomHeadersMiddleware(
4555
1,
46-
ceil(count(Headers::HEADERS) / 4), // Add up to 25% of the list to it
47-
...(static function (array $headers): iterable {
48-
foreach ($headers as $key => $value) {
49-
yield new Header($key, $value);
50-
}
51-
})(Headers::HEADERS),
56+
ceil(count(XHeaders\Headers::HEADERS) / 4), // Add up to 25% of the list to it
57+
...Headers::fromIterable(XHeaders\Headers::HEADERS),
5258
),
5359
/** Other middleware */
5460
]);
5561
```
5662

63+
This uses the `Headers` helper that can transform key value iterables like the following to an iterable with `Header` objects:
64+
```php
65+
[
66+
'X-Header' => 'contents',
67+
]
68+
```
69+
5770
# License
5871

5972
The MIT License (MIT)

src/Headers.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace WyriHaximus\React\Http\Middleware;
6+
7+
final readonly class Headers
8+
{
9+
/**
10+
* @param iterable<string, string> $headers
11+
*
12+
* @return iterable<Header>
13+
*/
14+
public static function fromIterable(iterable $headers): iterable
15+
{
16+
foreach ($headers as $header => $contents) {
17+
yield new Header($header, $contents);
18+
}
19+
}
20+
}

tests/HeadersTest.php

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace WyriHaximus\React\Tests\Http\Middleware;
6+
7+
use WyriHaximus\AsyncTestUtilities\AsyncTestCase;
8+
use WyriHaximus\React\Http\Middleware\Headers;
9+
10+
final class HeadersTest extends AsyncTestCase
11+
{
12+
/**
13+
* @param iterable<string, string> $headers
14+
*
15+
* @test
16+
* @dataProvider provideHeaderIterables
17+
*/
18+
public function fromIterable(iterable $headers): void
19+
{
20+
$headerObjects = [...Headers::fromIterable($headers)];
21+
22+
self::assertCount(2, $headerObjects);
23+
24+
self::assertSame('X-A', $headerObjects[0]->header);
25+
self::assertSame('a', $headerObjects[0]->contents);
26+
27+
self::assertSame('X-B', $headerObjects[1]->header);
28+
self::assertSame('b', $headerObjects[1]->contents);
29+
}
30+
31+
/** @return iterable<array<iterable<string, string>>> */
32+
public static function provideHeaderIterables(): iterable
33+
{
34+
$headers = [
35+
'X-A' => 'a',
36+
'X-B' => 'b',
37+
];
38+
39+
yield [$headers];
40+
41+
yield [
42+
(static fn (): iterable => yield from $headers)(),
43+
];
44+
}
45+
}

0 commit comments

Comments
 (0)