Completed
Push — master ( c8f54d...0a9660 )
by Eric
21:26 queued 01:31
created

src/Guzzle4HttpAdapter.php (1 issue)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
3
/*
4
 * This file is part of the Ivory Http Adapter package.
5
 *
6
 * (c) Eric GELOEN <[email protected]>
7
 *
8
 * For the full copyright and license information, please read the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
namespace Ivory\HttpAdapter;
13
14
use Guzzle\Http\Message\RequestInterface;
15
use GuzzleHttp\Client;
16
use GuzzleHttp\ClientInterface;
17
use GuzzleHttp\Event\CompleteEvent;
18
use GuzzleHttp\Event\ErrorEvent;
19
use GuzzleHttp\Exception\RequestException;
20
use GuzzleHttp\Pool;
21
use Ivory\HttpAdapter\Message\InternalRequestInterface;
22
use Ivory\HttpAdapter\Normalizer\BodyNormalizer;
23
24
/**
25
 * @author GeLo <[email protected]>
26
 */
27
class Guzzle4HttpAdapter extends AbstractCurlHttpAdapter
28
{
29
    /**
30
     * @var ClientInterface
31
     */
32
    private $client;
33
34
    /**
35
     * @param ClientInterface|null        $client
36
     * @param ConfigurationInterface|null $configuration
37
     */
38 704
    public function __construct(ClientInterface $client = null, ConfigurationInterface $configuration = null)
39
    {
40 704
        parent::__construct($configuration, false);
41
42 704
        $this->client = $client ?: new Client();
43 704
    }
44
45
    /**
46
     * {@inheritdoc}
47
     */
48 24
    public function getName()
49
    {
50 24
        return 'guzzle4';
51
    }
52
53
    /**
54
     * {@inheritdoc}
55
     */
56 672 View Code Duplication
    protected function sendInternalRequest(InternalRequestInterface $internalRequest)
57
    {
58
        try {
59 656
            $response = $this->client->send($this->createRequest($internalRequest));
0 ignored issues
show
$this->createRequest($internalRequest) is of type object<Guzzle\Http\Message\RequestInterface>, but the function expects a object<Psr\Http\Message\RequestInterface>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
60 656
        } catch (RequestException $e) {
61 24
            throw HttpAdapterException::cannotFetchUri(
62 24
                $e->getRequest()->getUrl(),
63 24
                $this->getName(),
64 24
                $e->getMessage()
65 24
            );
66
        }
67
68 632
        return $this->getConfiguration()->getMessageFactory()->createResponse(
69 632
            (int) $response->getStatusCode(),
70 632
            $response->getProtocolVersion(),
71 632
            $response->getHeaders(),
72 632
            BodyNormalizer::normalize(
73
                function () use ($response) {
74 584
                    return $response->getBody()->detach();
75 672
                },
76 648
                $internalRequest->getMethod()
77 632
            )
78 644
        );
79 4
    }
80
81
    /**
82
     * {@inheritdoc}
83
     */
84 16
    protected function sendInternalRequests(array $internalRequests, $success, $error)
85
    {
86 16
        $requests = [];
87 16
        foreach ($internalRequests as $internalRequest) {
88 16
            $requests[] = $this->createRequest($internalRequest, $success, $error);
89 16
        }
90
91 16
        class_exists('GuzzleHttp\Pool')
92 16
            ? Pool::batch($this->client, $requests)
93 16
            : \GuzzleHttp\batch($this->client, $requests);
94 16
    }
95
96
    /**
97
     * {@inheritdoc}
98
     */
99 80
    protected function createFile($file)
100
    {
101 80
        return fopen($file, 'r');
102
    }
103
104
    /**
105
     * @param InternalRequestInterface $internalRequest
106
     * @param callable|null            $success
107
     * @param callable|null            $error
108
     *
109
     * @return RequestInterface the request
110
     */
111 672
    private function createRequest(InternalRequestInterface $internalRequest, $success = null, $error = null)
112
    {
113 672
        $request = $this->client->createRequest(
114 672
            $internalRequest->getMethod(),
115 672
            (string) $internalRequest->getUri(),
116
            [
117 672
                'exceptions'      => false,
118 672
                'allow_redirects' => false,
119 672
                'timeout'         => $this->getConfiguration()->getTimeout(),
120 672
                'connect_timeout' => $this->getConfiguration()->getTimeout(),
121 672
                'version'         => $internalRequest->getProtocolVersion(),
122 672
                'headers'         => $this->prepareHeaders($internalRequest),
123 672
                'body'            => $this->prepareContent($internalRequest),
124
            ]
125 672
        );
126
127 672
        if (is_callable($success)) {
128 16
            $messageFactory = $this->getConfiguration()->getMessageFactory();
129
130 16
            $request->getEmitter()->on(
131 16
                'complete',
132
                function (CompleteEvent $event) use ($success, $internalRequest, $messageFactory) {
133 16
                    $response = $messageFactory->createResponse(
134 16
                        (int) $event->getResponse()->getStatusCode(),
135 16
                        $event->getResponse()->getProtocolVersion(),
136 16
                        $event->getResponse()->getHeaders(),
137 16
                        BodyNormalizer::normalize(
138
                            function () use ($event) {
139 16
                                return $event->getResponse()->getBody()->detach();
140 16
                            },
141 16
                            $internalRequest->getMethod()
142 16
                        )
143 16
                    );
144
145 16
                    $response = $response->withParameter('request', $internalRequest);
146 16
                    call_user_func($success, $response);
147 16
                }
148 16
            );
149 16
        }
150
151 672
        if (is_callable($error)) {
152 16
            $httpAdapterName = $this->getName();
153
154 16
            $request->getEmitter()->on(
155 16
                'error',
156 10 View Code Duplication
                function (ErrorEvent $event) use ($error, $internalRequest, $httpAdapterName) {
157 8
                    $exception = HttpAdapterException::cannotFetchUri(
158 8
                        $event->getException()->getRequest()->getUrl(),
159 8
                        $httpAdapterName,
160 8
                        $event->getException()->getMessage()
161 10
                    );
162 8
                    $exception->setRequest($internalRequest);
163 8
                    call_user_func($error, $exception);
164 8
                }
165 16
            );
166 16
        }
167
168 672
        return $request;
169
    }
170
}
171