Completed
Push — master ( be80ec...c0e175 )
by Steven
03:25 queued 01:01
created

ProviderRedirectTrait::isRedirect()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 6
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 3

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 6
ccs 3
cts 3
cp 1
rs 9.4285
cc 3
eloc 3
nc 3
nop 1
crap 3
1
<?php
2
3
namespace Stevenmaguire\OAuth2\Client\Tool;
4
5
use GuzzleHttp\Exception\BadResponseException;
6
use GuzzleHttp\Psr7\Uri;
7
use InvalidArgumentException;
8
use Psr\Http\Message\RequestInterface;
9
use Psr\Http\Message\ResponseInterface;
10
11
trait ProviderRedirectTrait
12
{
13
    /**
14
     * Maximum number of times to follow provider initiated redirects
15
     *
16
     * @var integer
17
     */
18
    protected $redirectLimit = 2;
19
20
    /**
21
     * Returns the HTTP client instance.
22
     *
23
     * @return GuzzleHttp\ClientInterface
24
     */
25
    abstract public function getHttpClient();
26
27
    /**
28
     * Retrieves current redirect limit.
29
     *
30
     * @return integer
31
     */
32 4
    public function getRedirectLimit()
33
    {
34 4
        return $this->redirectLimit;
35
    }
36
37
    /**
38
     * Determines if a given response is a redirect.
39
     *
40
     * @param  ResponseInterface  $response
41
     *
42
     * @return boolean
43
     */
44 6
    protected function isRedirect(ResponseInterface $response)
45
    {
46 6
        $statusCode = $response->getStatusCode();
47
48 6
        return $statusCode > 300 && $statusCode < 400 && $response->hasHeader('Location');
49
    }
50
51
    /**
52
     * Sends a request instance and returns a response instance.
53
     *
54
     * @param  RequestInterface $request
55
     * @return ResponseInterface
56
     */
57 8
    protected function sendRequest(RequestInterface $request)
58
    {
59 8
        $response = null;
60
        $requestOptions = [
61
            'allow_redirects' => false
62 8
        ];
63 8
        $attempts = 0;
64
65
        try {
66 8
            while ($attempts < $this->redirectLimit) {
67 8
                $attempts++;
68 8
                $response = $this->getHttpClient()->send($request, $requestOptions);
69
70 6
                if ($this->isRedirect($response)) {
71 2
                    $redirectUrl = new Uri($response->getHeader('Location')[0]);
72 2
                    $request = $request->withUri($redirectUrl);
73 2
                } else {
74 4
                    break;
75
                }
76 2
            }
77 8
        } catch (BadResponseException $e) {
78 2
            $response = $e->getResponse();
79
        }
80
81 8
        return $response;
82
    }
83
84
    /**
85
     * Updates the redirect limit.
86
     *
87
     * @param integer $limit
88
     * @return League\OAuth2\Client\Provider\AbstractProvider
89
     * @throws InvalidArgumentException
90
     */
91 10
    public function setRedirectLimit($limit)
92
    {
93 10
        if (!is_numeric($limit)) {
94 4
            throw new InvalidArgumentException('setRedirectLimit function only accepts numeric values.');
95
        }
96
97 6
        $this->redirectLimit = (integer) $limit;
98
99 6
        return $this;
100
    }
101
}
102