ExceptionThrower   A
last analyzed

Complexity

Total Complexity 10

Size/Duplication

Total Lines 32
Duplicated Lines 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
eloc 20
c 2
b 0
f 0
dl 0
loc 32
rs 10
wmc 10

1 Method

Rating   Name   Duplication   Size   Complexity  
B handleRequest() 0 27 10
1
<?php
2
3
namespace Transmission\HttpClient\Plugin;
4
5
use Http\Client\Common\Plugin;
6
use Http\Promise\Promise;
7
use Psr\Http\Message\RequestInterface;
8
use Psr\Http\Message\ResponseInterface;
9
use Transmission\Exception\NetworkException;
10
use Transmission\Exception\TransmissionException;
11
use Transmission\HttpClient\Message\ResponseMediator;
12
13
/**
14
 * A plugin to throw exception based on response status code.
15
 */
16
class ExceptionThrower implements Plugin
17
{
18
    /**
19
     * {@inheritdoc}
20
     */
21
    public function handleRequest(RequestInterface $request, callable $next, callable $first): Promise
22
    {
23
        return $next($request)->then(function (ResponseInterface $response) {
24
            $statusCode = $response->getStatusCode();
25
            $content = ResponseMediator::getContent($response);
26
27
            if (ResponseMediator::isSuccess($response)) {
28
                if (is_array($content) && isset($content['result']) && 'success' !== $content['result']) {
29
                    throw new TransmissionException($content['result'], $statusCode);
30
                }
31
            } elseif (!ResponseMediator::isConflictError($response) && ResponseMediator::isError($response)) {
32
                switch ($statusCode) {
33
                    case 401:
34
                        $message = 'Invalid Username/Password';
35
                        break;
36
                    case 403:
37
                        $message = 'Your IP Address is Not Whitelisted';
38
                        break;
39
                    default:
40
                        $message = is_array($content) ? $content['result'] : $content;
41
                        break;
42
                }
43
44
                throw NetworkException::createByCode($statusCode, $message);
45
            }
46
47
            return $response;
48
        });
49
    }
50
}
51