Completed
Push — master ( 2994aa...19d116 )
by Patrick
08:28
created

DropboxGuzzleHttpClient::send()   B

Complexity

Conditions 6
Paths 8

Size

Total Lines 37

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 12
CRAP Score 6.9157

Importance

Changes 0
Metric Value
dl 0
loc 37
ccs 12
cts 17
cp 0.7059
rs 8.7057
c 0
b 0
f 0
cc 6
nc 8
nop 5
crap 6.9157
1
<?php
2
3
namespace Dropbox\Http\Clients;
4
5
use GuzzleHttp\Client;
6
use GuzzleHttp\Psr7\Request;
7
use Psr\Http\Message\StreamInterface;
8
use Psr\Http\Message\ResponseInterface;
9
use GuzzleHttp\Exception\RequestException;
10
use Dropbox\Http\DropboxRawResponse;
11
use GuzzleHttp\Exception\BadResponseException;
12
use Dropbox\Exceptions\DropboxClientException;
13
14
/**
15
 * DropboxGuzzleHttpClient.
16
 */
17
class DropboxGuzzleHttpClient implements DropboxHttpClientInterface
18
{
19
    /**
20
     * GuzzleHttp client.
21
     *
22
     * @var \GuzzleHttp\Client
23
     */
24
    protected $client;
25
26
    /**
27
     * Create a new DropboxGuzzleHttpClient instance.
28
     *
29
     * @param Client $client GuzzleHttp Client
30
     */
31 58
    public function __construct(Client $client = null)
32
    {
33
        //Set the client
34 58
        $this->client = $client ?: new Client();
35 58
    }
36
37
    /**
38
     * Send request to the server and fetch the raw response.
39
     *
40
     * @param  string $url     URL/Endpoint to send the request to
41
     * @param  string $method  Request Method
42
     * @param  string|resource|StreamInterface $body Request Body
43
     * @param  array  $headers Request Headers
44
     * @param  array  $options Additional Options
45
     *
46
     * @return \Dropbox\Http\DropboxRawResponse Raw response from the server
47
     *
48
     * @throws \Dropbox\Exceptions\DropboxClientException
49
     */
50 49
    public function send($url, $method, $body, $headers = [], $options = [])
51
    {
52
        //Create a new Request Object
53 49
        $request = new Request($method, $url, $headers, $body);
54
55
        try {
56
            //Send the Request
57 49
            $rawResponse = $this->client->send($request, $options);
58 1
        } catch (BadResponseException $e) {
59 1
            throw new DropboxClientException($e->getResponse()->getBody(), $e->getCode(), $e);
60
        } catch (RequestException $e) {
61
            $rawResponse = $e->getResponse();
62
63
            if (! $rawResponse instanceof ResponseInterface) {
64
                throw new DropboxClientException($e->getMessage(), $e->getCode());
65
            }
66
        }
67
68
        //Something went wrong
69 48
        if ($rawResponse->getStatusCode() >= 400) {
70
            throw new DropboxClientException($rawResponse->getBody());
71
        }
72
73 48
        if (array_key_exists('sink', $options)) {
74
            //Response Body is saved to a file
75 1
            $body = '';
76
        } else {
77
            //Get the Response Body
78 47
            $body = $this->getResponseBody($rawResponse);
79
        }
80
81 48
        $rawHeaders = $rawResponse->getHeaders();
82 48
        $httpStatusCode = $rawResponse->getStatusCode();
83
84
        //Create and return a DropboxRawResponse object
85 48
        return new DropboxRawResponse($rawHeaders, $body, $httpStatusCode);
86
    }
87
88
    /**
89
     * Get the Response Body.
90
     *
91
     * @param string|\Psr\Http\Message\ResponseInterface $response Response object
92
     *
93
     * @return string
94
     */
95 47
    protected function getResponseBody($response)
96
    {
97
        //Response must be string
98 47
        $body = $response;
99
100 47
        if ($response instanceof ResponseInterface) {
101
            //Fetch the body
102 47
            $body = $response->getBody();
103
        }
104
105 47
        if ($body instanceof StreamInterface) {
106 47
            $body = $body->getContents();
107
        }
108
109 47
        return (string) $body;
110
    }
111
}
112