1<?php 2/** 3 * Copyright 2015 Google Inc. All Rights Reserved. 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17namespace Google\Auth\HttpHandler; 18 19use Exception; 20use GuzzleHttp\ClientInterface; 21use GuzzleHttp\Message\ResponseInterface as Guzzle5ResponseInterface; 22use GuzzleHttp\Promise\Promise; 23use GuzzleHttp\Promise\RejectedPromise; 24use GuzzleHttp\Psr7\Response; 25use Psr\Http\Message\RequestInterface; 26use Psr\Http\Message\ResponseInterface; 27 28/** 29 * @deprecated 30 */ 31class Guzzle5HttpHandler 32{ 33 /** 34 * @var ClientInterface 35 */ 36 private $client; 37 38 /** 39 * @param ClientInterface $client 40 */ 41 public function __construct(ClientInterface $client) 42 { 43 $this->client = $client; 44 } 45 46 /** 47 * Accepts a PSR-7 Request and an array of options and returns a PSR-7 response. 48 * 49 * @param RequestInterface $request 50 * @param array $options 51 * @return ResponseInterface 52 */ 53 public function __invoke(RequestInterface $request, array $options = []) 54 { 55 $response = $this->client->send( 56 $this->createGuzzle5Request($request, $options) 57 ); 58 59 return $this->createPsr7Response($response); 60 } 61 62 /** 63 * Accepts a PSR-7 request and an array of options and returns a PromiseInterface 64 * 65 * @param RequestInterface $request 66 * @param array $options 67 * @return Promise 68 */ 69 public function async(RequestInterface $request, array $options = []) 70 { 71 if (!class_exists('GuzzleHttp\Promise\Promise')) { 72 throw new Exception('Install guzzlehttp/promises to use async with Guzzle 5'); 73 } 74 75 $futureResponse = $this->client->send( 76 $this->createGuzzle5Request( 77 $request, 78 ['future' => true] + $options 79 ) 80 ); 81 82 $promise = new Promise( 83 function () use ($futureResponse) { 84 try { 85 $futureResponse->wait(); 86 } catch (Exception $e) { 87 // The promise is already delivered when the exception is 88 // thrown, so don't rethrow it. 89 } 90 }, 91 [$futureResponse, 'cancel'] 92 ); 93 94 $futureResponse->then([$promise, 'resolve'], [$promise, 'reject']); 95 96 return $promise->then( 97 function (Guzzle5ResponseInterface $response) { 98 // Adapt the Guzzle 5 Response to a PSR-7 Response. 99 return $this->createPsr7Response($response); 100 }, 101 function (Exception $e) { 102 return new RejectedPromise($e); 103 } 104 ); 105 } 106 107 private function createGuzzle5Request(RequestInterface $request, array $options) 108 { 109 return $this->client->createRequest( 110 $request->getMethod(), 111 $request->getUri(), 112 array_merge_recursive([ 113 'headers' => $request->getHeaders(), 114 'body' => $request->getBody(), 115 ], $options) 116 ); 117 } 118 119 private function createPsr7Response(Guzzle5ResponseInterface $response) 120 { 121 return new Response( 122 $response->getStatusCode(), 123 $response->getHeaders() ?: [], 124 $response->getBody(), 125 $response->getProtocolVersion(), 126 $response->getReasonPhrase() 127 ); 128 } 129} 130