diff options
Diffstat (limited to 'Postman/Postman-Mail/mailgun/vendor/php-http/curl-client/src/Client.php')
-rw-r--r-- | Postman/Postman-Mail/mailgun/vendor/php-http/curl-client/src/Client.php | 371 |
1 files changed, 0 insertions, 371 deletions
diff --git a/Postman/Postman-Mail/mailgun/vendor/php-http/curl-client/src/Client.php b/Postman/Postman-Mail/mailgun/vendor/php-http/curl-client/src/Client.php deleted file mode 100644 index 5696ab3..0000000 --- a/Postman/Postman-Mail/mailgun/vendor/php-http/curl-client/src/Client.php +++ /dev/null @@ -1,371 +0,0 @@ -<?php -namespace Http\Client\Curl; - -use Http\Client\Exception; -use Http\Client\HttpAsyncClient; -use Http\Client\HttpClient; -use Http\Discovery\MessageFactoryDiscovery; -use Http\Discovery\StreamFactoryDiscovery; -use Http\Message\MessageFactory; -use Http\Message\StreamFactory; -use Http\Promise\Promise; -use Psr\Http\Message\RequestInterface; -use Psr\Http\Message\ResponseInterface; - -/** - * PSR-7 compatible cURL based HTTP client - * - * @license http://opensource.org/licenses/MIT MIT - * - * @author Михаил Красильников <m.krasilnikov@yandex.ru> - * @author Blake Williams <github@shabbyrobe.org> - * - * @api - * @since 1.0 - */ -class Client implements HttpClient, HttpAsyncClient -{ - /** - * cURL options - * - * @var array - */ - private $options; - - /** - * PSR-7 message factory - * - * @var MessageFactory - */ - private $messageFactory; - - /** - * PSR-7 stream factory - * - * @var StreamFactory - */ - private $streamFactory; - - /** - * cURL synchronous requests handle - * - * @var resource|null - */ - private $handle = null; - - /** - * Simultaneous requests runner - * - * @var MultiRunner|null - */ - private $multiRunner = null; - - /** - * Create new client - * - * @param MessageFactory|null $messageFactory HTTP Message factory - * @param StreamFactory|null $streamFactory HTTP Stream factory - * @param array $options cURL options (see http://php.net/curl_setopt) - * - * @throws \Http\Discovery\Exception\NotFoundException If factory discovery failed. - * - * @since 1.0 - */ - public function __construct( - MessageFactory $messageFactory = null, - StreamFactory $streamFactory = null, - array $options = [] - ) { - $this->messageFactory = $messageFactory ?: MessageFactoryDiscovery::find(); - $this->streamFactory = $streamFactory ?: StreamFactoryDiscovery::find(); - $this->options = $options; - } - - /** - * Release resources if still active - */ - public function __destruct() - { - if (is_resource($this->handle)) { - curl_close($this->handle); - } - } - - /** - * Sends a PSR-7 request. - * - * @param RequestInterface $request - * - * @return ResponseInterface - * - * @throws \Http\Client\Exception\NetworkException In case of network problems. - * @throws \Http\Client\Exception\RequestException On invalid request. - * @throws \InvalidArgumentException For invalid header names or values. - * @throws \RuntimeException If creating the body stream fails. - * - * @since 1.6 \UnexpectedValueException replaced with RequestException. - * @since 1.6 Throw NetworkException on network errors. - * @since 1.0 - */ - public function sendRequest(RequestInterface $request) - { - $responseBuilder = $this->createResponseBuilder(); - $options = $this->createCurlOptions($request, $responseBuilder); - - if (is_resource($this->handle)) { - curl_reset($this->handle); - } else { - $this->handle = curl_init(); - } - - curl_setopt_array($this->handle, $options); - curl_exec($this->handle); - - $errno = curl_errno($this->handle); - switch ($errno) { - case CURLE_OK: - // All OK, no actions needed. - break; - case CURLE_COULDNT_RESOLVE_PROXY: - case CURLE_COULDNT_RESOLVE_HOST: - case CURLE_COULDNT_CONNECT: - case CURLE_OPERATION_TIMEOUTED: - case CURLE_SSL_CONNECT_ERROR: - throw new Exception\NetworkException(curl_error($this->handle), $request); - default: - throw new Exception\RequestException(curl_error($this->handle), $request); - } - - $response = $responseBuilder->getResponse(); - $response->getBody()->seek(0); - - return $response; - } - - /** - * Sends a PSR-7 request in an asynchronous way. - * - * @param RequestInterface $request - * - * @return Promise - * - * @throws \Http\Client\Exception\RequestException On invalid request. - * @throws \InvalidArgumentException For invalid header names or values. - * @throws \RuntimeException If creating the body stream fails. - * - * @since 1.6 \UnexpectedValueException replaced with RequestException. - * @since 1.0 - */ - public function sendAsyncRequest(RequestInterface $request) - { - if (!$this->multiRunner instanceof MultiRunner) { - $this->multiRunner = new MultiRunner(); - } - - $handle = curl_init(); - $responseBuilder = $this->createResponseBuilder(); - $options = $this->createCurlOptions($request, $responseBuilder); - curl_setopt_array($handle, $options); - - $core = new PromiseCore($request, $handle, $responseBuilder); - $promise = new CurlPromise($core, $this->multiRunner); - $this->multiRunner->add($core); - - return $promise; - } - - /** - * Generates cURL options - * - * @param RequestInterface $request - * @param ResponseBuilder $responseBuilder - * - * @throws \Http\Client\Exception\RequestException On invalid request. - * @throws \InvalidArgumentException For invalid header names or values. - * @throws \RuntimeException if can not read body - * - * @return array - */ - private function createCurlOptions(RequestInterface $request, ResponseBuilder $responseBuilder) - { - $options = $this->options; - - $options[CURLOPT_HEADER] = false; - $options[CURLOPT_RETURNTRANSFER] = false; - $options[CURLOPT_FOLLOWLOCATION] = false; - - try { - $options[CURLOPT_HTTP_VERSION] - = $this->getProtocolVersion($request->getProtocolVersion()); - } catch (\UnexpectedValueException $e) { - throw new Exception\RequestException($e->getMessage(), $request); - } - $options[CURLOPT_URL] = (string) $request->getUri(); - - $options = $this->addRequestBodyOptions($request, $options); - - $options[CURLOPT_HTTPHEADER] = $this->createHeaders($request, $options); - - if ($request->getUri()->getUserInfo()) { - $options[CURLOPT_USERPWD] = $request->getUri()->getUserInfo(); - } - - $options[CURLOPT_HEADERFUNCTION] = function ($ch, $data) use ($responseBuilder) { - $str = trim($data); - if ('' !== $str) { - if (strpos(strtolower($str), 'http/') === 0) { - $responseBuilder->setStatus($str)->getResponse(); - } else { - $responseBuilder->addHeader($str); - } - } - - return strlen($data); - }; - - $options[CURLOPT_WRITEFUNCTION] = function ($ch, $data) use ($responseBuilder) { - return $responseBuilder->getResponse()->getBody()->write($data); - }; - - return $options; - } - - /** - * Return cURL constant for specified HTTP version - * - * @param string $requestVersion - * - * @throws \UnexpectedValueException if unsupported version requested - * - * @return int - */ - private function getProtocolVersion($requestVersion) - { - switch ($requestVersion) { - case '1.0': - return CURL_HTTP_VERSION_1_0; - case '1.1': - return CURL_HTTP_VERSION_1_1; - case '2.0': - if (defined('CURL_HTTP_VERSION_2_0')) { - return CURL_HTTP_VERSION_2_0; - } - throw new \UnexpectedValueException('libcurl 7.33 needed for HTTP 2.0 support'); - } - - return CURL_HTTP_VERSION_NONE; - } - - /** - * Add request body related cURL options. - * - * @param RequestInterface $request - * @param array $options - * - * @return array - */ - private function addRequestBodyOptions(RequestInterface $request, array $options) - { - /* - * Some HTTP methods cannot have payload: - * - * - GET — cURL will automatically change method to PUT or POST if we set CURLOPT_UPLOAD or - * CURLOPT_POSTFIELDS. - * - HEAD — cURL treats HEAD as GET request with a same restrictions. - * - TRACE — According to RFC7231: a client MUST NOT send a message body in a TRACE request. - */ - if (!in_array($request->getMethod(), ['GET', 'HEAD', 'TRACE'], true)) { - $body = $request->getBody(); - $bodySize = $body->getSize(); - if ($bodySize !== 0) { - if ($body->isSeekable()) { - $body->rewind(); - } - - // Message has non empty body. - if (null === $bodySize || $bodySize > 1024 * 1024) { - // Avoid full loading large or unknown size body into memory - $options[CURLOPT_UPLOAD] = true; - if (null !== $bodySize) { - $options[CURLOPT_INFILESIZE] = $bodySize; - } - $options[CURLOPT_READFUNCTION] = function ($ch, $fd, $length) use ($body) { - return $body->read($length); - }; - } else { - // Small body can be loaded into memory - $options[CURLOPT_POSTFIELDS] = (string) $body; - } - } - } - - if ($request->getMethod() === 'HEAD') { - // This will set HTTP method to "HEAD". - $options[CURLOPT_NOBODY] = true; - } elseif ($request->getMethod() !== 'GET') { - // GET is a default method. Other methods should be specified explicitly. - $options[CURLOPT_CUSTOMREQUEST] = $request->getMethod(); - } - - return $options; - } - - /** - * Create headers array for CURLOPT_HTTPHEADER - * - * @param RequestInterface $request - * @param array $options cURL options - * - * @return string[] - */ - private function createHeaders(RequestInterface $request, array $options) - { - $curlHeaders = []; - $headers = $request->getHeaders(); - foreach ($headers as $name => $values) { - $header = strtolower($name); - if ('expect' === $header) { - // curl-client does not support "Expect-Continue", so dropping "expect" headers - continue; - } - if ('content-length' === $header) { - if (array_key_exists(CURLOPT_POSTFIELDS, $options)) { - // Small body content length can be calculated here. - $values = [strlen($options[CURLOPT_POSTFIELDS])]; - } elseif (!array_key_exists(CURLOPT_READFUNCTION, $options)) { - // Else if there is no body, forcing "Content-length" to 0 - $values = [0]; - } - } - foreach ($values as $value) { - $curlHeaders[] = $name . ': ' . $value; - } - } - /* - * curl-client does not support "Expect-Continue", but cURL adds "Expect" header by default. - * We can not suppress it, but we can set it to empty. - */ - $curlHeaders[] = 'Expect:'; - - return $curlHeaders; - } - - /** - * Create new ResponseBuilder instance - * - * @return ResponseBuilder - * - * @throws \RuntimeException If creating the stream from $body fails. - */ - private function createResponseBuilder() - { - try { - $body = $this->streamFactory->createStream(fopen('php://temp', 'w+b')); - } catch (\InvalidArgumentException $e) { - throw new \RuntimeException('Can not create "php://temp" stream.'); - } - $response = $this->messageFactory->createResponse(200, null, [], $body); - - return new ResponseBuilder($response); - } -} |