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

src/Guzzle4HttpAdapter.php (2 issues)

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)
0 ignored issues
show
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
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