Completed
Push — master ( 8af741...fabcfa )
by Hans
01:39
created

BuzzClient::convertResponse()   A

Complexity

Conditions 4
Paths 4

Size

Total Lines 25

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 14
CRAP Score 4.0312

Importance

Changes 0
Metric Value
dl 0
loc 25
ccs 14
cts 16
cp 0.875
rs 9.52
c 0
b 0
f 0
cc 4
nc 4
nop 2
crap 4.0312
1
<?php
2
3
/*
4
 * This file is part of the Pinterest PHP library.
5
 *
6
 * (c) Hans Ott <[email protected]>
7
 *
8
 * This source file is subject to the MIT license that is bundled
9
 * with this source code in the file LICENSE.md.
10
 *
11
 * Source: https://github.com/hansott/pinterest-php
12
 */
13
14
namespace Pinterest\Http;
15
16
use Exception;
17
use Buzz\Browser;
18
use Pinterest\Image;
19
use Buzz\Client\Curl;
20
use Buzz\Message\Form\FormUpload;
21
use Buzz\Message\Form\FormRequest;
22
use Buzz\Exception\RequestException;
23
use Buzz\Message\Response as BuzzResponse;
24
25
/**
26
 * The implemented http client class (uses Buzz).
27
 *
28
 * @link https://github.com/kriswallsmith/Buzz
29
 *
30
 * @author Toon Daelman <[email protected]>
31
 */
32
class BuzzClient implements ClientInterface
33
{
34
    /**
35
     * Buzz browser.
36
     *
37
     * @var Buzz\Browser
38
     */
39
    private $client;
40
41
    /**
42
     * Creates a new buzz client.
43
     */
44 60
    public function __construct()
45
    {
46 60
        $curl = new Curl();
47 60
        $this->client = new Browser($curl);
0 ignored issues
show
Documentation Bug introduced by
It seems like new \Buzz\Browser($curl) of type object<Buzz\Browser> is incompatible with the declared type object<Pinterest\Http\Buzz\Browser> of property $client.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
48 60
    }
49
50
    /**
51
     * Converts a buzz response to a pinterest response.
52
     *
53
     * @param Request      $request      The request.
54
     * @param BuzzResponse $buzzResponse The buzz response.
55
     *
56
     * @return Response The response.
57
     */
58 2
    private static function convertResponse(Request $request, BuzzResponse $buzzResponse)
59
    {
60 2
        $statusCode = $buzzResponse->getStatusCode();
61 2
        $rawBody = (string) $buzzResponse->getContent();
62
63 2
        $rawHeaders = $buzzResponse->getHeaders();
64 2
        $headers = array();
65 2
        foreach ($rawHeaders as $header) {
66 2
            if (stristr($header, 'HTTP/1.')) {
67 2
                continue;
68
            }
69
70 2
            $parts = explode(': ', $header);
71
72 2
            if (count($parts) !== 2) {
73
                $headers[$parts[0]] = '';
74
                continue;
75
            }
76
77 2
            list ($key, $value) = $parts;
78 2
            $headers[$key] = $value;
79 1
        }
80
81 2
        return new Response($request, $statusCode, $rawBody, $headers);
82
    }
83
84
    /**
85
     * Executes a http request.
86
     *
87
     * @param Request $request The http request.
88
     *
89
     * @return Response The http response.
90
     */
91 2
    public function execute(Request $request)
92
    {
93 2
        $method = $request->getMethod();
94 2
        $endpoint = $request->getEndpoint();
95 2
        $params = $request->getParams();
96 2
        $headers = $request->getHeaders();
97
98
        try {
99 2
            if ($method === 'GET') {
100
                $buzzResponse = $this->client->call(
101
                    $endpoint.'?'.http_build_query($params),
102
                    $method,
103
                    $headers,
104
                    array()
105
                );
106
            } else {
107 2
                $buzzRequest = new FormRequest();
108 2
                $buzzRequest->fromUrl($endpoint);
109 2
                $buzzRequest->setMethod($method);
110 2
                $buzzRequest->setHeaders($headers);
111 2
                foreach ($params as $key => $value) {
112 2
                    if ($value instanceof Image) {
113 2
                        $value = new FormUpload($value->getData());
114 1
                    }
115
116 2
                    $buzzRequest->setField($key, $value);
117 1
                }
118
119 2
                $buzzResponse = new BuzzResponse();
120 2
                $this->client->send($buzzRequest, $buzzResponse);
121
            }
122 1
        } catch (RequestException $e) {
123
            throw new Exception($e->getMessage());
124
        }
125
126 2
        return static::convertResponse($request, $buzzResponse);
0 ignored issues
show
Bug introduced by
Since convertResponse() is declared private, calling it with static will lead to errors in possible sub-classes. You can either use self, or increase the visibility of convertResponse() to at least protected.

Let’s assume you have a class which uses late-static binding:

class YourClass
{
    private static function getTemperature() {
        return "3422 °C";
}

public static function getSomeVariable()
{
    return static::getTemperature();
}

}

The code above will run fine in your PHP runtime. However, if you now create a sub-class and call the getSomeVariable() on that sub-class, you will receive a runtime error:

class YourSubClass extends YourClass {
      private static function getTemperature() {
        return "-182 °C";
    }
}

print YourSubClass::getSomeVariable(); // Will cause an access error.

In the case above, it makes sense to update SomeClass to use self instead:

class YourClass
{
    private static function getTemperature() {
        return "3422 °C";
    }

    public static function getSomeVariable()
    {
        return self::getTemperature();
    }
}
Loading history...
127
    }
128
}
129