Completed
Pull Request — master (#6)
by Tobias
04:53
created

Guzzle5HttpAdapter::createResponse()   A

Complexity

Conditions 2
Paths 1

Size

Total Lines 12
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 6

Importance

Changes 2
Bugs 0 Features 0
Metric Value
c 2
b 0
f 0
dl 0
loc 12
ccs 0
cts 11
cp 0
rs 9.4286
cc 2
eloc 8
nc 1
nop 1
crap 6
1
<?php
2
3
namespace Http\Adapter;
4
5
use GuzzleHttp\Client;
6
use GuzzleHttp\ClientInterface;
7
use GuzzleHttp\Message\RequestInterface as GuzzleRequest;
8
use GuzzleHttp\Message\ResponseInterface as GuzzleResponse;
9
use Http\Client\HttpClient;
10
use Http\Discovery\MessageFactoryDiscovery;
11
use Http\Message\MessageFactory;
12
use Psr\Http\Message\RequestInterface;
13
use Psr\Http\Message\ResponseInterface;
14
use Http\Client\Exception as HttplugException;
15
use GuzzleHttp\Exception as GuzzleExceptions;
16
17
/**
18
 * @author GeLo <[email protected]>
19
 */
20
class Guzzle5HttpAdapter implements HttpClient
21
{
22
    /**
23
     * @var ClientInterface
24
     */
25
    private $client;
26
27
    /**
28
     * @var MessageFactory
29
     */
30
    private $messageFactory;
31
32
    /**
33
     * @param ClientInterface|null $client
34
     * @param MessageFactory|null  $messageFactory
35
     */
36
    public function __construct(ClientInterface $client = null, MessageFactory $messageFactory = null)
37
    {
38
        $this->client = $client ?: new Client();
39
        $this->messageFactory = $messageFactory ?: MessageFactoryDiscovery::find();
40
    }
41
42
    /**
43
     * {@inheritdoc}
44
     */
45
    public function sendRequest(RequestInterface $request)
46
    {
47
        $guzzleRequest = $this->createRequest($request);
48
49
        try {
50
            $response = $this->client->send($guzzleRequest);
51
        } catch (GuzzleExceptions\TransferException $e) {
52
            throw $this->handleException($e, $request);
53
        }
54
55
        return $this->createResponse($response);
56
    }
57
58
    /**
59
     * Converts a PSR request into a Guzzle request.
60
     *
61
     * @param RequestInterface $request
62
     *
63
     * @return GuzzleRequest
64
     */
65
    private function createRequest(RequestInterface $request)
66
    {
67
        $options = [
68
            'exceptions'      => false,
69
            'allow_redirects' => false,
70
        ];
71
72
        $options['version'] = $request->getProtocolVersion();
73
        $options['headers'] = $request->getHeaders();
74
        $options['body'] = (string) $request->getBody();
75
76
        return $this->client->createRequest(
77
            $request->getMethod(),
78
            (string) $request->getUri(),
79
            $options
80
        );
81
    }
82
83
    /**
84
     * Converts a Guzzle response into a PSR response.
85
     *
86
     * @param GuzzleResponse $response
87
     *
88
     * @return ResponseInterface
89
     */
90
    private function createResponse(GuzzleResponse $response)
91
    {
92
        $body = $response->getBody();
93
94
        return $this->messageFactory->createResponse(
95
            $response->getStatusCode(),
96
            null,
97
            $response->getHeaders(),
98
            isset($body) ? $body->detach() : null,
99
            $response->getProtocolVersion()
100
        );
101
    }
102
103
    /**
104
     * Converts a Guzzle exception into an Httplug exception.
105
     *
106
     * @param GuzzleExceptions\TransferException $exception
107
     * @param RequestInterface                   $request
108
     *
109
     * @return HttplugException
110
     */
111
    private function handleException(GuzzleExceptions\TransferException $exception, RequestInterface $request)
112
    {
113
        if ($exception instanceof GuzzleExceptions\ConnectException) {
114
            return new HttplugException\NetworkException($exception->getMessage(), $request, $exception);
115
        }
116
117
        if ($exception instanceof GuzzleExceptions\RequestException) {
118
            // Make sure we have a response for the HttpException
119
            if ($exception->hasResponse()) {
120
                $psr7Response = $this->createResponse($exception->getResponse());
121
                return new HttplugException\HttpException(
122
                    $exception->getMessage(),
123
                    $request,
124
                    $psr7Response,
125
                    $exception
126
                );
127
            }
128
129
            return new HttplugException\RequestException($exception->getMessage(), $request, $exception);
130
        }
131
132
        return new HttplugException\TransferException($exception->getMessage(), 0, $exception);
133
    }
134
}
135