Completed
Pull Request — master (#42)
by Stéphane
04:50 queued 03:33
created

Client   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 62
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 5

Test Coverage

Coverage 90%

Importance

Changes 0
Metric Value
wmc 7
lcom 1
cbo 5
dl 0
loc 62
ccs 18
cts 20
cp 0.9
rs 10
c 0
b 0
f 0

3 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 13 5
A sendRequest() 0 6 1
A sendAsyncRequest() 0 15 1
1
<?php
2
3
namespace Http\Adapter\React;
4
5
use Http\Client\HttpClient;
6
use Http\Client\HttpAsyncClient;
7
use Psr\Http\Message\RequestInterface;
8
use Psr\Http\Message\ResponseInterface;
9
use React\EventLoop\LoopInterface;
10
use React\Http\Browser as ReactBrowser;
11
12
/**
13
 * Client for the React promise implementation.
14
 *
15
 * @author Stéphane Hulard <[email protected]>
16
 */
17
class Client implements HttpClient, HttpAsyncClient
18
{
19
    /**
20
     * React HTTP client.
21
     *
22
     * @var ReactBrowser
23
     */
24
    private $client;
25
26
    /**
27
     * React event loop.
28
     *
29
     * @var LoopInterface
30
     */
31
    private $loop;
32
33
    /**
34
     * Initialize the React client.
35
     */
36 104
    public function __construct(
37
        LoopInterface $loop = null,
38
        ReactBrowser $client = null
39
    ) {
40 104
        if (null !== $client && null === $loop) {
41
            throw new \RuntimeException(
42
                'You must give a LoopInterface instance with the Client'
43
            );
44
        }
45
46 104
        $this->loop = $loop     ?: ReactFactory::buildEventLoop();
47 104
        $this->client = $client ?: ReactFactory::buildHttpClient($this->loop);
48 104
    }
49
50
    /**
51
     * {@inheritdoc}
52
     */
53 51
    public function sendRequest(RequestInterface $request): ResponseInterface
54
    {
55 51
        $promise = $this->sendAsyncRequest($request);
56
57 51
        return $promise->wait();
58
    }
59
60
    /**
61
     * {@inheritdoc}
62
     */
63 104
    public function sendAsyncRequest(RequestInterface $request)
64
    {
65 104
        $promise = new Promise(
66 104
            $this->client->request(
67 104
                $request->getMethod(),
68 104
                $request->getUri(),
69 104
                $request->getHeaders(),
70 104
                $request->getBody()
71
            ),
72 104
            $this->loop,
73 104
            $request
74
        );
75
76 104
        return $promise;
77
    }
78
}
79