forked from LiveCarta/PayPal-PHP-SDK
Avoids calculating header size in curl responses (#677)
- Removes complex conditions around parsing response headers
This commit is contained in:
@@ -25,6 +25,16 @@ class PayPalHttpConnection
|
|||||||
*/
|
*/
|
||||||
private $logger;
|
private $logger;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
private $responseHeaders = array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var bool
|
||||||
|
*/
|
||||||
|
private $skippedHttpStatusLine = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default Constructor
|
* Default Constructor
|
||||||
*
|
*
|
||||||
@@ -55,6 +65,57 @@ class PayPalHttpConnection
|
|||||||
return $ret;
|
return $ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parses the response headers for debugging.
|
||||||
|
*
|
||||||
|
* @param resource $ch
|
||||||
|
* @param string $data
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
protected function parseResponseHeaders($ch, $data) {
|
||||||
|
if (!$this->skippedHttpStatusLine) {
|
||||||
|
$this->skippedHttpStatusLine = true;
|
||||||
|
return strlen($data);
|
||||||
|
}
|
||||||
|
|
||||||
|
$trimmedData = trim($data);
|
||||||
|
if (strlen($trimmedData) == 0) {
|
||||||
|
return strlen($data);
|
||||||
|
}
|
||||||
|
|
||||||
|
list($key, $value) = explode(":", $trimmedData, 2);
|
||||||
|
|
||||||
|
$key = trim($key);
|
||||||
|
$value = trim($value);
|
||||||
|
|
||||||
|
// This will skip over the HTTP Status Line and any other lines
|
||||||
|
// that don't look like header lines with values
|
||||||
|
if (strlen($key) > 0 && strlen($value) > 0) {
|
||||||
|
// This is actually a very basic way of looking at response headers
|
||||||
|
// and may miss a few repeated headers with different (appended)
|
||||||
|
// values but this should work for debugging purposes.
|
||||||
|
$this->responseHeaders[$key] = $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
return strlen($data);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implodes a key/value array for printing.
|
||||||
|
*
|
||||||
|
* @param array $arr
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected function implodeArray($arr) {
|
||||||
|
$retStr = '';
|
||||||
|
foreach($arr as $key => $value) {
|
||||||
|
$retStr .= $key . ': ' . $value . ', ';
|
||||||
|
}
|
||||||
|
rtrim($retStr, ', ');
|
||||||
|
return $retStr;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Executes an HTTP request
|
* Executes an HTTP request
|
||||||
*
|
*
|
||||||
@@ -75,7 +136,7 @@ class PayPalHttpConnection
|
|||||||
}
|
}
|
||||||
curl_setopt_array($ch, $options);
|
curl_setopt_array($ch, $options);
|
||||||
curl_setopt($ch, CURLOPT_URL, $this->httpConfig->getUrl());
|
curl_setopt($ch, CURLOPT_URL, $this->httpConfig->getUrl());
|
||||||
curl_setopt($ch, CURLOPT_HEADER, true);
|
curl_setopt($ch, CURLOPT_HEADER, false);
|
||||||
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
|
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
|
||||||
curl_setopt($ch, CURLOPT_HTTPHEADER, $this->getHttpHeaders());
|
curl_setopt($ch, CURLOPT_HTTPHEADER, $this->getHttpHeaders());
|
||||||
|
|
||||||
@@ -97,11 +158,9 @@ class PayPalHttpConnection
|
|||||||
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $this->httpConfig->getMethod());
|
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $this->httpConfig->getMethod());
|
||||||
}
|
}
|
||||||
|
|
||||||
//Logging Each Headers for debugging purposes
|
$this->responseHeaders = array();
|
||||||
foreach ($this->getHttpHeaders() as $header) {
|
$this->skippedHttpStatusLine = false;
|
||||||
//TODO: Strip out credentials and other secure info when logging.
|
curl_setopt($ch, CURLOPT_HEADERFUNCTION, array($this, 'parseResponseHeaders'));
|
||||||
// $this->logger->debug($header);
|
|
||||||
}
|
|
||||||
|
|
||||||
//Execute Curl Request
|
//Execute Curl Request
|
||||||
$result = curl_exec($ch);
|
$result = curl_exec($ch);
|
||||||
@@ -130,21 +189,10 @@ class PayPalHttpConnection
|
|||||||
|
|
||||||
// Get Request and Response Headers
|
// Get Request and Response Headers
|
||||||
$requestHeaders = curl_getinfo($ch, CURLINFO_HEADER_OUT);
|
$requestHeaders = curl_getinfo($ch, CURLINFO_HEADER_OUT);
|
||||||
//Using alternative solution to CURLINFO_HEADER_SIZE as it throws invalid number when called using PROXY.
|
|
||||||
if (function_exists('mb_strlen')) {
|
|
||||||
$responseHeaderSize = mb_strlen($result, '8bit') - curl_getinfo($ch, CURLINFO_SIZE_DOWNLOAD);
|
|
||||||
$responseHeaders = mb_substr($result, 0, $responseHeaderSize, '8bit');
|
|
||||||
$result = mb_substr($result, $responseHeaderSize, mb_strlen($result), '8bit');
|
|
||||||
} else {
|
|
||||||
$responseHeaderSize = strlen($result) - curl_getinfo($ch, CURLINFO_SIZE_DOWNLOAD);
|
|
||||||
$responseHeaders = substr($result, 0, $responseHeaderSize);
|
|
||||||
$result = substr($result, $responseHeaderSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->logger->debug("Request Headers \t: " . str_replace("\r\n", ", ", $requestHeaders));
|
$this->logger->debug("Request Headers \t: " . str_replace("\r\n", ", ", $requestHeaders));
|
||||||
$this->logger->debug(($data && $data != '' ? "Request Data\t\t: " . $data : "No Request Payload") . "\n" . str_repeat('-', 128) . "\n");
|
$this->logger->debug(($data && $data != '' ? "Request Data\t\t: " . $data : "No Request Payload") . "\n" . str_repeat('-', 128) . "\n");
|
||||||
$this->logger->info("Response Status \t: " . $httpStatus);
|
$this->logger->info("Response Status \t: " . $httpStatus);
|
||||||
$this->logger->debug("Response Headers\t: " . str_replace("\r\n", ", ", $responseHeaders));
|
$this->logger->debug("Response Headers\t: " . $this->implodeArray($this->responseHeaders));
|
||||||
|
|
||||||
//Close the curl request
|
//Close the curl request
|
||||||
curl_close($ch);
|
curl_close($ch);
|
||||||
|
|||||||
Reference in New Issue
Block a user