X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=application%2Fhub%2Fmain%2Fhandler%2Fnetwork%2Ftcp%2Fclass_TcpNetworkPackageHandler.php;h=7b644f83bc754286c5d4f0d95680672ddf836081;hb=69e7b3de7c369cd0ddc74c75d319055cbf4a3a04;hp=0a6d3cbab406bab5aa13d965127afa2baab2ccf3;hpb=1212b8422d9040c36c355c2c81c689dda7fd79ad;p=hub.git diff --git a/application/hub/main/handler/network/tcp/class_TcpNetworkPackageHandler.php b/application/hub/main/handler/network/tcp/class_TcpNetworkPackageHandler.php index 0a6d3cbab..7b644f83b 100644 --- a/application/hub/main/handler/network/tcp/class_TcpNetworkPackageHandler.php +++ b/application/hub/main/handler/network/tcp/class_TcpNetworkPackageHandler.php @@ -44,75 +44,39 @@ class TcpNetworkPackageHandler extends BaseNetworkPackageHandler implements Netw // Get new instance $handlerInstance = new TcpNetworkPackageHandler(); - // Initialize new resolver instance - $resolverInstance = ObjectFactory::createObjectByConfiguredName('network_state_resolver_class'); - - // Set it in this class - $handlerInstance->setResolverInstance($resolverInstance); - // Return the prepared instance 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[NetworkPackage::INDEX_PACKAGE_CONTENT])) < 2) { - // Not entougth fields in content - $this->setErrorCode(self::PACKAGE_ERROR_INVALID_CONTENT); - } elseif (!$this->ifRecipientMatchesOwnAddress($packageData)) { - // Field 'recipient' doesn't match our address, this must always be the case - $this->setErrorCode(self::PACKAGE_ERROR_RECIPIENT_MISMATCH); - } else { - // This check went fine... - $isValid = true; - } - - // Return the result - return $isValid; - } - - /** - * Processes a package from given resource. This is mostly useful for TCP + * Processes raw data from given resource. This is mostly useful for TCP * package handling and is implemented in the TcpListener class * * @param $resource A valid resource identifier * @return void - * @throws InvalidResourceException If the given resource is invalid - * @todo ~10% done */ - public function processResourcePackage ($resource) { + public function processResourceRawData ($resource) { // Check the resource if (!is_resource($resource)) { // Throw an exception 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); // Debug message - $this->debugOutput('HANDLER: Handling TCP package from peer ' . $resource); + //* NOISY-DEBUG: */ $this->debugOutput('HANDLER: Handling TCP package from peer ' . $resource); - // Read the raw data from socket - $rawData = socket_read($resource, $this->getConfigInstance()->getConfigEntry('tcp_buffer_length'), PHP_NORMAL_READ); + /* + * Read the raw data from socket. If you change PHP_BINARY_READ to + * PHP_NORMAL_READ, this line will endless block. We only have + * simultanous threads and no real threads. + */ + $rawData = socket_read($resource, $this->getConfigInstance()->getConfigEntry('tcp_buffer_length'), PHP_BINARY_READ); + + // Debug output of read data length + //* NOISY-DEBUG: */ $this->debugOutput('LISTENER: rawData[]=' . strlen($rawData)); // Is it valid? if (($rawData === false) || (socket_last_error($resource) > 0)) { @@ -121,23 +85,15 @@ class TcpNetworkPackageHandler extends BaseNetworkPackageHandler implements Netw } elseif (empty($rawData)) { // The peer did send nothing to us $this->setErrorCode(self::SOCKET_ERROR_EMPTY_DATA); - } elseif (!$this->isPackageDataValid($rawData)) { - // Invalid package 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 of the raw data went all fine, we can now decode the raw data + $decodedData = $this->getInputStreamInstance()->streamData($rawData); - // Low-level checks are all green - $this->setErrorCode(self::PACKAGE_LEVEL_CHECK_OKAY); + // Is the decoded data false, then streamData() could not validate it + if ($decodedData !== false) { + die('decodedData(' . strlen($decodedData) . ')=' . $decodedData . "\n"); + } // END - if } - - // Get a state from the resolver for this package - $stateInstance = $this->getResolverInstance()->resolveStateByPackage($this, $packageData, $resource); - die('UNFINISHED:'.$stateInstance->__toString()."\n"); } }