GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.
Completed
Pull Request — master (#93)
by Martin
02:57
created

FiftyOneDegreesCom::hydrateBrowser()   A

Complexity

Conditions 3
Paths 4

Size

Total Lines 10
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 12

Importance

Changes 2
Bugs 0 Features 0
Metric Value
dl 0
loc 10
c 2
b 0
f 0
ccs 0
cts 9
cp 0
rs 9.4285
cc 3
eloc 5
nc 4
nop 2
crap 12
1
<?php
2
namespace UserAgentParser\Provider\Http;
3
4
use GuzzleHttp\Client;
5
use GuzzleHttp\Psr7\Request;
6
use stdClass;
7
use UserAgentParser\Exception;
8
use UserAgentParser\Model;
9
10
/**
11
 * Abstraction of neutrinoapi.com
12
 *
13
 * @author Martin Keckeis <[email protected]>
14
 * @license MIT
15
 * @see https://51degrees.com
16
 */
17
class FiftyOneDegreesCom extends AbstractHttpProvider
18
{
19
    /**
20
     * Name of the provider
21
     *
22
     * @var string
23
     */
24
    protected $name = 'FiftyOneDegreesCom';
25
26
    /**
27
     * Homepage of the provider
28
     *
29
     * @var string
30
     */
31
    protected $homepage = 'https://51degrees.com';
32
33
    protected $detectionCapabilities = [
34
35
        'browser' => [
36
            'name'    => true,
37
            'version' => true,
38
        ],
39
40
        'renderingEngine' => [
41
            'name'    => true,
42
            'version' => true,
43
        ],
44
45
        'operatingSystem' => [
46
            'name'    => true,
47
            'version' => true,
48
        ],
49
50
        'device' => [
51
            'model'    => false,
52
            'brand'    => false,
53
            'type'     => true,
54
            'isMobile' => false,
55
            'isTouch'  => false,
56
        ],
57
58
        'bot' => [
59
            'isBot' => false,
60
            'name'  => false,
61
            'type'  => false,
62
        ],
63
    ];
64
    
65
    protected $defaultValues = [
66
        'general' => [
67
            '/^Unknown$/i',
68
        ],
69
    ];
70
71
    private static $uri = 'https://cloud.51degrees.com/api/v1';
72
73
    private $apiKey;
74
75
    public function __construct(Client $client, $apiKey)
76
    {
77
        parent::__construct($client);
78
79
        $this->apiKey = $apiKey;
80
    }
81
82
    /**
83
     *
84
     * @param  string                     $userAgent
85
     * @param  array                      $headers
86
     * @return stdClass
87
     * @throws Exception\RequestException
88
     */
89
    protected function getResult($userAgent, array $headers)
90
    {
91
        /*
92
         * an empty UserAgent makes no sense
93
         */
94
        if ($userAgent == '') {
95
            throw new Exception\NoResultFoundException('No result found for user agent: ' . $userAgent);
96
        }
97
98
        $headers['User-Agent'] = $userAgent;
99
100
        $parameters = '/' . $this->apiKey;
101
        $parameters .= '/match?';
102
103
        $headerString = [];
104
        foreach ($headers as $key => $value) {
105
            $headerString[] = $key . '=' . rawurlencode($value);
106
        }
107
108
        $parameters .= implode('&', $headerString);
109
110
        $uri = self::$uri . $parameters;
111
112
        $request = new Request('GET', $uri);
113
114
        try {
115
            $response = $this->getResponse($request);
116
        } catch (Exception\RequestException $ex) {
117
            /* @var $prevEx \GuzzleHttp\Exception\ClientException */
118
            $prevEx = $ex->getPrevious();
119
120
            if ($prevEx->hasResponse() === true && $prevEx->getResponse()->getStatusCode() === 403) {
121
                throw new Exception\InvalidCredentialsException('Your API key "' . $this->apiKey . '" is not valid for ' . $this->getName(), null, $ex);
122
            }
123
124
            throw $ex;
125
        }
126
127
        /*
128
         * no json returned?
129
         */
130
        $contentType = $response->getHeader('Content-Type');
131
        if (! isset($contentType[0]) || $contentType[0] != 'application/json; charset=utf-8') {
132
            throw new Exception\RequestException('Could not get valid "application/json; charset=utf-8" response from "' . $request->getUri() . '". Response is "' . $response->getBody()->getContents() . '"');
133
        }
134
135
        $content = json_decode($response->getBody()->getContents());
136
137
        /*
138
         * No result
139
         */
140
        if (isset($content->MatchMethod) && $content->MatchMethod == 'None') {
141
            throw new Exception\NoResultFoundException('No result found for user agent: ' . $userAgent);
142
        }
143
144
        /*
145
         * Missing data?
146
         */
147
        if (! $content instanceof stdClass || ! isset($content->Values)) {
148
            throw new Exception\RequestException('Could not get valid response from "' . $request->getUri() . '". Data is missing "' . $response->getBody()->getContents() . '"');
149
        }
150
151
        /*
152
         * Convert the values, to something useable
153
         */
154
        $values = new \stdClass();
155
        foreach ($content->Values as $key => $value) {
156
            if (is_array($value) && count($value) === 1 && isset($value[0])) {
157
                $values->{$key} = $value[0];
158
            }
159
        }
160
161
        foreach ($values as $key => $value) {
0 ignored issues
show
Bug introduced by
The expression $values of type object<stdClass> is not traversable.
Loading history...
162
            if ($value === 'True') {
163
                $values->{$key} = true;
164
            } elseif ($value === 'False') {
165
                $values->{$key} = false;
166
            }
167
        }
168
169
        $values->MatchMethod = $content->MatchMethod;
170
171
        unset($values->JavascriptImageOptimiser);
172
173
        return $values;
174
    }
175
176
    /**
177
     *
178
     * @param Model\Browser $browser
179
     * @param stdClass      $resultRaw
180
     */
181
    private function hydrateBrowser(Model\Browser $browser, stdClass $resultRaw)
182
    {
183
        if (isset($resultRaw->BrowserName)) {
184
            $browser->setName($this->getRealResult($resultRaw->BrowserName));
185
        }
186
187
        if (isset($resultRaw->BrowserVersion)) {
188
            $browser->getVersion()->setComplete($this->getRealResult($resultRaw->BrowserVersion));
189
        }
190
    }
191
192
    /**
193
     *
194
     * @param Model\RenderingEngine $engine
195
     * @param stdClass              $resultRaw
196
     */
197
    private function hydrateRenderingEngine(Model\RenderingEngine $engine, stdClass $resultRaw)
198
    {
199
        if (isset($resultRaw->LayoutEngine)) {
200
            $engine->setName($this->getRealResult($resultRaw->LayoutEngine));
201
        }
202
203
        if (isset($resultRaw->engine_version)) {
204
            $engine->getVersion()->setComplete($this->getRealResult($resultRaw->engine_version));
205
        }
206
    }
207
208
    /**
209
     *
210
     * @param Model\OperatingSystem $os
211
     * @param stdClass              $resultRaw
212
     */
213
    private function hydrateOperatingSystem(Model\OperatingSystem $os, stdClass $resultRaw)
214
    {
215
        if (isset($resultRaw->PlatformName)) {
216
            $os->setName($this->getRealResult($resultRaw->PlatformName));
217
        }
218
219
        if (isset($resultRaw->PlatformVersion)) {
220
            $os->getVersion()->setComplete($this->getRealResult($resultRaw->PlatformVersion));
221
        }
222
    }
223
224
    /**
225
     *
226
     * @param Model\Device $device
227
     * @param stdClass     $resultRaw
228
     */
229
    private function hydrateDevice(Model\Device $device, stdClass $resultRaw)
230
    {
231
        if (isset($resultRaw->DeviceType)) {
232
            $device->setType($this->getRealResult($resultRaw->DeviceType));
233
        }
234
    }
235
236
    public function parse($userAgent, array $headers = [])
237
    {
238
        $resultRaw = $this->getResult($userAgent, $headers);
239
240
        /*
241
         * Hydrate the model
242
         */
243
        $result = new Model\UserAgent();
244
        $result->setProviderResultRaw($resultRaw);
245
246
        /*
247
         * hydrate the result
248
         */
249
        $this->hydrateBrowser($result->getBrowser(), $resultRaw);
250
        $this->hydrateRenderingEngine($result->getRenderingEngine(), $resultRaw);
251
        $this->hydrateOperatingSystem($result->getOperatingSystem(), $resultRaw);
252
        $this->hydrateDevice($result->getDevice(), $resultRaw);
253
254
        return $result;
255
    }
256
}
257