summaryrefslogtreecommitdiffstats
path: root/vendor/react/http-client/src/RequestData.php
blob: 1c7d5ebd54b9015fe4a46a2d6c06cd87708bd973 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
<?php

namespace React\HttpClient;

class RequestData
{
    private $method;
    private $url;
    private $headers;
    private $protocolVersion;

    public function __construct($method, $url, array $headers = array(), $protocolVersion = '1.0')
    {
        $this->method = $method;
        $this->url = $url;
        $this->headers = $headers;
        $this->protocolVersion = $protocolVersion;
    }

    private function mergeDefaultheaders(array $headers)
    {
        $port = ($this->getDefaultPort() === $this->getPort()) ? '' : ":{$this->getPort()}";
        $connectionHeaders = ('1.1' === $this->protocolVersion) ? array('Connection' => 'close') : array();
        $authHeaders = $this->getAuthHeaders();

        $defaults = array_merge(
            array(
                'Host'          => $this->getHost().$port,
                'User-Agent'    => 'React/alpha',
            ),
            $connectionHeaders,
            $authHeaders
        );

        // remove all defaults that already exist in $headers
        $lower = array_change_key_case($headers, CASE_LOWER);
        foreach ($defaults as $key => $_) {
            if (isset($lower[strtolower($key)])) {
                unset($defaults[$key]);
            }
        }

        return array_merge($defaults, $headers);
    }

    public function getScheme()
    {
        return parse_url($this->url, PHP_URL_SCHEME);
    }

    public function getHost()
    {
        return parse_url($this->url, PHP_URL_HOST);
    }

    public function getPort()
    {
        return (int) parse_url($this->url, PHP_URL_PORT) ?: $this->getDefaultPort();
    }

    public function getDefaultPort()
    {
        return ('https' === $this->getScheme()) ? 443 : 80;
    }

    public function getPath()
    {
        $path = parse_url($this->url, PHP_URL_PATH);
        $queryString = parse_url($this->url, PHP_URL_QUERY);

        // assume "/" path by default, but allow "OPTIONS *"
        if ($path === null) {
            $path = ($this->method === 'OPTIONS' && $queryString === null) ? '*': '/';
        }
        if ($queryString !== null) {
            $path .= '?' . $queryString;
        }

        return $path;
    }

    public function setProtocolVersion($version)
    {
        $this->protocolVersion = $version;
    }

    public function __toString()
    {
        $headers = $this->mergeDefaultheaders($this->headers);

        $data = '';
        $data .= "{$this->method} {$this->getPath()} HTTP/{$this->protocolVersion}\r\n";
        foreach ($headers as $name => $values) {
            foreach ((array)$values as $value) {
                $data .= "$name: $value\r\n";
            }
        }
        $data .= "\r\n";

        return $data;
    }

    private function getUrlUserPass()
    {
        $components = parse_url($this->url);

        if (isset($components['user'])) {
            return array(
                'user' => $components['user'],
                'pass' => isset($components['pass']) ? $components['pass'] : null,
            );
        }
    }

    private function getAuthHeaders()
    {
        if (null !== $auth = $this->getUrlUserPass()) {
            return array(
                'Authorization' => 'Basic ' . base64_encode($auth['user'].':'.$auth['pass']),
            );
        }

        return array();
    }
}