]> git.mxchange.org Git - hub.git/commitdiff
Added some basic checks on received TCP packages
authorRoland Häder <roland@mxchange.org>
Sat, 22 May 2010 17:21:36 +0000 (17:21 +0000)
committerRoland Häder <roland@mxchange.org>
Sat, 22 May 2010 17:21:36 +0000 (17:21 +0000)
application/hub/main/handler/network/class_BaseNetworkPackageHandler.php
application/hub/main/handler/network/tcp/class_TcpNetworkPackageHandler.php
application/hub/main/resolver/state/network/class_NetworkStateResolver.php

index 8b3e847dd17ae42cc80739ee53e0c8d21fa4dfc5..5416504df5edd8e43207635e577a3a6e3cf91639 100644 (file)
@@ -28,6 +28,8 @@ class BaseNetworkPackageHandler extends BaseHandler {
        const SOCKET_ERROR_UNHANDLED          = 'unhandled_package';
        const SOCKET_ERROR_EMPTY_DATA         = 'empty_data';
        const PACKAGE_ERROR_INVALID_DATA      = 'invalid_data';
+       const PACKAGE_ERROR_INCOMPLETE_DATA   = 'incomplete_data';
+       const PACKAGE_ERROR_INVALID_CONTENT   = 'invalid_content';
        const PACKAGE_LEVEL_CHECK_OKAY        = 'checked_package';
 
        /**
index 6e8cef5a16b69ecae2ba515cc5f4d42badbe675c..2d634cc3a5cdc2a0309edc7b8b3abcb1389c3a82 100644 (file)
@@ -51,6 +51,35 @@ class TcpNetworkPackageHandler extends BaseNetworkPackageHandler implements Netw
                return $handlerInstance;
        }
 
+       /**
+        * Verifies the package data itself (only rudymentary check)
+        *
+        * @param       $rawData        Raw package data (as string
+        * @return      $isValid        Wether the package data is valid
+        */
+       private function isPackageDataValid ($rawData) {
+               // Default is not valid
+               $isValid = false;
+
+               // Convert it back into an array
+               $packageData = explode(NetworkPackage::PACKAGE_DATA_SEPERATOR, $rawData);
+
+               // This should be at least three entries: sender|recipient|raw data
+               if (count($packageData) < 3) {
+                       // Not enougth fields in $packageData!
+                       $this->setErrorCode(self::PACKAGE_ERROR_INCOMPLETE_DATA);
+               } elseif (count(explode(NetworkPackage::PACKAGE_MASK_SEPERATOR, $packageData[2])) < 2) {
+                       // Not entougth fields in content
+                       $this->setErrorCode(self::PACKAGE_ERROR_INVALID_CONTENT);
+               } else {
+                       // This check went fine...
+                       $isValid = true;
+               }
+
+               // Return the result
+               return $isValid;
+       }
+
        /**
         * Processes a package from given resource. This is mostly useful for TCP
         * package handling and is implemented in the TcpListener class
@@ -67,6 +96,9 @@ class TcpNetworkPackageHandler extends BaseNetworkPackageHandler implements Netw
                        throw new InvalidResourceException($this, self::EXCEPTION_INVALID_RESOURCE);
                } // END - if
 
+               // Init package data array
+               $packageData = array();
+
                // Reset error code to unhandled
                $this->setErrorCode(self::SOCKET_ERROR_UNHANDLED);
 
@@ -85,15 +117,18 @@ class TcpNetworkPackageHandler extends BaseNetworkPackageHandler implements Netw
                        $this->setErrorCode(self::SOCKET_ERROR_EMPTY_DATA);
                } elseif (!$this->isPackageDataValid($rawData)) {
                        // Invalid package data
-                       $this->setErrorCode(self::PACKAGE_ERROR_INVALID_DATA);
+                       if ($this->getErrorCode() == self::SOCKET_ERROR_UNHANDLED) {
+                               // Set it to PACKAGE_ERROR_INVALID_DATA, because SOCKET_ERROR_UNHANDLED should not be used
+                               $this->setErrorCode(self::PACKAGE_ERROR_INVALID_DATA);
+                       } // END - if
                } else {
+                       // Prepare the package data
+                       $packageData = explode(NetworkPackage::PACKAGE_DATA_SEPERATOR, $rawData);
+
                        // Low-level checks are all green
                        $this->setErrorCode(self::PACKAGE_LEVEL_CHECK_OKAY);
                }
 
-               // Prepare the package data
-               $packageData = explode(NetworkPackage::PACKAGE_DATA_SEPERATOR, $rawData);
-
                // Get a state from the resolver for this package
                $stateInstance = $this->getResolverInstance()->resolveStateByPackage($this, $packageData);
                die('UNFINISHED:'.$stateInstance->__toString());
index 60ef2ec3b36b7fc633c586f51992ad18c15fc3cf..cd314f033554c3bd60236274a3812fbded55cc37 100644 (file)
@@ -88,7 +88,7 @@ class NetworkStateResolver extends BaseStateResolver implements StateResolver {
 
                // @TODO We need to somehow detect the state/status of the remote peer and still maintain good speed.
                // @TODO So maybe some pre-instancing of classes might help here to speedup this I/O intensive process.
-               $this->partialStub('errorCode=' . $errorCode . ',rawData[] = ' . gettype($rawData) . '(' . count($rawData) . ')');
+               $this->partialStub('errorCode=' . $errorCode . ',packageData[] = ' . gettype($packageData) . '(' . count($packageData) . ')');
 
                // Return the prepared instance
                return $stateInstance;