Skip to content

Commit 9889225

Browse files
committed
initial commit
0 parents  commit 9889225

File tree

8 files changed

+192
-0
lines changed

8 files changed

+192
-0
lines changed

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
.idea
2+
vendor
3+
composer.lock
4+
.phpunit.result.cache

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# Http Request Middleware
2+
3+
## Installation
4+
`composer require dmt-software/http-client-middleware`

composer.json

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
{
2+
"name": "dmt-software/http-client-middleware",
3+
"description": "HTTP client request handler",
4+
"type": "library",
5+
"license": "MIT",
6+
"authors": [
7+
{
8+
"name": "Bas de Mes",
9+
"email": "bas@dmt-software.nl"
10+
}
11+
],
12+
"autoload": {
13+
"psr-4": {
14+
"DMT\\Http\\Client\\": "src/"
15+
}
16+
},
17+
"require": {
18+
"php": ">=7.4",
19+
"psr/http-message": "^1.0",
20+
"psr/http-client": "^1.0"
21+
},
22+
"autoload-dev": {
23+
"psr-4": {
24+
"DMT\\Test\\Http\\Client\\": "tests/"
25+
}
26+
},
27+
"require-dev": {
28+
"phpunit/phpunit": "^8.5 | ^9.5",
29+
"guzzlehttp/guzzle": "^7.4"
30+
}
31+
}

phpunit.xml

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
3+
<phpunit backupGlobals="false"
4+
backupStaticAttributes="false"
5+
bootstrap="vendor/autoload.php"
6+
colors="true"
7+
convertErrorsToExceptions="true"
8+
convertNoticesToExceptions="true"
9+
convertWarningsToExceptions="true"
10+
processIsolation="false"
11+
stopOnFailure="false">
12+
<testsuites>
13+
<testsuite name="Test Suite">
14+
<directory>tests/</directory>
15+
</testsuite>
16+
</testsuites>
17+
<filter>
18+
<whitelist>
19+
<directory>src/</directory>
20+
</whitelist>
21+
</filter>
22+
</phpunit>

src/MiddlewareInterface.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?php
2+
3+
namespace DMT\Http\Client;
4+
5+
use Psr\Http\Client\ClientExceptionInterface;
6+
use Psr\Http\Message\RequestInterface;
7+
use Psr\Http\Message\ResponseInterface;
8+
9+
interface MiddlewareInterface
10+
{
11+
/**
12+
* Process the request
13+
*
14+
* @param RequestInterface $request
15+
* @param RequestHandlerInterface $handler
16+
* @return ResponseInterface
17+
* @throws ClientExceptionInterface
18+
*/
19+
public function process(RequestInterface $request, RequestHandlerInterface $handler): ResponseInterface;
20+
}

src/RequestHandler.php

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<?php
2+
3+
namespace DMT\Http\Client;
4+
5+
use Psr\Http\Client\ClientExceptionInterface;
6+
use Psr\Http\Client\ClientInterface;
7+
use Psr\Http\Message\RequestInterface;
8+
use Psr\Http\Message\ResponseInterface;
9+
10+
final class RequestHandler implements RequestHandlerInterface
11+
{
12+
private ClientInterface $client;
13+
/** @var MiddlewareInterface[] */
14+
private array $middleware = [];
15+
16+
/**
17+
* @param ClientInterface $client
18+
* @param MiddlewareInterface|null ...$middleware
19+
*/
20+
public function __construct(ClientInterface $client, ?MiddlewareInterface ...$middleware)
21+
{
22+
$this->client = $client;
23+
$this->middleware = $middleware;
24+
}
25+
26+
/**
27+
* Handle the client request.
28+
*
29+
* @param RequestInterface $request
30+
* @return ResponseInterface
31+
* @throws ClientExceptionInterface
32+
*/
33+
public function handle(RequestInterface $request): ResponseInterface
34+
{
35+
while (count($this->middleware)) {
36+
return array_shift($this->middleware)->process($request, $this);
37+
}
38+
39+
return $this->client->sendRequest($request);
40+
}
41+
}

src/RequestHandlerInterface.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
namespace DMT\Http\Client;
4+
5+
use Psr\Http\Client\ClientExceptionInterface;
6+
use Psr\Http\Message\RequestInterface;
7+
use Psr\Http\Message\ResponseInterface;
8+
9+
interface RequestHandlerInterface
10+
{
11+
/**
12+
* Handle the client request.
13+
*
14+
* @param RequestInterface $request
15+
* @return ResponseInterface
16+
* @throws ClientExceptionInterface
17+
*/
18+
public function handle(RequestInterface $request): ResponseInterface;
19+
}

tests/RequestHandlerTest.php

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
<?php
2+
3+
namespace DMT\Test\Http\Client;
4+
5+
use DMT\Http\Client\MiddlewareInterface;
6+
use DMT\Http\Client\RequestHandler;
7+
use DMT\Http\Client\RequestHandlerInterface;
8+
use GuzzleHttp\Client;
9+
use GuzzleHttp\Handler\MockHandler;
10+
use GuzzleHttp\HandlerStack;
11+
use GuzzleHttp\Psr7\Request;
12+
use GuzzleHttp\Psr7\Response;
13+
use PHPUnit\Framework\TestCase;
14+
use Psr\Http\Client\ClientInterface;
15+
use Psr\Http\Message\RequestInterface;
16+
use Psr\Http\Message\ResponseInterface;
17+
18+
class RequestHandlerTest extends TestCase
19+
{
20+
public function testHandle()
21+
{
22+
$response = (new RequestHandler($this->getClient()))->handle(new Request('GET', '/'));
23+
24+
$this->assertInstanceOf(ResponseInterface::class, $response);
25+
$this->assertSame(200, $response->getStatusCode());
26+
}
27+
28+
public function testHandleWithMiddleware()
29+
{
30+
$middleware = new class implements MiddlewareInterface {
31+
public function process(RequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
32+
{
33+
return $handler->handle($request)->withStatus(404);
34+
}
35+
};
36+
37+
$response = (new RequestHandler($this->getClient(), $middleware))->handle(new Request('GET', '/'));
38+
39+
$this->assertInstanceOf(ResponseInterface::class, $response);
40+
$this->assertSame(404, $response->getStatusCode());
41+
}
42+
43+
private function getClient(): ClientInterface
44+
{
45+
return new Client([
46+
'handler' => HandlerStack::create(
47+
new MockHandler([new Response()])
48+
)
49+
]);
50+
}
51+
}

0 commit comments

Comments
 (0)