diff --git a/src/Curl/CurlClient.php b/src/Curl/CurlClient.php index 9d992e82b4796003aa3cd360aaf9fbcfd18bf6e3..b71be606c29223dedb6d1687c9b9c03ad90ab529 100644 --- a/src/Curl/CurlClient.php +++ b/src/Curl/CurlClient.php @@ -1,206 +1,193 @@ <?php -namespace WPDesk\HttpClient\Curl; +namespace iFirmaVendor\WPDesk\HttpClient\Curl; -use WPDesk\HttpClient\HttpClient; -use WPDesk\HttpClient\HttpClientResponse; -use WPDesk\HttpClient\HttpClientRequestException; - -class CurlClient implements HttpClient +use iFirmaVendor\WPDesk\HttpClient\HttpClient; +use iFirmaVendor\WPDesk\HttpClient\HttpClientResponse; +use iFirmaVendor\WPDesk\HttpClient\HttpClientRequestException; +class CurlClient implements \iFirmaVendor\WPDesk\HttpClient\HttpClient { - /** @var resource */ - private $curlResource; - - /** @var string|null|boolean */ - private $rawResponse; - - /** @var int */ - private $httpResponseCode; - - /** - * @param string $url - * @param string $body - * @param array $headers - * @param int $timeOut - * @return HttpClientResponse - * @throws HttpClientRequestException - */ - public function get($url, $body, array $headers, $timeOut) - { - return $this->send($url, 'GET', $body, $headers, $timeOut); - } - - /** - * @param string $url - * @param string $method - * @param string $body - * @param array $headers - * @param int $timeOut - * @return HttpClientResponse - * @throws HttpClientRequestException - */ - public function send($url, $method, $body, array $headers, $timeOut) - { - $this->initResource(); - try { - $this->prepareConnection($url, $method, $body, $headers, $timeOut); - $this->sendRequest(); - $this->throwExceptionIfError(); - $this->closeConnection(); - - return $this->prepareResponse(); - - } catch (\Exception $e) { - $this->closeConnection(); - if ($e instanceof HttpClientRequestException) { - throw $e; - } - throw CurlExceptionFactory::createDefaultException($e->getMessage(), $e->getCode(), $e); - } - } - - private function initResource() - { - $this->curlResource = curl_init(); - } - - /** - * Opens a new curl connection. - * - * @param string $url The endpoint to send the request to. - * @param string $method The request method. - * @param string $body The body of the request. - * @param array $headers The request headers. - * @param int $timeOut The timeout in seconds for the request. - */ - private function prepareConnection($url, $method, $body, array $headers, $timeOut) - { - $options = [ - CURLOPT_CUSTOMREQUEST => $method, - CURLOPT_HTTPHEADER => $this->compileRequestHeaders($headers), - CURLOPT_URL => $url, - CURLOPT_CONNECTTIMEOUT => 10, - CURLOPT_TIMEOUT => $timeOut, - CURLOPT_RETURNTRANSFER => true, // Return response as string - CURLOPT_HEADER => true, // Enable header processing - CURLOPT_SSL_VERIFYHOST => 2, - CURLOPT_SSL_VERIFYPEER => true, - //CURLOPT_CAINFO => __DIR__ . '/certs/DigiCertHighAssuranceEVRootCA.pem', - ]; - if ($method !== "GET") { - $options[CURLOPT_POSTFIELDS] = $body; - } - - curl_setopt_array($this->curlResource, $options); - } - - /** - * Compiles the request headers into a curl-friendly format. - * - * @param array $headers The request headers. - * - * @return array - */ - private function compileRequestHeaders(array $headers) - { - $return = []; - foreach ($headers as $key => $value) { - $return[] = $key . ': ' . $value; - } - return $return; - } - - /** - * Send the request and get the raw response from curl - */ - private function sendRequest() - { - $this->rawResponse = curl_exec($this->curlResource); - $this->httpResponseCode = $this->getHttpResponseCode(); - } - - /** @return int */ - private function getHttpResponseCode() - { - return intval(curl_getinfo($this->curlResource, CURLINFO_HTTP_CODE)); - } - - private function throwExceptionIfError() - { - $errorNumber = curl_errno($this->curlResource); - if ($errorNumber === 0) { - return; - } - - $errorMessage = curl_error($this->curlResource); - throw CurlExceptionFactory::createCurlException($errorMessage, $errorNumber); - } - - /** - * Closes an existing curl connection - */ - private function closeConnection() - { - curl_close($this->curlResource); - $this->curlResource = null; - } - - private function prepareResponse() - { - list($rawHeaders, $rawBody) = $this->extractResponseHeadersAndBody(); - return new HttpClientResponse($rawHeaders, $rawBody, $this->httpResponseCode); - } - - /** - * Extracts the headers and the body into a two-part array - * - * @return array - */ - private function extractResponseHeadersAndBody() - { - $parts = explode("\r\n\r\n", $this->rawResponse, 2 ); - $rawBody = array_pop($parts); - $rawHeaders = implode("\r\n\r\n", $parts); - return [trim($rawHeaders), trim($rawBody)]; - } - - /** - * @param string $url - * @param string $body - * @param array $headers - * @param int $timeOut - * @return HttpClientResponse - * @throws HttpClientRequestException - */ - public function post($url, $body, array $headers, $timeOut) - { - return $this->send($url, 'POST', $body, $headers, $timeOut); - } - - /** - * @param string $url - * @param string $body - * @param array $headers - * @param int $timeOut - * @return HttpClientResponse - * @throws HttpClientRequestException - */ - public function delete($url, $body, array $headers, $timeOut) - { - return $this->send($url, 'DELETE', $body, $headers, $timeOut); - } - - /** - * @param string $url - * @param string $body - * @param array $headers - * @param int $timeOut - * @return HttpClientResponse - * @throws HttpClientRequestException - */ - public function put($url, $body, array $headers, $timeOut) - { - return $this->send($url, 'PUT', $body, $headers, $timeOut); - } - + /** @var resource */ + private $curlResource; + /** @var string|null|boolean */ + private $rawResponse; + /** @var int */ + private $httpResponseCode; + /** @var array */ + private $headers = array(); + /** + * @param string $url + * @param string $body + * @param array $headers + * @param int $timeOut + * @return HttpClientResponse + * @throws HttpClientRequestException + */ + public function get($url, $body, array $headers, $timeOut) + { + return $this->send($url, 'GET', $body, $headers, $timeOut); + } + /** + * @param string $url + * @param string $method + * @param string $body + * @param array $headers + * @param int $timeOut + * @return HttpClientResponse + * @throws HttpClientRequestException + */ + public function send($url, $method, $body, array $headers, $timeOut) + { + $this->initResource(); + try { + $this->prepareConnection($url, $method, $body, $headers, $timeOut); + $this->sendRequest(); + $this->throwExceptionIfError(); + $this->closeConnection(); + return $this->prepareResponse(); + } catch (\Exception $e) { + $this->closeConnection(); + if ($e instanceof \iFirmaVendor\WPDesk\HttpClient\HttpClientRequestException) { + throw $e; + } + throw \iFirmaVendor\WPDesk\HttpClient\Curl\CurlExceptionFactory::createDefaultException($e->getMessage(), $e->getCode(), $e); + } + } + private function initResource() + { + $this->curlResource = \curl_init(); + } + /** + * Opens a new curl connection. + * + * @param string $url The endpoint to send the request to. + * @param string $method The request method. + * @param string $body The body of the request. + * @param array $headers The request headers. + * @param int $timeOut The timeout in seconds for the request. + */ + private function prepareConnection($url, $method, $body, array $headers, $timeOut) + { + + $options = [ + \CURLOPT_CUSTOMREQUEST => $method, + \CURLOPT_HTTPHEADER => $this->compileRequestHeaders($headers), + \CURLOPT_URL => $url, + \CURLOPT_CONNECTTIMEOUT => 10, + \CURLOPT_TIMEOUT => $timeOut, + \CURLOPT_RETURNTRANSFER => \true, + // Return response as string + \CURLOPT_HEADER => \false, + // Enable header processing + \CURLOPT_SSL_VERIFYHOST => 2, + \CURLOPT_SSL_VERIFYPEER => \true, + \CURLOPT_HEADERFUNCTION => function ( $curl, $header ) { + $len = strlen( $header ); + $this->headers[] = trim( $header ); + + return $len; + } + ]; + if ($method !== "GET") { + $options[\CURLOPT_POSTFIELDS] = $body; + } + \curl_setopt_array($this->curlResource, $options); + } + /** + * Compiles the request headers into a curl-friendly format. + * + * @param array $headers The request headers. + * + * @return array + */ + private function compileRequestHeaders(array $headers) + { + $return = []; + foreach ($headers as $key => $value) { + $return[] = $key . ': ' . $value; + } + return $return; + } + /** + * Send the request and get the raw response from curl + */ + private function sendRequest() + { + $this->rawResponse = \curl_exec($this->curlResource); + $this->httpResponseCode = $this->getHttpResponseCode(); + } + /** @return int */ + private function getHttpResponseCode() + { + return \intval(\curl_getinfo($this->curlResource, \CURLINFO_HTTP_CODE)); + } + private function throwExceptionIfError() + { + $errorNumber = \curl_errno($this->curlResource); + if ($errorNumber === 0) { + return; + } + $errorMessage = \curl_error($this->curlResource); + throw \iFirmaVendor\WPDesk\HttpClient\Curl\CurlExceptionFactory::createCurlException($errorMessage, $errorNumber); + } + /** + * Closes an existing curl connection + */ + private function closeConnection() + { + \curl_close($this->curlResource); + $this->curlResource = null; + } + private function prepareResponse() + { + list($rawHeaders, $rawBody) = $this->extractResponseHeadersAndBody(); + return new \iFirmaVendor\WPDesk\HttpClient\HttpClientResponse($rawHeaders, $rawBody, $this->httpResponseCode); + } + /** + * Extracts the headers and the body into a two-part array + * + * @return array + */ + private function extractResponseHeadersAndBody() + { + $rawBody = \trim( $this->rawResponse ); + $rawHeaders = \trim(implode( "\r\n",$this->headers )); + return [ $rawHeaders, $rawBody ]; + } + /** + * @param string $url + * @param string $body + * @param array $headers + * @param int $timeOut + * @return HttpClientResponse + * @throws HttpClientRequestException + */ + public function post($url, $body, array $headers, $timeOut) + { + return $this->send($url, 'POST', $body, $headers, $timeOut); + } + /** + * @param string $url + * @param string $body + * @param array $headers + * @param int $timeOut + * @return HttpClientResponse + * @throws HttpClientRequestException + */ + public function delete($url, $body, array $headers, $timeOut) + { + return $this->send($url, 'DELETE', $body, $headers, $timeOut); + } + /** + * @param string $url + * @param string $body + * @param array $headers + * @param int $timeOut + * @return HttpClientResponse + * @throws HttpClientRequestException + */ + public function put($url, $body, array $headers, $timeOut) + { + return $this->send($url, 'PUT', $body, $headers, $timeOut); + } } \ No newline at end of file