Completed
Pull Request — master (#393)
by De Cramer
02:39
created

Http   A

Complexity

Total Complexity 11

Size/Duplication

Total Lines 154
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 3

Test Coverage

Coverage 13.46%

Importance

Changes 0
Metric Value
wmc 11
lcom 1
cbo 3
dl 0
loc 154
ccs 7
cts 52
cp 0.1346
rs 10
c 0
b 0
f 0

8 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
A call() 0 7 1
A get() 0 13 1
A post() 0 4 1
A put() 0 4 1
A delete() 0 4 1
A process() 0 10 1
A doCall() 0 36 4
1
<?php
2
3
namespace eXpansion\Framework\Core\Helpers;
4
5
use eXpansion\Framework\Core\Helpers\JobRunner\Factory;
6
use eXpansion\Framework\Core\Helpers\Structures\HttpRequest;
7
use eXpansion\Framework\Core\Helpers\Structures\HttpResult;
8
use eXpansion\Framework\Core\Services\Application\AbstractApplication;
9
10
/**
11
 * Class Http
12
 *
13
 * @author    de Cramer Oliver<[email protected]>
14
 * @copyright 2017 eXpansion
15
 * @package eXpansion\Framework\Core\Helpers
16
 */
17
class Http
18
{
19
20
    /** @var Factory */
21
    protected $factory;
22
23
    /**
24
     * Http constructor.
25
     *
26
     * @param Factory $factory
27
     */
28 1
    public function __construct(Factory $factory)
29
    {
30 1
        $this->factory = $factory;
31 1
    }
32
33
    /**
34
     * Make a http query.
35
     *
36
     * @param string $url
37
     * @param callable $callback
38
     * @param null|mixed $additionalData If you need to pass additional metadata.
39
     *                                   You will get this back in the callback.
40
     * @param array $options curl options array
41
     */
42 1
    public function call($url, $callback, $additionalData = null, $options = [])
43
    {
44 1
        $curlJob = $this->factory->createCurlJob($url, $callback, $additionalData, $options);
45
46
        // Start job execution.
47 1
        $this->factory->startJob($curlJob);
48 1
    }
49
50
    /**
51
     * Make a get http query.
52
     *
53
     * @param string $url address
54
     * @param callable $callback callback
55
     * @param null|mixed $additionalData If you need to pass additional metadata.
56
     *                                          You will get this back in the callback.
57
     * @param array $options Single dimensional array of curl_setopt key->values
58
     */
59
    public function get($url, callable $callback, $additionalData = null, $options = [])
60
    {
61
62
        $defaultOptions = [
63
            CURLOPT_FOLLOWLOCATION => true,
64
            CURLOPT_USERAGENT => "eXpansionPluginPack v ".AbstractApplication::EXPANSION_VERSION,
65
        ];
66
67
        $options = $options + $defaultOptions;
68
        $additionalData['callback'] = $callback;
69
70
        $this->call($url, [$this, 'process'], $additionalData, $options);
71
    }
72
73
    /**
74
     * Make a post http query.
75
     *
76
     * @param string $url address
77
     * @param string|array $fields
78
     * @param callable $callback callback with returning datas
79
     * @param null|mixed $additionalData If you need to pass additional metadata.
80
     *                                   You will get this back in the callback.
81
     * @param array $options Single dimensional array of curl_setopt key->values
82
     */
83
    public function post($url, $fields, callable $callback, $additionalData = null, $options = [])
84
    {
85
        $this->doCall("POST", $url, $fields, $callback, $additionalData, $options);
86
    }
87
88
    /**
89
     * Make a put http query.
90
     *
91
     * @param string $url address
92
     * @param string|array $fields
93
     * @param callable $callback callback with returning datas
94
     * @param null|mixed $additionalData If you need to pass additional metadata.
95
     *                                   You will get this back in the callback.
96
     * @param array $options Single dimensional array of curl_setopt key->values
97
     */
98
    public function put($url, $fields, callable $callback, $additionalData = null, $options = [])
99
    {
100
        $this->doCall("PUT", $url, $fields, $callback, $additionalData, $options);
101
    }
102
103
104
    /**
105
     * Make a delete http query.
106
     *
107
     * @param string $url address
108
     * @param string|array $fields
109
     * @param callable $callback callback with returning datas
110
     * @param null|mixed $additionalData If you need to pass additional metadata.
111
     *                                   You will get this back in the callback.
112
     * @param array $options Single dimensional array of curl_setopt key->values
113
     */
114
    public function delete($url, $fields, callable $callback, $additionalData = null, $options = [])
115
    {
116
        $this->doCall("DELETE", $url, $fields, $callback, $additionalData, $options);
117
    }
118
119
    /**
120
     * processes the request return value
121
     * @param HttpRequest $curl
122
     */
123
    public function process(HttpRequest $curl)
124
    {
125
        $data = $curl->getData();
126
        $additionalData = $curl->getAdditionalData();
127
        $callback = $additionalData['callback'];
128
        unset($additionalData['callback']);
129
130
        $obj = new HttpResult($data['response'], $data['curlInfo'], $curl->getCurlError(), $additionalData);
131
        call_user_func($callback, $obj);
132
    }
133
134
    protected function doCall($method, $url, $fields, callable $callback, $additionalData = null, $options = [])
135
    {
136
        $defaultOptions = [
137
            CURLOPT_FOLLOWLOCATION => true,
138
            CURLOPT_USERAGENT => "eXpansionPluginPack v ".AbstractApplication::EXPANSION_VERSION,
139
        ];
140
141
        switch ($method) {
142
            case "POST" :
143
                $defaultOptions[CURLOPT_POST] = true;
144
                break;
145
            case "PUT" :
146
                $defaultOptions[CURLOPT_PUT] = true;
147
                break;
148
            default :
149
                $defaultOptions[CURLOPT_CUSTOMREQUEST] = "DELETE";
150
        }
151
152
        $options = $options + $defaultOptions;
153
154
        if (is_array($fields)) {
155
            $query = http_build_query($fields, '', '&');
156
        } else {
157
            $query = $fields;
158
        }
159
160
        $options[CURLOPT_URL] = $url;
161
        $options[CURLOPT_POSTFIELDS] = $query;
162
163
        $additionalData['callback'] = $callback;
164
165
        $curlJob = $this->factory->createCurlJob($url, [$this, 'process'], $additionalData, $options);
166
167
        // Start job execution.
168
        $this->factory->startJob($curlJob);
169
    }
170
}
171
172