Completed
Pull Request — master (#25)
by Joel
09:37
created

LeastUsedClientPool::chooseHttpClient()   B

Complexity

Conditions 4
Paths 2

Size

Total Lines 24
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
c 1
b 0
f 1
dl 0
loc 24
rs 8.6845
cc 4
eloc 12
nc 2
nop 0
1
<?php
2
3
namespace Http\Client\Common\HttpClientPool;
4
5
use Http\Client\Common\Exception\HttpClientNotFoundException;
6
use Http\Client\Common\HttpClientPool;
7
use Http\Client\Common\HttpClientPoolItem;
8
9
/**
10
 * LeastUsedClientPool will choose the client with the less current request in the pool.
11
 *
12
 * This strategy is only useful when doing async request
13
 *
14
 * @author Joel Wurtz <[email protected]>
15
 */
16
class LeastUsedClientPool extends HttpClientPool
17
{
18
    /**
19
     * {@inheritdoc}
20
     */
21
    public function chooseHttpClient()
22
    {
23
        $clientPool = array_filter($this->clientPool, function (HttpClientPoolItem $clientPoolItem) {
24
            return !$clientPoolItem->isDisabled();
25
        });
26
27
        if (0 === count($clientPool)) {
28
            throw new HttpClientNotFoundException('Cannot choose a http client as there is no one present in the pool');
29
        }
30
31
        usort($clientPool, function (HttpClientPoolItem $clientA, HttpClientPoolItem $clientB) {
32
            if ($clientA->getSendingRequestCount() === $clientB->getSendingRequestCount()) {
33
                return 0;
34
            }
35
36
            if ($clientA->getSendingRequestCount() < $clientB->getSendingRequestCount()) {
37
                return -1;
38
            }
39
40
            return 1;
41
        });
42
43
        return reset($clientPool);
44
    }
45
}
46