Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
W
wp-http-client
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
wpdesk
wp-http-client
Merge requests
!3
Devel
Code
Review changes
Check out branch
Download
Patches
Plain diff
Expand sidebar
Merged
Devel
devel
into
master
Overview
0
Commits
3
Pipelines
1
Changes
2
Merged
Krzysztof Dyszczyk
requested to merge
devel
into
master
5 years ago
Overview
0
Commits
3
Pipelines
1
Changes
2
0
0
Merge request reports
Compare
master
master (base)
and
latest version
latest version
2a9679ea
3 commits,
5 years ago
2 files
+
202
−
203
Inline
Compare changes
Side-by-side
Inline
Show whitespace changes
Show one file at a time
Files
2
src/Curl/CurlClient.php
+
199
−
203
View file @ 2a9679ea
Edit in single-file editor
Open in Web IDE
<?php
namespace
WPDesk\HttpClient\Curl
;
use
WPDesk\HttpClient\HttpClient
;
use
WPDesk\HttpClient\HttpClientResponse
;
use
WPDesk\HttpClient\HttpClientRequestException
;
class
CurlClient
implements
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
);
}
namespace
iFirmaVendor\WPDesk\HttpClient\Curl
;
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
;
/** @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
Loading