Completed
Pull Request — master (#2)
by
unknown
18:30 queued 16:11
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
            $client = new Browser();
41
            $client->getClient()->setMaxRedirects(0);
42
        }
43
44 53
        $this->client = $client;
45 53
        $this->messageFactory = $messageFactory ?: MessageFactoryDiscovery::find();
46 53
    }
47
48
    /**
49
     * {@inheritdoc}
50
     */
51 53
    public function sendRequest(RequestInterface $request)
52
    {
53 53
        $buzzRequest = $this->createRequest($request);
54
55
        try {
56 53
            $buzzResponse = new BuzzResponse();
57 53
            $this->client->send($buzzRequest, $buzzResponse);
58 53
        } catch (BuzzException\ClientException $e) {
59 1
            throw new HttplugException\TransferException($e->getMessage(), 0, $e);
60
        }
61
62 52
        return $this->createResponse($buzzResponse);
63
    }
64
65
    /**
66
     * Converts a PSR request into a BuzzRequest request.
67
     *
68
     * @param RequestInterface $request
69
     *
70
     * @return BuzzRequest
71
     */
72 53
    private function createRequest(RequestInterface $request)
73
    {
74 53
        $buzzRequest = new BuzzRequest();
75 53
        $buzzRequest->setMethod($request->getMethod());
76 53
        $buzzRequest->fromUrl($request->getUri()->__toString());
77 53
        $buzzRequest->setProtocolVersion($request->getProtocolVersion());
78 53
        $buzzRequest->setContent((string) $request->getBody());
79
80 53
        $this->addPsrHeadersToBuzzRequest($request, $buzzRequest);
81
82 53
        return $buzzRequest;
83
    }
84
85
    /**
86
     * Converts a Buzz response into a PSR response.
87
     *
88
     * @param BuzzResponse $response
89
     *
90
     * @return ResponseInterface
91
     */
92 52
    private function createResponse(BuzzResponse $response)
93
    {
94 52
        $body = $response->getContent();
95
96 52
        return $this->messageFactory->createResponse(
97 52
            $response->getStatusCode(),
98 52
            null,
99 52
            $this->getBuzzHeaders($response),
100 52
            $body,
101 52
            number_format($response->getProtocolVersion(), 1)
102 52
        );
103
    }
104
105
    /**
106
     * Apply headers on a Buzz request.
107
     *
108
     * @param RequestInterface $request
109
     * @param BuzzRequest      $buzzRequest
110
     */
111 53
    private function addPsrHeadersToBuzzRequest(RequestInterface $request, BuzzRequest $buzzRequest)
112
    {
113 53
        $headers = $request->getHeaders();
114 53
        foreach ($headers as $name => $values) {
115 53
            foreach ($values as $header) {
116 53
                $buzzRequest->addHeader($name.': '.$header);
117 53
            }
118 53
        }
119 53
    }
120
121
    /**
122
     * Get headers from a Buzz response.
123
     *
124
     * @param BuzzResponse $response
125
     *
126
     * @return array
127
     */
128 52
    private function getBuzzHeaders(BuzzResponse $response)
129
    {
130 52
        $buzzHeaders = $response->getHeaders();
131 52
        unset($buzzHeaders[0]);
132 52
        $headers = [];
133 52
        foreach ($buzzHeaders as $headerLine) {
134 52
            list($name, $value) = explode(':', $headerLine, 2);
135 52
            $headers[$name] = trim($value);
136 52
        }
137
138 52
        return $headers;
139
    }
140
}
141