Skip to content

Instantly share code, notes, and snippets.

@Domm98CZ Domm98CZ/CurlFactory.php
Last active Apr 28, 2020

Embed
What would you like to do?
<?php declare(strict_types=1);
namespace App;
use RuntimeException;
use Wavevision\DIServiceAnnotation\DIService;
/**
* @DIService(generateInject=true)
*
* Class cURLFactory
* @package App
*/
class CurlFactory
{
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public const
CURL_METHOD_GET = 'GET',
CURL_METHOD_POST = 'POST',
CURL_METHOD_PUT = 'PUT',
CURL_METHOD_HEAD = 'HEAD',
CURL_METHOD_DELETE = 'DELETE',
CURL_METHOD_PATCH = 'PATCH',
CURL_METHOD_OPTIONS = 'OPTIONS'
;
public const
CURL_PROTOCOL_HTTP = 'http',
CURL_PROTOCOL_HTTPS = 'https',
CURL_PROTOCOL_FTP = 'ftp',
CURL_PROTOCOL_FTPS = 'ftps',
CURL_PROTOCOL_SMTP = 'smtp',
CURL_PROTOCOL_NTP = 'ntp'
;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/** @var bool|null */
private ?bool $ssl_verify_host = null;
/** @var bool|null */
private ?bool $ssl_verify_peer = null;
/** @var array */
private array $headers = [];
/** @var array */
private array $customOptions = [];
/** @var string|null */
private ?string $method = null;
/**@var string|null */
private ?string $curlError;
/** @var array|null */
private ?array $curlInfo;
/** @var int|null */
private ?int $httpCode;
/** @var string|bool */
private $response;
/** @var string */
private string $postFields = '';
/** @var null */
private $ch = null;
/** @var int */
private int $timeout = 0;
/** @var string|null */
private ?string $uri = null;
/** @var string|null */
private ?string $cert = null;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* @param string $uri
* @param array $queryArgs
* @param bool $doUseUrlEncode
*/
public function createRequest(string $uri, array $queryArgs = [], bool $doUseUrlEncode = false): void
{
$this->clear();
if(!empty($queryArgs)) {
$query = parse_url($uri, PHP_URL_QUERY);
$firstArg = !$query;
foreach($queryArgs as $key => $value) {
if($doUseUrlEncode) {
$value = rawurlencode(utf8_encode($value));
}
if($firstArg) {
$uri .= sprintf('?%s=%s', $key, $value);
$firstArg = false;
} else {
$uri .= sprintf('&%s=%s', $key, $value);
}
}
}
if (!isset($this->ch) || $this->ch === null) {
$this->ch = $this->configureCurlClientBase($uri);
} else {
throw new SingleRuntimeException('Curl client is already running.');
}
}
/**
*
*/
public function execute(): void
{
$this->configureCurlClientRequest($this->ch);
$this->configureCurlClientResponse($this->ch);
unset($this->ch);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* @param $curlClient
* @return mixed
*/
private function configureCurlClientRequest(&$curlClient)
{
if($this->isSslVerifyHost() !== null) {
curl_setopt($curlClient, CURLOPT_SSL_VERIFYHOST, $this->isSslVerifyHost() ? '2' : false);
}
if($this->isSslVerifyPeer() !== null) {
curl_setopt($curlClient, CURLOPT_SSL_VERIFYPEER, $this->isSslVerifyPeer());
}
if($this->getCert() !== null) {
curl_setopt($curlClient, CURLOPT_CAINFO, $this->getCert());
}
curl_setopt($curlClient, CURLOPT_HEADER, 0);
curl_setopt($curlClient, CURLOPT_HTTPHEADER, $this->getHeaders());
if($this->getMethod() === self::CURL_METHOD_POST) {
curl_setopt($curlClient, CURLOPT_POST, true);
} else {
curl_setopt($curlClient, CURLOPT_CUSTOMREQUEST, $this->getMethod() ?? self::CURL_METHOD_GET);
}
if (!empty($this->getCustomOptions())) {
foreach ($this->getCustomOptions() as $option => $value) {
curl_setopt($curlClient, $option, $value);
}
}
curl_setopt($curlClient, CURLOPT_POSTFIELDS, $this->getPostFields());
curl_setopt($curlClient, CURLOPT_TIMEOUT, $this->getTimeout());
return $curlClient;
}
/**
* @param $curlClient
* @return mixed
*/
private function configureCurlClientResponse(&$curlClient)
{
$result = curl_exec($curlClient);
$this->setResponse($result);
if (curl_errno($curlClient)) {
$this->setCurlError(curl_error($curlClient));
}
$this->setHttpCode(curl_getinfo($curlClient, CURLINFO_HTTP_CODE));
$this->setCurlInfo(curl_getinfo($curlClient));
curl_close($curlClient);
return $curlClient;
}
/**
* @param string $uri
* @param string $defaultMethod
* @return false|resource
*/
private function configureCurlClientBase(string $uri)
{
$this->setUri($uri);
$curlClient = curl_init($uri);
curl_setopt($curlClient, CURLOPT_FAILONERROR, true);
curl_setopt($curlClient, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curlClient, CURLOPT_RETURNTRANSFER, true);
return $curlClient;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* @return string|null
*/
public function getCert(): ?string
{
return $this->cert;
}
/**
* @param string|null $cert
*/
public function setCert(?string $cert): void
{
$this->cert = $cert;
}
/**
* @return string|null
*/
public function getUri(): ?string
{
return $this->uri;
}
/**
* @param string|null $uri
*/
private function setUri(?string $uri): void
{
$this->uri = $uri;
}
/**
* @return int
*/
public function getTimeout(): int
{
return $this->timeout;
}
/**
* @param int $timeout
*/
public function setTimeout(int $timeout): void
{
$this->timeout = $timeout;
}
/**
* @return string
*/
public function getPostFields(): string
{
return $this->postFields;
}
/**
* @param string $postFields
*/
public function setPostFields(string $postFields): void
{
$this->postFields = $postFields;
}
/**
* @return bool|string
*/
public function getResponse()
{
return $this->response;
}
/**
* @param bool|string $response
*/
private function setResponse($response): void
{
$this->response = $response;
}
/**
* @return int|null
*/
public function getHttpCode(): ?int
{
return $this->httpCode;
}
/**
* @param int|null $httpCode
*/
private function setHttpCode(?int $httpCode): void
{
$this->httpCode = $httpCode;
}
/**
* @return array|null
*/
public function getCurlInfo(): ?array
{
return $this->curlInfo;
}
/**
* @param array|null $curlInfo
*/
private function setCurlInfo(?array $curlInfo): void
{
$this->curlInfo = $curlInfo;
}
/**
* @return string|null
*/
public function getCurlError(): ?string
{
return $this->curlError;
}
/**
* @param string|null $curlError
*/
private function setCurlError(?string $curlError): void
{
$this->curlError = $curlError;
}
/**
* @return string|null
*/
public function getMethod(): ?string
{
return $this->method;
}
/**
* @param string $method
*/
public function setMethod(string $method): void
{
$this->method = $method;
}
/**
* @return array
*/
public function getCustomOptions(): array
{
return $this->customOptions;
}
/**
* @param array $customOptions
*/
public function setCustomOptions(array $customOptions): void
{
$this->customOptions = $customOptions;
}
/**
* @return array
*/
public function getHeaders(): array
{
return $this->headers;
}
/**
* @param array $headers
*/
public function setHeaders(array $headers): void
{
$this->headers = $headers;
}
/**
* @return bool|null
*/
public function isSslVerifyHost(): ?bool
{
return $this->ssl_verify_host;
}
/**
* @param bool|null $ssl_verify_host
*/
public function setSslVerifyHost(?bool $ssl_verify_host): void
{
$this->ssl_verify_host = $ssl_verify_host;
}
/**
* @return bool|null
*/
public function isSslVerifyPeer(): ?bool
{
return $this->ssl_verify_peer;
}
/**
* @param bool|null $ssl_verify_peer
*/
public function setSslVerifyPeer(?bool $ssl_verify_peer): void
{
$this->ssl_verify_peer = $ssl_verify_peer;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
*
*/
public function clear(): void
{
foreach($this as $key => $value) {
if($key === 'postFields') {
$this->$key = '';
continue;
}
if(is_array($value)) {
$this->$key = [];
} else if(is_int($value)) {
$this->$key = 0;
} else {
$this->$key = null;
}
}
}
/**
*
*/
public function debug(): void
{
bdump($this, __CLASS__);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* Class SingleRuntimeException
* @package App
*/
class SingleRuntimeException extends RuntimeException {
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.