Skip to content

Commit 95b2cc4

Browse files
authored
Merge pull request #4 from php-api-clients/content-type-check
Content-Type checks
2 parents 2715b99 + cc062ee commit 95b2cc4

File tree

3 files changed

+93
-1
lines changed

3 files changed

+93
-1
lines changed

src/JsonDecodeMiddleware.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,16 @@ public function post(
4848
return resolve($response);
4949
}
5050

51+
if (!isset($options[self::class]) &&
52+
$response->getHeaderLine('Content-Type') !== 'application/json') {
53+
return resolve($response);
54+
}
55+
56+
if (isset($options[self::class][Options::CONTENT_TYPE]) &&
57+
$response->getHeaderLine('Content-Type') !== $options[self::class][Options::CONTENT_TYPE]) {
58+
return resolve($response);
59+
}
60+
5161
$body = (string)$response->getBody();
5262
if ($body === '') {
5363
$stream = new BufferStream(0);

src/Options.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?php declare(strict_types=1);
2+
3+
namespace ApiClients\Middleware\Json;
4+
5+
final class Options
6+
{
7+
const CONTENT_TYPE = 'CONTENT_TYPE';
8+
const NO_CONTENT_TYPE_CHECK = 'NO_CONTENT_TYPE_CHECK';
9+
}

tests/JsonDecodeMiddlewareTest.php

Lines changed: 74 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use ApiClients\Middleware\Json\JsonStream;
66
use ApiClients\Middleware\Json\JsonDecodeMiddleware;
7+
use ApiClients\Middleware\Json\Options;
78
use ApiClients\Tools\Json\JsonDecodeService;
89
use ApiClients\Tools\TestUtilities\TestCase;
910
use Clue\React\Buzz\Message\ReadableBodyStream;
@@ -19,7 +20,7 @@ public function testPost()
1920
$loop = Factory::create();
2021
$service = new JsonDecodeService($loop);
2122
$middleware = new JsonDecodeMiddleware($service);
22-
$response = new Response(200, [], '[]');
23+
$response = new Response(200, ['Content-Type' => 'application/json'], '[]');
2324

2425
$body = await(
2526
$middleware->post($response, 'abc'),
@@ -34,6 +35,78 @@ public function testPost()
3435
);
3536
}
3637

38+
public function testPostNoContentType()
39+
{
40+
$loop = Factory::create();
41+
$service = new JsonDecodeService($loop);
42+
$middleware = new JsonDecodeMiddleware($service);
43+
$response = new Response(200, [], '[]');
44+
45+
self::assertSame(
46+
$response,
47+
await(
48+
$middleware->post($response, 'abc'),
49+
$loop
50+
)
51+
);
52+
}
53+
54+
public function testPostNoContentTypeCheck()
55+
{
56+
$loop = Factory::create();
57+
$service = new JsonDecodeService($loop);
58+
$middleware = new JsonDecodeMiddleware($service);
59+
$response = new Response(200, [], '[]');
60+
61+
$body = await(
62+
$middleware->post(
63+
$response,
64+
'abc',
65+
[
66+
JsonDecodeMiddleware::class => [
67+
Options::NO_CONTENT_TYPE_CHECK => true,
68+
],
69+
]
70+
),
71+
$loop
72+
)->getBody();
73+
74+
self::assertInstanceOf(JsonStream::class, $body);
75+
76+
self::assertSame(
77+
[],
78+
$body->getJson()
79+
);
80+
}
81+
82+
public function testPostCustomTYpe()
83+
{
84+
$loop = Factory::create();
85+
$service = new JsonDecodeService($loop);
86+
$middleware = new JsonDecodeMiddleware($service);
87+
$response = new Response(200, ['Content-Type' => 'custom/type'], '[]');
88+
89+
$body = await(
90+
$middleware->post(
91+
$response,
92+
'abc',
93+
[
94+
JsonDecodeMiddleware::class => [
95+
Options::CONTENT_TYPE => 'custom/type',
96+
],
97+
]
98+
),
99+
$loop
100+
)->getBody();
101+
102+
self::assertInstanceOf(JsonStream::class, $body);
103+
104+
self::assertSame(
105+
[],
106+
$body->getJson()
107+
);
108+
}
109+
37110
public function testPostNoJson()
38111
{
39112
$loop = Factory::create();

0 commit comments

Comments
 (0)