From f0ced4a50fc9de694f6ad6cfce79060930d24a78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pan=20=C4=8Ceperka?= Date: Mon, 23 Jan 2017 11:01:32 +0100 Subject: [PATCH] SoapClient - save last response --- src/SoapClient.php | 245 +++++++++++++++++++++++++-------------------- 1 file changed, 138 insertions(+), 107 deletions(-) diff --git a/src/SoapClient.php b/src/SoapClient.php index dcf2a50..18599f5 100644 --- a/src/SoapClient.php +++ b/src/SoapClient.php @@ -8,30 +8,30 @@ use RobRichards\XMLSecLibs\XMLSecurityKey; class SoapClient extends \SoapClient { - - /** @var string */ - private $key; - - /** @var string */ - private $cert; - - /** @var boolean */ - private $traceRequired; - - /** @var float */ - private $connectionStartTime; - - /** @var float */ - private $lastResponseStartTime; - - /** @var float */ - private $lastResponseEndTime; - - /** @var string */ - private $lastRequest; - + + /** @var string */ + private $key; + + /** @var string */ + private $cert; + + /** @var boolean */ + private $traceRequired; + + /** @var float */ + private $connectionStartTime; + + /** @var float */ + private $lastResponseStartTime; + + /** @var float */ + private $lastResponseEndTime; + + /** @var string */ + private $lastRequest; + private $returnRequest = FALSE; - + /** * @var int timeout in milliseconds */ @@ -40,67 +40,77 @@ class SoapClient extends \SoapClient { * @var int connection timeout in milliseconds */ private $connectTimeout = 2000; - - /** - * - * @param string $service - * @param string $key - * @param string $cert - * @param boolean $trace - */ - public function __construct($service, $key, $cert, $trace = FALSE) { - $this->connectionStartTime = microtime(TRUE); - parent::__construct($service, [ - 'exceptions' => TRUE, - 'trace' => $trace - ]); - $this->key = $key; - $this->cert = $cert; - $this->traceRequired = $trace; - } - + + /** + * @var string + */ + private $lastResponse; + + /** + * @var string + */ + private $lastResponseBody; + + /** + * + * @param string $service + * @param string $key + * @param string $cert + * @param boolean $trace + */ + public function __construct($service, $key, $cert, $trace = FALSE) { + $this->connectionStartTime = microtime(TRUE); + parent::__construct($service, [ + 'exceptions' => TRUE, + 'trace' => $trace + ]); + $this->key = $key; + $this->cert = $cert; + $this->traceRequired = $trace; + } + public function getXML($request) { - + $doc = new \DOMDocument('1.0'); $doc->loadXML($request); - + $objWSSE = new WSSESoap($doc); $objWSSE->addTimestamp(); - + $objKey = new XMLSecurityKey(XMLSecurityKey::RSA_SHA256, ['type' => 'private']); $objKey->loadKey($this->key, TRUE); $objWSSE->signSoapDoc($objKey, ["algorithm" => XMLSecurityDSig::SHA256]); - + $token = $objWSSE->addBinaryToken(file_get_contents($this->cert)); $objWSSE->attachTokentoSig($token); - + return $objWSSE->saveXML(); } - + public function getXMLforMethod($method, $data) { $this->returnRequest = TRUE; $this->$method($data); $this->returnRequest = FALSE; return $this->lastRequest; } - - public function __doRequest($request, $location, $saction, $version, $one_way = NULL) { - - $xml = $this->getXML($request); + + public function __doRequest($request, $location, $saction, $version, $one_way = NULL) { + + $xml = $this->getXML($request); $this->lastRequest = $xml; if ($this->returnRequest) { return ''; } - - $this->traceRequired && $this->lastResponseStartTime = microtime(TRUE); - + + $this->traceRequired && $this->lastResponseStartTime = microtime(TRUE); + $response = $this->__doRequestByCurl($xml, $location, $saction, $version); - - $this->traceRequired && $this->lastResponseEndTime = microtime(TRUE); - - return $response; - } - + + $this->traceRequired && $this->lastResponseEndTime = microtime(TRUE); + + return $response; + } + /** * @param string $request * @param string $location @@ -137,21 +147,23 @@ public function __doRequestByCurl($request, $location, $action, $version, $one_w $options = $this->__curlSetTimeoutOption($options, $this->timeout, 'CURLOPT_TIMEOUT'); // ConnectTimeout in milliseconds $options = $this->__curlSetTimeoutOption($options, $this->connectTimeout, 'CURLOPT_CONNECTTIMEOUT'); - + $this->__setCurlOptions($curl, $options); $response = curl_exec($curl); - + $this->lastResponse = $response; + if (curl_errno($curl)) { $errorMessage = curl_error($curl); $errorNumber = curl_errno($curl); curl_close($curl); throw new ClientException($errorMessage, $errorNumber); } - + $header_len = curl_getinfo($curl, CURLINFO_HEADER_SIZE); $header = substr($response, 0, $header_len); $body = substr($response, $header_len); - + $this->lastResponseBody = $body; + curl_close($curl); // Return? if ($one_way) { @@ -160,7 +172,7 @@ public function __doRequestByCurl($request, $location, $action, $version, $one_w return $body; } } - + private function __setCurlOptions($curl, array $options) { foreach ($options as $option => $value) { @@ -172,7 +184,7 @@ private function __setCurlOptions($curl, array $options) ); } } - + private function __curlSetTimeoutOption($options, $milliseconds, $name) { if ($milliseconds > 0) { @@ -188,45 +200,45 @@ private function __curlSetTimeoutOption($options, $milliseconds, $name) } return $options; } - - + + /** - * - * @return float - */ - public function __getLastResponseTime() { - return $this->lastResponseEndTime - $this->lastResponseStartTime; - } - - /** - * - * @return float - */ - public function __getConnectionTime($tillLastRequest = FALSE) { - return $tillLastRequest ? $this->getConnectionTimeTillLastRequest() : $this->getConnectionTimeTillNow(); - } - - private function getConnectionTimeTillLastRequest() { - if (!$this->lastResponseEndTime || !$this->connectionStartTime) { - return NULL; - } - return $this->lastResponseEndTime - $this->connectionStartTime; - } - - private function getConnectionTimeTillNow() { - if (!$this->connectionStartTime) { - return NULL; - } - return microtime(TRUE) - $this->connectionStartTime; - } - - /** - * @return string - */ - public function __getLastRequest() { - return $this->lastRequest; - } - + * + * @return float + */ + public function __getLastResponseTime() { + return $this->lastResponseEndTime - $this->lastResponseStartTime; + } + + /** + * + * @return float + */ + public function __getConnectionTime($tillLastRequest = FALSE) { + return $tillLastRequest ? $this->getConnectionTimeTillLastRequest() : $this->getConnectionTimeTillNow(); + } + + private function getConnectionTimeTillLastRequest() { + if (!$this->lastResponseEndTime || !$this->connectionStartTime) { + return NULL; + } + return $this->lastResponseEndTime - $this->connectionStartTime; + } + + private function getConnectionTimeTillNow() { + if (!$this->connectionStartTime) { + return NULL; + } + return microtime(TRUE) - $this->connectionStartTime; + } + + /** + * @return string + */ + public function __getLastRequest() { + return $this->lastRequest; + } + /** * @param int|null $milliseconds timeout in milliseconds */ @@ -255,6 +267,25 @@ public function getConnectTimeout() { return $this->connectTimeout; } - - + + /** + * @return mixed + */ + public function __getLastResponse() + { + return $this->lastResponse; + } + + /** + * @return mixed + */ + public function __getLastResponseBody() + { + return $this->lastResponseBody; + } + + + + + }