Completed
Pull Request — master (#2)
by
unknown
04:35
created

Client::sendRequest()   A

Complexity

Conditions 2
Paths 3

Size

Total Lines 13
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 7
CRAP Score 2

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 13
ccs 7
cts 7
cp 1
rs 9.4285
cc 2
eloc 8
nc 3
nop 1
crap 2
1
<?php
2
3
namespace Http\Adapter\Buzz;
4
5
use Buzz\Browser;
6
use Buzz\Exception as BuzzException;
7
use Buzz\Message\Request as BuzzRequest;
8
use Buzz\Message\Response as BuzzResponse;
9
use Http\Client\Exception as HttplugException;
10
use Http\Client\HttpClient;
11
use Http\Discovery\MessageFactoryDiscovery;
12
use Http\Message\MessageFactory;
13
use Psr\Http\Message\RequestInterface;
14
use Psr\Http\Message\ResponseInterface;
15
16
/**
17
 * @author Tobias Nyholm <[email protected]>
18
 */
19
class Client implements HttpClient
20
{
21
    /**
22
     * @var Browser
23
     */
24
    private $client;
25
26
    /**
27
     * @var MessageFactory
28
     */
29
    private $messageFactory;
30
31
    /**
32
     * Client constructor.
33
     *
34
     * @param Browser|null        $client
35
     * @param MessageFactory|null $messageFactory
36
     */
37 53
    public function __construct(Browser $client = null, MessageFactory $messageFactory = null)
38
    {
39 53
        if( ! $client)
40 53
        {
41
            $client = new Browser();
42
            $client->getClient()->setMaxRedirects(0);
43
        }
44
45 53
        $this->client = $client;
46 53
        $this->messageFactory = $messageFactory ?: MessageFactoryDiscovery::find();
47 53
    }
48
49
    /**
50
     * {@inheritdoc}
51
     */
52 53
    public function sendRequest(RequestInterface $request)
53
    {
54 53
        $buzzRequest = $this->createRequest($request);
55
56
        try {
57 53
            $buzzResponse = new BuzzResponse();
58 53
            $this->client->send($buzzRequest, $buzzResponse);
59 53
        } catch (BuzzException\ClientException $e) {
60 1
            throw new HttplugException\TransferException($e->getMessage(), 0, $e);
61
        }
62
63 52
        return $this->createResponse($buzzResponse);
64
    }
65
66
    /**
67
     * Converts a PSR request into a BuzzRequest request.
68
     *
69
     * @param RequestInterface $request
70
     *
71
     * @return BuzzRequest
72
     */
73 53
    private function createRequest(RequestInterface $request)
74
    {
75 53
        $buzzRequest = new BuzzRequest();
76 53
        $buzzRequest->setMethod($request->getMethod());
77 53
        $buzzRequest->fromUrl($request->getUri()->__toString());
78 53
        $buzzRequest->setProtocolVersion($request->getProtocolVersion());
79 53
        $buzzRequest->setContent((string) $request->getBody());
80
81 53
        $this->addPsrHeadersToBuzzRequest($request, $buzzRequest);
82
83 53
        return $buzzRequest;
84
    }
85
86
    /**
87
     * Converts a Buzz response into a PSR response.
88
     *
89
     * @param BuzzResponse $response
90
     *
91
     * @return ResponseInterface
92
     */
93 52
    private function createResponse(BuzzResponse $response)
94
    {
95 52
        $body = $response->getContent();
96
97 52
        return $this->messageFactory->createResponse(
98 52
            $response->getStatusCode(),
99 52
            null,
100 52
            $this->getBuzzHeaders($response),
101 52
            $body,
102 52
            number_format($response->getProtocolVersion(), 1)
103 52
        );
104
    }
105
106
    /**
107
     * Apply headers on a Buzz request.
108
     *
109
     * @param RequestInterface $request
110
     * @param BuzzRequest      $buzzRequest
111
     */
112 53
    private function addPsrHeadersToBuzzRequest(RequestInterface $request, BuzzRequest $buzzRequest)
113
    {
114 53
        $headers = $request->getHeaders();
115 53
        foreach ($headers as $name => $values) {
116 53
            foreach ($values as $header) {
117 53
                $buzzRequest->addHeader($name.': '.$header);
118 53
            }
119 53
        }
120 53
    }
121
122
    /**
123
     * Get headers from a Buzz response.
124
     *
125
     * @param BuzzResponse $response
126
     *
127
     * @return array
128
     */
129 52
    private function getBuzzHeaders(BuzzResponse $response)
130
    {
131 52
        $buzzHeaders = $response->getHeaders();
132 52
        unset($buzzHeaders[0]);
133 52
        $headers = [];
134 52
        foreach ($buzzHeaders as $headerLine) {
135 52
            list($name, $value) = explode(':', $headerLine, 2);
136 52
            $headers[$name] = trim($value);
137 52
        }
138
139 52
        return $headers;
140
    }
141
}
142