Persistent   A
last analyzed

Complexity

Total Complexity 3

Size/Duplication

Total Lines 44
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 3
eloc 18
dl 0
loc 44
c 0
b 0
f 0
rs 10

1 Method

Rating   Name   Duplication   Size   Complexity  
A assign() 0 30 3
1
<?php
2
/**
3
 * HTTP client persistent
4
 * User: moyo
5
 * Date: 2018/4/13
6
 * Time: 10:25 AM
7
 */
8
9
namespace Carno\HTTP\Client;
10
11
use Carno\HTTP\Client;
12
use Carno\HTTP\Options as HOptions;
13
use Carno\Net\Address;
14
use Carno\Pool\Options as POptions;
15
use Carno\Pool\Pool;
16
17
class Persistent
18
{
19
    /**
20
     * @var Client[]
21
     */
22
    private static $keeps = [];
23
24
    /**
25
     * @param string $host
26
     * @param int $port
27
     * @param array $headers
28
     * @param HOptions $options
29
     * @return Client
30
     */
31
    public static function assign(string $host, int $port, array $headers, HOptions $options = null) : Client
32
    {
33
        $pk = "{$host}:{$port}";
34
35
        if (isset(self::$keeps[$pk])) {
36
            return self::$keeps[$pk];
37
        }
38
39
        $hsl = array_change_key_case($headers, CASE_LOWER);
40
41
        if (strtolower($hsl['connection'] ?? '') === 'keep-alive') {
42
            self::$keeps[$pk] = $cli = new Client(
43
                ($options ?? (new HOptions)->setTimeouts())
44
                    ->keepalive(
45
                        new POptions(1, 128, 4, 0, 55, 15, 0, 2000, 1000),
46
                        sprintf('http:%s:%d', $host, $port)
47
                    ),
48
                new Address($host, $port)
49
            );
50
51
            $cli->keepalived(static function (Pool $pool) use ($pk) {
52
                $pool->closed()->then(function () use ($pk) {
53
                    unset(self::$keeps[$pk]);
54
                });
55
            });
56
57
            return $cli;
58
        }
59
60
        return new Client($options ?? new HOptions);
61
    }
62
}
63