Passed
Push — develop ( 39b4d5...7a2e88 )
by Jens
17:17
created

ApiException::getResponse()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 3
ccs 2
cts 2
cp 1
rs 10
c 0
b 0
f 0
cc 1
eloc 1
nc 1
nop 0
crap 1
1
<?php
2
/**
3
 * @author @jenschude <[email protected]>
4
 */
5
6
namespace Commercetools\Core\Error;
7
8
use Exception;
9
use Psr\Http\Message\RequestInterface;
10
use Psr\Http\Message\ResponseInterface;
11
12
/**
13
 * Base exception for responses with http status code different than 200 or 201
14
 * @package Commercetools\Core\Error
15
 */
16
class ApiException extends Exception
17
{
18
    /**
19
     * @var RequestInterface
20
     */
21
    protected $request;
22
23
    /**
24
     * @var ResponseInterface
25
     */
26
    protected $response;
27
28 121
    public function __construct(
29
        $message,
30
        RequestInterface $request,
31
        ResponseInterface $response = null,
32
        Exception $previous = null
33
    ) {
34 121
        $code = $response ? $response->getStatusCode() : 0;
35 121
        parent::__construct($message, $code, $previous);
36 121
        $this->request = $request;
37 121
        $this->response = $response;
38 121
    }
39
40
    /**
41
     * @param RequestInterface $request
42
     * @param ResponseInterface|null $response
43
     * @param Exception|null $previous
44
     */
45 121
    public static function create(
46
        RequestInterface $request,
47
        ResponseInterface $response = null,
48
        Exception $previous = null
49
    ) {
50 121
        if (is_null($response)) {
51 2
            return new self('Error completing request', $request, null, $previous);
52
        }
53
54 119
        $level = floor($response->getStatusCode() / 100);
55 119
        if ($level == 4) {
56 110
            $label = 'Client error response';
57 9
        } elseif ($level == 5) {
58 9
            $label = 'Server error response';
59
        } else {
60
            $label = 'Unsuccessful response';
61
        }
62
63 119
        $message = $label . ' [url] ' . $request->getUri()
64 119
             . ' [status code] ' . $response->getStatusCode()
65 119
             . ' [reason phrase] ' . $response->getReasonPhrase();
66
67 119
        switch ($response->getStatusCode()) {
68 119
            case 400:
69 55
                return new ErrorResponseException($message, $request, $response, $previous);
70 65
            case 401:
71 10
                if (strpos((string)$response->getBody(), 'invalid_token') !== false) {
72 6
                    return new InvalidTokenException($message, $request, $response, $previous);
73
                }
74 4
                return new InvalidClientCredentialsException($message, $request, $response, $previous);
75 55
            case 403:
76 2
                return new ForbiddenException($message, $request, $response, $previous);
77 53
            case 404:
78 31
                return new NotFoundException($message, $request, $response, $previous);
79 22
            case 409:
80 11
                return new ConcurrentModificationException($message, $request, $response, $previous);
81 11
            case 500:
82 6
                return new InternalServerErrorException($message, $request, $response, $previous);
83 5
            case 502:
84 1
                return new BadGatewayException($message, $request, $response, $previous);
85 4
            case 503:
86 1
                return new ServiceUnavailableException($message, $request, $response, $previous);
87 3
            case 504:
88 1
                return new GatewayTimeoutException($message, $request, $response, $previous);
89
        }
90
91 2
        return new self($message, $request, $response, $previous);
92
    }
93
94
    /**
95
     * @return RequestInterface
96
     */
97 3
    public function getRequest()
98
    {
99 3
        return $this->request;
100
    }
101
102
    /**
103
     * @return ResponseInterface
104
     */
105 106
    public function getResponse()
106
    {
107 106
        return $this->response;
108
    }
109
110 1
    protected function getResponseJson()
111
    {
112 1
        $response = $this->getResponse();
113 1
        if ($response instanceof ResponseInterface) {
0 ignored issues
show
introduced by
$response is always a sub-type of Psr\Http\Message\ResponseInterface.
Loading history...
114 1
            $json = json_decode($response->getBody(), true);
115 1
            return $json;
116
        }
117
118
        return [];
119
    }
120
121
    /**
122
     * @return array
123
     */
124 1
    public function getErrors()
125
    {
126 1
        $data = $this->getResponseJson();
127
128 1
        return isset($data['errors']) ? $data['errors'] : [];
129
    }
130
131
    /**
132
     * @return string
133
     */
134
    public function getResponseMessage()
135
    {
136
        $data = $this->getResponseJson();
137
138
        return isset($data['message']) ? $data['message'] : '';
139
    }
140
141
    /**
142
     * @return string
143
     */
144
    public function getResponseStatusCode()
145
    {
146
        $data = $this->getResponseJson();
147
148
        return isset($data['statusCode']) ? $data['statusCode'] : '';
149
    }
150
}
151