Completed
Pull Request — master (#1)
by Laurent
04:28
created

HttpClient::propagateResponseExceptions()   B

Complexity

Conditions 9
Paths 12

Size

Total Lines 35
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 17
c 0
b 0
f 0
dl 0
loc 35
rs 8.0555
cc 9
nc 12
nop 1
1
<?php
2
3
namespace Dolibarr\Client\HttpClient;
4
5
use Dolibarr\Client\Exception\ApiException;
6
use Dolibarr\Client\Exception\BadRequestException;
7
use Dolibarr\Client\Exception\DolibarrException;
8
use Dolibarr\Client\Exception\ResourceNotFoundException;
9
use Exception;
10
use GuzzleHttp\Client;
11
use GuzzleHttp\ClientInterface;
12
use GuzzleHttp\Exception\ClientException;
13
use GuzzleHttp\Exception\ConnectException;
14
use GuzzleHttp\Exception\GuzzleException;
15
use GuzzleHttp\Exception\ServerException;
16
17
/**
18
 * @author Laurent De Coninck <[email protected]>
19
 */
20
class HttpClient implements HttpClientInterface
21
{
22
23
    /**
24
     * @var ClientInterface
25
     */
26
    private $client;
27
28
    /**
29
     * @param array           $options
30
     * @param ClientInterface $client
31
     */
32
    public function __construct(
33
        array $options = [],
34
        ClientInterface $client = null
35
    ) {
36
        $this->client = $client ?: new Client($options);
37
    }
38
39
    /**
40
     * {@inheritdoc}
41
     */
42
    public function get($uri, array $options = [])
43
    {
44
        return $this->request('GET', $uri, null, $options);
45
    }
46
47
    /**
48
     * {@inheritdoc}
49
     */
50
    public function post($uri, $json, array $options = [])
51
    {
52
        print $json;
53
54
        return $this->request('POST', $uri, $json, $options);
55
    }
56
57
    /**
58
     * {@inheritdoc}
59
     */
60
    public function put($uri, $json, array $options = [])
61
    {
62
        return $this->request('PUT', $uri, $json, $options);
63
    }
64
65
    /**
66
     * {@inheritdoc}
67
     */
68
    public function patch($uri, $json, array $options = [])
69
    {
70
        return $this->request('PATCH', $uri, $json, $options);
71
    }
72
73
    /**
74
     * {@inheritdoc}
75
     */
76
    public function delete($uri, array $options = [])
77
    {
78
        return $this->request('DELETE', $uri, null, $options);
79
    }
80
81
    /**
82
     * {@inheritdoc}
83
     *
84
     * @throws Exception
85
     */
86
    public function request($method, $uri, $json = null, array $options = [])
87
    {
88
        if (!empty($json)) {
89
            $options['body'] = $json;
90
            $options['headers']['content-type'] = 'application/json';
91
        }
92
93
        try {
94
            return $this->client->request($method, $uri, $options);
0 ignored issues
show
Bug Best Practice introduced by
The expression return $this->client->re...method, $uri, $options) returns the type Psr\Http\Message\ResponseInterface which is incompatible with the return type mandated by Dolibarr\Client\HttpClie...entInterface::request() of GuzzleHttp\Psr7\Request.

In the issue above, the returned value is violating the contract defined by the mentioned interface.

Let's take a look at an example:

interface HasName {
    /** @return string */
    public function getName();
}

class Name {
    public $name;
}

class User implements HasName {
    /** @return string|Name */
    public function getName() {
        return new Name('foo'); // This is a violation of the ``HasName`` interface
                                // which only allows a string value to be returned.
    }
}
Loading history...
95
        } catch (GuzzleException $e) {
96
            $this->propagateResponseExceptions($e);
97
        }
98
    }
99
100
    /**
101
     * @param GuzzleException $exception
102
     *
103
     * @throws Exception
104
     */
105
    private function propagateResponseExceptions(GuzzleException $exception)
106
    {
107
        if ($exception instanceof ConnectException) {
108
            throw new \RuntimeException("Connection issue!");
109
        }
110
111
        if ($exception instanceof ClientException) {
112
            $response = $exception->getResponse();
113
114
            if (null === $response) {
115
                throw new ApiException($exception->getMessage());
116
            }
117
118
            if ($response->getStatusCode() === 404) {
119
                throw new ResourceNotFoundException();
120
            }
121
122
            if ($response->getStatusCode() === 400) {
123
                throw new BadRequestException();
124
            }
125
        }
126
127
        if ($exception instanceof ServerException) {
128
            $response = $exception->getResponse();
129
130
            if (null === $response) {
131
                throw new ApiException($exception->getMessage());
132
            }
133
134
            if ($response->getStatusCode() === 500) {
135
                throw new DolibarrException();
136
            }
137
        }
138
139
        throw new ApiException($exception->getMessage());
140
    }
141
}
142