| 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 |  |  |  |