Remote   A
last analyzed

Complexity

Total Complexity 4

Size/Duplication

Total Lines 43
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 11
dl 0
loc 43
rs 10
c 0
b 0
f 0
wmc 4

2 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
A peer() 0 15 3
1
<?php
2
/**
3
 * Controller remote
4
 * User: moyo
5
 * Date: 2018-11-26
6
 * Time: 11:31
7
 */
8
9
namespace Carno\Web\Controller;
10
11
use Carno\Coroutine\Context;
12
use Carno\HTTP\Server\Connection;
13
use Carno\HTTP\Standard\ServerRequest;
14
use Carno\Net\Address;
15
use Carno\Web\Handlers\IngressWrapper;
16
17
class Remote
18
{
19
    private const XFF = 'X-Forwarded-For';
20
21
    /**
22
     * @var Context
23
     */
24
    private $context = null;
25
26
    /**
27
     * @var ServerRequest
28
     */
29
    private $request = null;
30
31
    /**
32
     * Remote constructor.
33
     * @param Context $context
34
     * @param ServerRequest $request
35
     */
36
    public function __construct(Context $context, ServerRequest $request)
37
    {
38
        $this->context = $context;
39
        $this->request = $request;
40
    }
41
42
    /**
43
     * @return Address
44
     */
45
    public function peer() : Address
46
    {
47
        /**
48
         * @var Connection|null $conn
49
         */
50
51
        $conn = $this->context->get(IngressWrapper::CONNECTION);
52
53
        $client = $conn ? $conn->remote() : new Address('0.0.0.0', 0);
54
55
        if (empty($ips = $this->request->getHeader(self::XFF))) {
56
            return $client;
57
        }
58
59
        return new Address(reset($ips), $client->port());
60
    }
61
}
62