Completed
Push — master ( 6dee34...772748 )
by David
06:37
created

ErrorPlugin::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 11
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 11
ccs 8
cts 8
cp 1
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 7
nc 1
nop 1
crap 1
1
<?php
2
3
namespace Http\Client\Common\Plugin;
4
5
use Http\Client\Common\Exception\ClientErrorException;
6
use Http\Client\Common\Exception\ServerErrorException;
7
use Http\Client\Common\Plugin;
8
use Psr\Http\Message\RequestInterface;
9
use Psr\Http\Message\ResponseInterface;
10
use Symfony\Component\OptionsResolver\OptionsResolver;
11
12
/**
13
 * Throw exception when the response of a request is not acceptable.
14
 *
15
 * Status codes 400-499 lead to a ClientErrorException, status 500-599 to a ServerErrorException.
16
 *
17
 * @author Joel Wurtz <[email protected]>
18
 */
19
final class ErrorPlugin implements Plugin
20
{
21
    /**
22
     * @var bool Whether this plugin should only throw 5XX Exceptions (default to false).
23
     *
24
     * If set to true 4XX Responses code will never throw an exception
25
     */
26
    private $onlyServerException;
27
28
    /**
29
     * @param array $config {
30
     *
31
     *    @var bool only_server_exception Whether this plugin should only throw 5XX Exceptions (default to false).
32
     * }
33
     */
34 5
    public function __construct(array $config = [])
35
    {
36 5
        $resolver = new OptionsResolver();
37 5
        $resolver->setDefaults([
38 5
            'only_server_exception' => false,
39
        ]);
40 5
        $resolver->setAllowedTypes('only_server_exception', 'bool');
41 5
        $options = $resolver->resolve($config);
42
43 5
        $this->onlyServerException = $options['only_server_exception'];
44 5
    }
45
46
    /**
47
     * {@inheritdoc}
48
     */
49 4
    public function handleRequest(RequestInterface $request, callable $next, callable $first)
50
    {
51 4
        $promise = $next($request);
52
53 4
        return $promise->then(function (ResponseInterface $response) use ($request) {
54 4
            return $this->transformResponseToException($request, $response);
55 4
        });
56
    }
57
58
    /**
59
     * Transform response to an error if possible.
60
     *
61
     * @param RequestInterface  $request  Request of the call
62
     * @param ResponseInterface $response Response of the call
63
     *
64
     * @throws ClientErrorException If response status code is a 4xx
65
     * @throws ServerErrorException If response status code is a 5xx
66
     *
67
     * @return ResponseInterface If status code is not in 4xx or 5xx return response
68
     */
69 4
    protected function transformResponseToException(RequestInterface $request, ResponseInterface $response)
70
    {
71 4
        if (!$this->onlyServerException && $response->getStatusCode() >= 400 && $response->getStatusCode() < 500) {
72 1
            throw new ClientErrorException($response->getReasonPhrase(), $request, $response);
73
        }
74
75 3
        if ($response->getStatusCode() >= 500 && $response->getStatusCode() < 600) {
76 1
            throw new ServerErrorException($response->getReasonPhrase(), $request, $response);
77
        }
78
79 2
        return $response;
80
    }
81
}
82