From 8f7111457a76ff148a2d03d2ff39daf83219147f Mon Sep 17 00:00:00 2001 From: Marco Rieger Date: Thu, 14 Jan 2016 16:05:39 +0100 Subject: [PATCH 1/3] replace fsockopen with socket functions and added correct socket read --- .../GATracking/Client/Adapter/Socket.php | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/Racecore/GATracking/Client/Adapter/Socket.php b/src/Racecore/GATracking/Client/Adapter/Socket.php index 7e74e49..1b52b0a 100644 --- a/src/Racecore/GATracking/Client/Adapter/Socket.php +++ b/src/Racecore/GATracking/Client/Adapter/Socket.php @@ -20,15 +20,12 @@ private function createConenction($endpoint) // port $port = $this->getOption('ssl') == true ? 443 : 80; - // connect - $connection = @fsockopen($port == 443 ? 'ssl://' . $endpoint['host'] : $endpoint['host'], $port, $error, $errorMessage, 10); - if (!$connection || $error) { - throw new Exception\EndpointServerException('Analytics Host not reachable! Error:' . $errorMessage); - } + $connection = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); + socket_connect($connection, $endpoint['host'], $port); - if ($this->getOption('async')) { - stream_set_blocking($connection, 0); + if (!$connection) { + throw new Exception\EndpointServerException('Analytics Host not reachable! Error:'); } $this->connection = $connection; @@ -55,7 +52,7 @@ private function writeHeader($endpoint, Request\TrackingRequest $request, $lastD ($lastData ? 'Connection: Close' . "\r\n" : '') . "\r\n"; // fwrite + check if fwrite was ok - if (!fwrite($this->connection, $header) || !fwrite($this->connection, $payloadString)) { + if (!socket_write($this->connection, $header) || !socket_write($this->connection, $payloadString)) { throw new Exception\EndpointServerException('Server closed connection unexpectedly'); } @@ -77,8 +74,12 @@ private function readConnection(Request\TrackingRequest $request) $response = ''; // receive response - while (!feof($this->connection)) { - $response .= fread($this->connection, 8192); + while ($out = socket_read($this->connection, 2048)) { + $response .= $out; + + if (strlen($out) < 2048) { + break; + } } // response @@ -110,9 +111,8 @@ public function send($url, Request\TrackingRequestCollection $requestCollection) $request->setResponseHeader($responseHeader); } - // connection close - fclose($this->connection); + socket_close($this->connection); return $requestCollection; } From cfec5666d4a817e96f401a79fb336f81546ad777 Mon Sep 17 00:00:00 2001 From: Marco Rieger Date: Thu, 14 Jan 2016 17:38:02 +0100 Subject: [PATCH 2/3] added async and read timeout --- .../GATracking/Client/Adapter/Socket.php | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/Racecore/GATracking/Client/Adapter/Socket.php b/src/Racecore/GATracking/Client/Adapter/Socket.php index 1b52b0a..1e7f7e0 100644 --- a/src/Racecore/GATracking/Client/Adapter/Socket.php +++ b/src/Racecore/GATracking/Client/Adapter/Socket.php @@ -8,6 +8,9 @@ class Socket extends Client\AbstractClientAdapter { + const READ_TIMEOUT = 3; + const READ_BUFFER = 8192; + private $connection = null; /** @@ -20,9 +23,13 @@ private function createConenction($endpoint) // port $port = $this->getOption('ssl') == true ? 443 : 80; - $connection = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); socket_connect($connection, $endpoint['host'], $port); + socket_set_option($connection, SOL_SOCKET, SO_RCVTIMEO, array('sec' => self::READ_TIMEOUT, 'usec' => 0)); + + if ($this->getOption('async')) { + socket_set_nonblock($connection); + } if (!$connection) { throw new Exception\EndpointServerException('Analytics Host not reachable! Error:'); @@ -66,21 +73,18 @@ private function writeHeader($endpoint, Request\TrackingRequest $request, $lastD */ private function readConnection(Request\TrackingRequest $request) { - if ($this->getOption('async')) { - return false; - } - // response $response = ''; // receive response - while ($out = socket_read($this->connection, 2048)) { + do { + $out = @socket_read($this->connection, self::READ_BUFFER); $response .= $out; - if (strlen($out) < 2048) { + if(!$out || strlen($out) < self::READ_BUFFER) { break; } - } + } while (true); // response $responseContainer = explode("\r\n\r\n", $response, 2); From c375eb3c8e186d9bc26d722e48685fb29f56c05e Mon Sep 17 00:00:00 2001 From: Marco Rieger Date: Thu, 14 Jan 2016 17:45:52 +0100 Subject: [PATCH 3/3] cs fix --- src/Racecore/GATracking/Client/Adapter/Socket.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Racecore/GATracking/Client/Adapter/Socket.php b/src/Racecore/GATracking/Client/Adapter/Socket.php index 1e7f7e0..babf971 100644 --- a/src/Racecore/GATracking/Client/Adapter/Socket.php +++ b/src/Racecore/GATracking/Client/Adapter/Socket.php @@ -81,7 +81,7 @@ private function readConnection(Request\TrackingRequest $request) $out = @socket_read($this->connection, self::READ_BUFFER); $response .= $out; - if(!$out || strlen($out) < self::READ_BUFFER) { + if (!$out || strlen($out) < self::READ_BUFFER) { break; } } while (true);