diff options
author | Robert Lu <robberphex@gmail.com> | 2018-01-18 19:06:39 +0800 |
---|---|---|
committer | James E. King III <jking@apache.org> | 2018-01-24 00:07:54 -0500 |
commit | b03ca01cc9c46fc835174ab13b5a09f9cbf82249 (patch) | |
tree | e2e211481680b1d5dd52913376bc5787583069e3 | |
parent | 8d96b3bbddb27aa4512031e0c923fe4c6865db07 (diff) | |
download | thrift-b03ca01cc9c46fc835174ab13b5a09f9cbf82249.tar.gz |
THRIFT-4460: Use PSR-2 as php library coding standard
Client: php
This closes #1472
48 files changed, 4234 insertions, 4117 deletions
diff --git a/build/docker/scripts/sca.sh b/build/docker/scripts/sca.sh index 38803d4ae..c9a36686b 100755 --- a/build/docker/scripts/sca.sh +++ b/build/docker/scripts/sca.sh @@ -49,6 +49,10 @@ flake8 --ignore=E501 test/test.py flake8 --ignore=E501,E722 test/crossrunner flake8 test/features +# PHP code style +composer install --quiet +./vendor/bin/phpcs + # TODO etc echo FIXMEs: `grep -r FIXME * | wc -l` echo HACKs: `grep -r HACK * | wc -l` diff --git a/composer.json b/composer.json index af0135df4..9a3833161 100644 --- a/composer.json +++ b/composer.json @@ -16,10 +16,11 @@ "issues": "https://issues.apache.org/jira/browse/THRIFT" }, "require": { - "php": ">=5.3.3" + "php": "^5.5 || ^7.0" }, "require-dev": { - "phpunit/phpunit": "~4.8.36" + "phpunit/phpunit": "~4.8.36", + "squizlabs/php_codesniffer": "3.*" }, "autoload": { "psr-4": {"Thrift\\": "lib/php/lib/"} diff --git a/lib/php/coding_standards.md b/lib/php/coding_standards.md index fa0390bb5..e217539cd 100644 --- a/lib/php/coding_standards.md +++ b/lib/php/coding_standards.md @@ -1 +1,5 @@ -Please follow [General Coding Standards](/doc/coding_standards.md) +## PHP Coding Standards + +Please follow: + * [Thrift General Coding Standards](/doc/coding_standards.md) + * [PSR-2](http://www.php-fig.org/psr/psr-2/) diff --git a/lib/php/lib/Base/TBase.php b/lib/php/lib/Base/TBase.php index 4195f75df..f2c514a60 100644 --- a/lib/php/lib/Base/TBase.php +++ b/lib/php/lib/Base/TBase.php @@ -33,348 +33,350 @@ use Thrift\Type\TType; */ abstract class TBase { - static $tmethod = array(TType::BOOL => 'Bool', - TType::BYTE => 'Byte', - TType::I16 => 'I16', - TType::I32 => 'I32', - TType::I64 => 'I64', - TType::DOUBLE => 'Double', - TType::STRING => 'String'); + static public $tmethod = array( + TType::BOOL => 'Bool', + TType::BYTE => 'Byte', + TType::I16 => 'I16', + TType::I32 => 'I32', + TType::I64 => 'I64', + TType::DOUBLE => 'Double', + TType::STRING => 'String' + ); - abstract public function read($input); + abstract public function read($input); - abstract public function write($output); + abstract public function write($output); - public function __construct($spec=null, $vals=null) - { - if (is_array($spec) && is_array($vals)) { - foreach ($spec as $fid => $fspec) { - $var = $fspec['var']; - if (isset($vals[$var])) { - $this->$var = $vals[$var]; + public function __construct($spec = null, $vals = null) + { + if (is_array($spec) && is_array($vals)) { + foreach ($spec as $fid => $fspec) { + $var = $fspec['var']; + if (isset($vals[$var])) { + $this->$var = $vals[$var]; + } + } } - } } - } - - public function __wakeup() - { - $this->__construct(get_object_vars($this)); - } - private function _readMap(&$var, $spec, $input) - { - $xfer = 0; - $ktype = $spec['ktype']; - $vtype = $spec['vtype']; - $kread = $vread = null; - if (isset(TBase::$tmethod[$ktype])) { - $kread = 'read'.TBase::$tmethod[$ktype]; - } else { - $kspec = $spec['key']; + public function __wakeup() + { + $this->__construct(get_object_vars($this)); } - if (isset(TBase::$tmethod[$vtype])) { - $vread = 'read'.TBase::$tmethod[$vtype]; - } else { - $vspec = $spec['val']; - } - $var = array(); - $_ktype = $_vtype = $size = 0; - $xfer += $input->readMapBegin($_ktype, $_vtype, $size); - for ($i = 0; $i < $size; ++$i) { - $key = $val = null; - if ($kread !== null) { - $xfer += $input->$kread($key); - } else { - switch ($ktype) { - case TType::STRUCT: - $class = $kspec['class']; - $key = new $class(); - $xfer += $key->read($input); - break; - case TType::MAP: - $xfer += $this->_readMap($key, $kspec, $input); - break; - case TType::LST: - $xfer += $this->_readList($key, $kspec, $input, false); - break; - case TType::SET: - $xfer += $this->_readList($key, $kspec, $input, true); - break; + + private function _readMap(&$var, $spec, $input) + { + $xfer = 0; + $ktype = $spec['ktype']; + $vtype = $spec['vtype']; + $kread = $vread = null; + if (isset(TBase::$tmethod[$ktype])) { + $kread = 'read' . TBase::$tmethod[$ktype]; + } else { + $kspec = $spec['key']; } - } - if ($vread !== null) { - $xfer += $input->$vread($val); - } else { - switch ($vtype) { - case TType::STRUCT: - $class = $vspec['class']; - $val = new $class(); - $xfer += $val->read($input); - break; - case TType::MAP: - $xfer += $this->_readMap($val, $vspec, $input); - break; - case TType::LST: - $xfer += $this->_readList($val, $vspec, $input, false); - break; - case TType::SET: - $xfer += $this->_readList($val, $vspec, $input, true); - break; + if (isset(TBase::$tmethod[$vtype])) { + $vread = 'read' . TBase::$tmethod[$vtype]; + } else { + $vspec = $spec['val']; } - } - $var[$key] = $val; - } - $xfer += $input->readMapEnd(); - - return $xfer; - } - - private function _readList(&$var, $spec, $input, $set=false) - { - $xfer = 0; - $etype = $spec['etype']; - $eread = $vread = null; - if (isset(TBase::$tmethod[$etype])) { - $eread = 'read'.TBase::$tmethod[$etype]; - } else { - $espec = $spec['elem']; - } - $var = array(); - $_etype = $size = 0; - if ($set) { - $xfer += $input->readSetBegin($_etype, $size); - } else { - $xfer += $input->readListBegin($_etype, $size); - } - for ($i = 0; $i < $size; ++$i) { - $elem = null; - if ($eread !== null) { - $xfer += $input->$eread($elem); - } else { - $espec = $spec['elem']; - switch ($etype) { - case TType::STRUCT: - $class = $espec['class']; - $elem = new $class(); - $xfer += $elem->read($input); - break; - case TType::MAP: - $xfer += $this->_readMap($elem, $espec, $input); - break; - case TType::LST: - $xfer += $this->_readList($elem, $espec, $input, false); - break; - case TType::SET: - $xfer += $this->_readList($elem, $espec, $input, true); - break; + $var = array(); + $_ktype = $_vtype = $size = 0; + $xfer += $input->readMapBegin($_ktype, $_vtype, $size); + for ($i = 0; $i < $size; ++$i) { + $key = $val = null; + if ($kread !== null) { + $xfer += $input->$kread($key); + } else { + switch ($ktype) { + case TType::STRUCT: + $class = $kspec['class']; + $key = new $class(); + $xfer += $key->read($input); + break; + case TType::MAP: + $xfer += $this->_readMap($key, $kspec, $input); + break; + case TType::LST: + $xfer += $this->_readList($key, $kspec, $input, false); + break; + case TType::SET: + $xfer += $this->_readList($key, $kspec, $input, true); + break; + } + } + if ($vread !== null) { + $xfer += $input->$vread($val); + } else { + switch ($vtype) { + case TType::STRUCT: + $class = $vspec['class']; + $val = new $class(); + $xfer += $val->read($input); + break; + case TType::MAP: + $xfer += $this->_readMap($val, $vspec, $input); + break; + case TType::LST: + $xfer += $this->_readList($val, $vspec, $input, false); + break; + case TType::SET: + $xfer += $this->_readList($val, $vspec, $input, true); + break; + } + } + $var[$key] = $val; } - } - if ($set) { - $var[$elem] = true; - } else { - $var []= $elem; - } - } - if ($set) { - $xfer += $input->readSetEnd(); - } else { - $xfer += $input->readListEnd(); - } + $xfer += $input->readMapEnd(); - return $xfer; - } + return $xfer; + } - protected function _read($class, $spec, $input) - { - $xfer = 0; - $fname = null; - $ftype = 0; - $fid = 0; - $xfer += $input->readStructBegin($fname); - while (true) { - $xfer += $input->readFieldBegin($fname, $ftype, $fid); - if ($ftype == TType::STOP) { - break; - } - if (isset($spec[$fid])) { - $fspec = $spec[$fid]; - $var = $fspec['var']; - if ($ftype == $fspec['type']) { - $xfer = 0; - if (isset(TBase::$tmethod[$ftype])) { - $func = 'read'.TBase::$tmethod[$ftype]; - $xfer += $input->$func($this->$var); - } else { - switch ($ftype) { - case TType::STRUCT: - $class = $fspec['class']; - $this->$var = new $class(); - $xfer += $this->$var->read($input); - break; - case TType::MAP: - $xfer += $this->_readMap($this->$var, $fspec, $input); - break; - case TType::LST: - $xfer += $this->_readList($this->$var, $fspec, $input, false); - break; - case TType::SET: - $xfer += $this->_readList($this->$var, $fspec, $input, true); - break; + private function _readList(&$var, $spec, $input, $set = false) + { + $xfer = 0; + $etype = $spec['etype']; + $eread = $vread = null; + if (isset(TBase::$tmethod[$etype])) { + $eread = 'read' . TBase::$tmethod[$etype]; + } else { + $espec = $spec['elem']; + } + $var = array(); + $_etype = $size = 0; + if ($set) { + $xfer += $input->readSetBegin($_etype, $size); + } else { + $xfer += $input->readListBegin($_etype, $size); + } + for ($i = 0; $i < $size; ++$i) { + $elem = null; + if ($eread !== null) { + $xfer += $input->$eread($elem); + } else { + $espec = $spec['elem']; + switch ($etype) { + case TType::STRUCT: + $class = $espec['class']; + $elem = new $class(); + $xfer += $elem->read($input); + break; + case TType::MAP: + $xfer += $this->_readMap($elem, $espec, $input); + break; + case TType::LST: + $xfer += $this->_readList($elem, $espec, $input, false); + break; + case TType::SET: + $xfer += $this->_readList($elem, $espec, $input, true); + break; + } } - } + if ($set) { + $var[$elem] = true; + } else { + $var [] = $elem; + } + } + if ($set) { + $xfer += $input->readSetEnd(); } else { - $xfer += $input->skip($ftype); + $xfer += $input->readListEnd(); } - } else { - $xfer += $input->skip($ftype); - } - $xfer += $input->readFieldEnd(); + + return $xfer; } - $xfer += $input->readStructEnd(); - return $xfer; - } + protected function _read($class, $spec, $input) + { + $xfer = 0; + $fname = null; + $ftype = 0; + $fid = 0; + $xfer += $input->readStructBegin($fname); + while (true) { + $xfer += $input->readFieldBegin($fname, $ftype, $fid); + if ($ftype == TType::STOP) { + break; + } + if (isset($spec[$fid])) { + $fspec = $spec[$fid]; + $var = $fspec['var']; + if ($ftype == $fspec['type']) { + $xfer = 0; + if (isset(TBase::$tmethod[$ftype])) { + $func = 'read' . TBase::$tmethod[$ftype]; + $xfer += $input->$func($this->$var); + } else { + switch ($ftype) { + case TType::STRUCT: + $class = $fspec['class']; + $this->$var = new $class(); + $xfer += $this->$var->read($input); + break; + case TType::MAP: + $xfer += $this->_readMap($this->$var, $fspec, $input); + break; + case TType::LST: + $xfer += $this->_readList($this->$var, $fspec, $input, false); + break; + case TType::SET: + $xfer += $this->_readList($this->$var, $fspec, $input, true); + break; + } + } + } else { + $xfer += $input->skip($ftype); + } + } else { + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); - private function _writeMap($var, $spec, $output) - { - $xfer = 0; - $ktype = $spec['ktype']; - $vtype = $spec['vtype']; - $kwrite = $vwrite = null; - if (isset(TBase::$tmethod[$ktype])) { - $kwrite = 'write'.TBase::$tmethod[$ktype]; - } else { - $kspec = $spec['key']; + return $xfer; } - if (isset(TBase::$tmethod[$vtype])) { - $vwrite = 'write'.TBase::$tmethod[$vtype]; - } else { - $vspec = $spec['val']; - } - $xfer += $output->writeMapBegin($ktype, $vtype, count($var)); - foreach ($var as $key => $val) { - if (isset($kwrite)) { - $xfer += $output->$kwrite($key); - } else { - switch ($ktype) { - case TType::STRUCT: - $xfer += $key->write($output); - break; - case TType::MAP: - $xfer += $this->_writeMap($key, $kspec, $output); - break; - case TType::LST: - $xfer += $this->_writeList($key, $kspec, $output, false); - break; - case TType::SET: - $xfer += $this->_writeList($key, $kspec, $output, true); - break; + + private function _writeMap($var, $spec, $output) + { + $xfer = 0; + $ktype = $spec['ktype']; + $vtype = $spec['vtype']; + $kwrite = $vwrite = null; + if (isset(TBase::$tmethod[$ktype])) { + $kwrite = 'write' . TBase::$tmethod[$ktype]; + } else { + $kspec = $spec['key']; } - } - if (isset($vwrite)) { - $xfer += $output->$vwrite($val); - } else { - switch ($vtype) { - case TType::STRUCT: - $xfer += $val->write($output); - break; - case TType::MAP: - $xfer += $this->_writeMap($val, $vspec, $output); - break; - case TType::LST: - $xfer += $this->_writeList($val, $vspec, $output, false); - break; - case TType::SET: - $xfer += $this->_writeList($val, $vspec, $output, true); - break; + if (isset(TBase::$tmethod[$vtype])) { + $vwrite = 'write' . TBase::$tmethod[$vtype]; + } else { + $vspec = $spec['val']; } - } - } - $xfer += $output->writeMapEnd(); - - return $xfer; - } - - private function _writeList($var, $spec, $output, $set=false) - { - $xfer = 0; - $etype = $spec['etype']; - $ewrite = null; - if (isset(TBase::$tmethod[$etype])) { - $ewrite = 'write'.TBase::$tmethod[$etype]; - } else { - $espec = $spec['elem']; - } - if ($set) { - $xfer += $output->writeSetBegin($etype, count($var)); - } else { - $xfer += $output->writeListBegin($etype, count($var)); - } - foreach ($var as $key => $val) { - $elem = $set ? $key : $val; - if (isset($ewrite)) { - $xfer += $output->$ewrite($elem); - } else { - switch ($etype) { - case TType::STRUCT: - $xfer += $elem->write($output); - break; - case TType::MAP: - $xfer += $this->_writeMap($elem, $espec, $output); - break; - case TType::LST: - $xfer += $this->_writeList($elem, $espec, $output, false); - break; - case TType::SET: - $xfer += $this->_writeList($elem, $espec, $output, true); - break; + $xfer += $output->writeMapBegin($ktype, $vtype, count($var)); + foreach ($var as $key => $val) { + if (isset($kwrite)) { + $xfer += $output->$kwrite($key); + } else { + switch ($ktype) { + case TType::STRUCT: + $xfer += $key->write($output); + break; + case TType::MAP: + $xfer += $this->_writeMap($key, $kspec, $output); + break; + case TType::LST: + $xfer += $this->_writeList($key, $kspec, $output, false); + break; + case TType::SET: + $xfer += $this->_writeList($key, $kspec, $output, true); + break; + } + } + if (isset($vwrite)) { + $xfer += $output->$vwrite($val); + } else { + switch ($vtype) { + case TType::STRUCT: + $xfer += $val->write($output); + break; + case TType::MAP: + $xfer += $this->_writeMap($val, $vspec, $output); + break; + case TType::LST: + $xfer += $this->_writeList($val, $vspec, $output, false); + break; + case TType::SET: + $xfer += $this->_writeList($val, $vspec, $output, true); + break; + } + } } - } - } - if ($set) { - $xfer += $output->writeSetEnd(); - } else { - $xfer += $output->writeListEnd(); - } + $xfer += $output->writeMapEnd(); - return $xfer; - } + return $xfer; + } - protected function _write($class, $spec, $output) - { - $xfer = 0; - $xfer += $output->writeStructBegin($class); - foreach ($spec as $fid => $fspec) { - $var = $fspec['var']; - if ($this->$var !== null) { - $ftype = $fspec['type']; - $xfer += $output->writeFieldBegin($var, $ftype, $fid); - if (isset(TBase::$tmethod[$ftype])) { - $func = 'write'.TBase::$tmethod[$ftype]; - $xfer += $output->$func($this->$var); + private function _writeList($var, $spec, $output, $set = false) + { + $xfer = 0; + $etype = $spec['etype']; + $ewrite = null; + if (isset(TBase::$tmethod[$etype])) { + $ewrite = 'write' . TBase::$tmethod[$etype]; + } else { + $espec = $spec['elem']; + } + if ($set) { + $xfer += $output->writeSetBegin($etype, count($var)); + } else { + $xfer += $output->writeListBegin($etype, count($var)); + } + foreach ($var as $key => $val) { + $elem = $set ? $key : $val; + if (isset($ewrite)) { + $xfer += $output->$ewrite($elem); + } else { + switch ($etype) { + case TType::STRUCT: + $xfer += $elem->write($output); + break; + case TType::MAP: + $xfer += $this->_writeMap($elem, $espec, $output); + break; + case TType::LST: + $xfer += $this->_writeList($elem, $espec, $output, false); + break; + case TType::SET: + $xfer += $this->_writeList($elem, $espec, $output, true); + break; + } + } + } + if ($set) { + $xfer += $output->writeSetEnd(); } else { - switch ($ftype) { - case TType::STRUCT: - $xfer += $this->$var->write($output); - break; - case TType::MAP: - $xfer += $this->_writeMap($this->$var, $fspec, $output); - break; - case TType::LST: - $xfer += $this->_writeList($this->$var, $fspec, $output, false); - break; - case TType::SET: - $xfer += $this->_writeList($this->$var, $fspec, $output, true); - break; - } + $xfer += $output->writeListEnd(); } - $xfer += $output->writeFieldEnd(); - } + + return $xfer; } - $xfer += $output->writeFieldStop(); - $xfer += $output->writeStructEnd(); - return $xfer; - } + protected function _write($class, $spec, $output) + { + $xfer = 0; + $xfer += $output->writeStructBegin($class); + foreach ($spec as $fid => $fspec) { + $var = $fspec['var']; + if ($this->$var !== null) { + $ftype = $fspec['type']; + $xfer += $output->writeFieldBegin($var, $ftype, $fid); + if (isset(TBase::$tmethod[$ftype])) { + $func = 'write' . TBase::$tmethod[$ftype]; + $xfer += $output->$func($this->$var); + } else { + switch ($ftype) { + case TType::STRUCT: + $xfer += $this->$var->write($output); + break; + case TType::MAP: + $xfer += $this->_writeMap($this->$var, $fspec, $output); + break; + case TType::LST: + $xfer += $this->_writeList($this->$var, $fspec, $output, false); + break; + case TType::SET: + $xfer += $this->_writeList($this->$var, $fspec, $output, true); + break; + } + } + $xfer += $output->writeFieldEnd(); + } + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + + return $xfer; + } } diff --git a/lib/php/lib/ClassLoader/ThriftClassLoader.php b/lib/php/lib/ClassLoader/ThriftClassLoader.php index 67575ce18..4361bd84e 100644 --- a/lib/php/lib/ClassLoader/ThriftClassLoader.php +++ b/lib/php/lib/ClassLoader/ThriftClassLoader.php @@ -54,7 +54,7 @@ class ThriftClassLoader /** * Set autoloader to use APC cache * @param boolean $apc - * @param string $apc_prefix + * @param string $apc_prefix */ public function __construct($apc = false, $apc_prefix = null) { @@ -65,23 +65,23 @@ class ThriftClassLoader /** * Registers a namespace. * - * @param string $namespace The namespace - * @param array|string $paths The location(s) of the namespace + * @param string $namespace The namespace + * @param array|string $paths The location(s) of the namespace */ public function registerNamespace($namespace, $paths) { - $this->namespaces[$namespace] = (array) $paths; + $this->namespaces[$namespace] = (array)$paths; } /** * Registers a Thrift definition namespace. * - * @param string $namespace The definition namespace - * @param array|string $paths The location(s) of the definition namespace + * @param string $namespace The definition namespace + * @param array|string $paths The location(s) of the definition namespace */ public function registerDefinition($namespace, $paths) { - $this->definitions[$namespace] = (array) $paths; + $this->definitions[$namespace] = (array)$paths; } /** @@ -101,11 +101,9 @@ class ThriftClassLoader */ public function loadClass($class) { - if ( - (true === $this->apc && ($file = $this->findFileInApc($class))) or + if ((true === $this->apc && ($file = $this->findFileInApc($class))) or ($file = $this->findFile($class)) - ) - { + ) { require_once $file; } } @@ -117,8 +115,8 @@ class ThriftClassLoader */ protected function findFileInApc($class) { - if (false === $file = apc_fetch($this->apc_prefix.$class)) { - apc_store($this->apc_prefix.$class, $file = $this->findFile($class)); + if (false === $file = apc_fetch($this->apc_prefix . $class)) { + apc_store($this->apc_prefix . $class, $file = $this->findFile($class)); } return $file; @@ -150,10 +148,10 @@ class ThriftClassLoader foreach ($dirs as $dir) { $className = substr($class, $pos + 1); - $file = $dir.DIRECTORY_SEPARATOR. - str_replace('\\', DIRECTORY_SEPARATOR, $namespace). - DIRECTORY_SEPARATOR. - $className.'.php'; + $file = $dir . DIRECTORY_SEPARATOR . + str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . + DIRECTORY_SEPARATOR . + $className . '.php'; if (file_exists($file)) { return $file; @@ -185,20 +183,18 @@ class ThriftClassLoader * Available in service: Interface, Client, Processor, Rest * And every service methods (_.+) */ - if( - 0 === preg_match('#(.+)(if|client|processor|rest)$#i', $class, $n) and + if (0 === preg_match('#(.+)(if|client|processor|rest)$#i', $class, $n) and 0 === preg_match('#(.+)_[a-z0-9]+_(args|result)$#i', $class, $n) - ) - { + ) { $className = 'Types'; } else { $className = $n[1]; } - $file = $dir.DIRECTORY_SEPARATOR . - str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . - DIRECTORY_SEPARATOR . - $className . '.php'; + $file = $dir . DIRECTORY_SEPARATOR . + str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . + DIRECTORY_SEPARATOR . + $className . '.php'; if (file_exists($file)) { return $file; diff --git a/lib/php/lib/Exception/TApplicationException.php b/lib/php/lib/Exception/TApplicationException.php index b1689fc34..228add5b1 100644 --- a/lib/php/lib/Exception/TApplicationException.php +++ b/lib/php/lib/Exception/TApplicationException.php @@ -26,51 +26,51 @@ use Thrift\Type\TType; class TApplicationException extends TException { - static $_TSPEC = - array(1 => array('var' => 'message', - 'type' => TType::STRING), - 2 => array('var' => 'code', - 'type' => TType::I32)); + static public $_TSPEC = + array(1 => array('var' => 'message', + 'type' => TType::STRING), + 2 => array('var' => 'code', + 'type' => TType::I32)); - const UNKNOWN = 0; - const UNKNOWN_METHOD = 1; - const INVALID_MESSAGE_TYPE = 2; - const WRONG_METHOD_NAME = 3; - const BAD_SEQUENCE_ID = 4; - const MISSING_RESULT = 5; - const INTERNAL_ERROR = 6; - const PROTOCOL_ERROR = 7; - const INVALID_TRANSFORM = 8; - const INVALID_PROTOCOL = 9; - const UNSUPPORTED_CLIENT_TYPE = 10; + const UNKNOWN = 0; + const UNKNOWN_METHOD = 1; + const INVALID_MESSAGE_TYPE = 2; + const WRONG_METHOD_NAME = 3; + const BAD_SEQUENCE_ID = 4; + const MISSING_RESULT = 5; + const INTERNAL_ERROR = 6; + const PROTOCOL_ERROR = 7; + const INVALID_TRANSFORM = 8; + const INVALID_PROTOCOL = 9; + const UNSUPPORTED_CLIENT_TYPE = 10; - public function __construct($message=null, $code=0) - { - parent::__construct($message, $code); - } - - public function read($output) - { - return $this->_read('TApplicationException', self::$_TSPEC, $output); - } - - public function write($output) - { - $xfer = 0; - $xfer += $output->writeStructBegin('TApplicationException'); - if ($message = $this->getMessage()) { - $xfer += $output->writeFieldBegin('message', TType::STRING, 1); - $xfer += $output->writeString($message); - $xfer += $output->writeFieldEnd(); + public function __construct($message = null, $code = 0) + { + parent::__construct($message, $code); } - if ($code = $this->getCode()) { - $xfer += $output->writeFieldBegin('type', TType::I32, 2); - $xfer += $output->writeI32($code); - $xfer += $output->writeFieldEnd(); + + public function read($output) + { + return $this->_read('TApplicationException', self::$_TSPEC, $output); } - $xfer += $output->writeFieldStop(); - $xfer += $output->writeStructEnd(); - return $xfer; - } + public function write($output) + { + $xfer = 0; + $xfer += $output->writeStructBegin('TApplicationException'); + if ($message = $this->getMessage()) { + $xfer += $output->writeFieldBegin('message', TType::STRING, 1); + $xfer += $output->writeString($message); + $xfer += $output->writeFieldEnd(); + } + if ($code = $this->getCode()) { + $xfer += $output->writeFieldBegin('type', TType::I32, 2); + $xfer += $output->writeI32($code); + $xfer += $output->writeFieldEnd(); + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + + return $xfer; + } } diff --git a/lib/php/lib/Exception/TException.php b/lib/php/lib/Exception/TException.php index 5c0684384..e9c7c716d 100644 --- a/lib/php/lib/Exception/TException.php +++ b/lib/php/lib/Exception/TException.php @@ -40,344 +40,345 @@ use Thrift\Base\TBase; */ class TException extends \Exception { - public function __construct($p1=null, $p2=0) - { - if (is_array($p1) && is_array($p2)) { - $spec = $p1; - $vals = $p2; - foreach ($spec as $fid => $fspec) { - $var = $fspec['var']; - if (isset($vals[$var])) { - $this->$var = $vals[$var]; + public function __construct($p1 = null, $p2 = 0) + { + if (is_array($p1) && is_array($p2)) { + $spec = $p1; + $vals = $p2; + foreach ($spec as $fid => $fspec) { + $var = $fspec['var']; + if (isset($vals[$var])) { + $this->$var = $vals[$var]; + } + } + } else { + parent::__construct($p1, $p2); } - } - } else { - parent::__construct($p1, $p2); } - } - static $tmethod = array(TType::BOOL => 'Bool', - TType::BYTE => 'Byte', - TType::I16 => 'I16', - TType::I32 => 'I32', - TType::I64 => 'I64', - TType::DOUBLE => 'Double', - TType::STRING => 'String'); + static public $tmethod = array( + TType::BOOL => 'Bool', + TType::BYTE => 'Byte', + TType::I16 => 'I16', + TType::I32 => 'I32', + TType::I64 => 'I64', + TType::DOUBLE => 'Double', + TType::STRING => 'String' + ); - private function _readMap(&$var, $spec, $input) - { - $xfer = 0; - $ktype = $spec['ktype']; - $vtype = $spec['vtype']; - $kread = $vread = null; - if (isset(TBase::$tmethod[$ktype])) { - $kread = 'read'.TBase::$tmethod[$ktype]; - } else { - $kspec = $spec['key']; - } - if (isset(TBase::$tmethod[$vtype])) { - $vread = 'read'.TBase::$tmethod[$vtype]; - } else { - $vspec = $spec['val']; - } - $var = array(); - $_ktype = $_vtype = $size = 0; - $xfer += $input->readMapBegin($_ktype, $_vtype, $size); - for ($i = 0; $i < $size; ++$i) { - $key = $val = null; - if ($kread !== null) { - $xfer += $input->$kread($key); - } else { - switch ($ktype) { - case TType::STRUCT: - $class = $kspec['class']; - $key = new $class(); - $xfer += $key->read($input); - break; - case TType::MAP: - $xfer += $this->_readMap($key, $kspec, $input); - break; - case TType::LST: - $xfer += $this->_readList($key, $kspec, $input, false); - break; - case TType::SET: - $xfer += $this->_readList($key, $kspec, $input, true); - break; + private function _readMap(&$var, $spec, $input) + { + $xfer = 0; + $ktype = $spec['ktype']; + $vtype = $spec['vtype']; + $kread = $vread = null; + if (isset(TBase::$tmethod[$ktype])) { + $kread = 'read' . TBase::$tmethod[$ktype]; + } else { + $kspec = $spec['key']; } - } - if ($vread !== null) { - $xfer += $input->$vread($val); - } else { - switch ($vtype) { - case TType::STRUCT: - $class = $vspec['class']; - $val = new $class(); - $xfer += $val->read($input); - break; - case TType::MAP: - $xfer += $this->_readMap($val, $vspec, $input); - break; - case TType::LST: - $xfer += $this->_readList($val, $vspec, $input, false); - break; - case TType::SET: - $xfer += $this->_readList($val, $vspec, $input, true); - break; + if (isset(TBase::$tmethod[$vtype])) { + $vread = 'read' . TBase::$tmethod[$vtype]; + } else { + $vspec = $spec['val']; } - } - $var[$key] = $val; - } - $xfer += $input->readMapEnd(); - - return $xfer; - } - - private function _readList(&$var, $spec, $input, $set=false) - { - $xfer = 0; - $etype = $spec['etype']; - $eread = $vread = null; - if (isset(TBase::$tmethod[$etype])) { - $eread = 'read'.TBase::$tmethod[$etype]; - } else { - $espec = $spec['elem']; - } - $var = array(); - $_etype = $size = 0; - if ($set) { - $xfer += $input->readSetBegin($_etype, $size); - } else { - $xfer += $input->readListBegin($_etype, $size); - } - for ($i = 0; $i < $size; ++$i) { - $elem = null; - if ($eread !== null) { - $xfer += $input->$eread($elem); - } else { - $espec = $spec['elem']; - switch ($etype) { - case TType::STRUCT: - $class = $espec['class']; - $elem = new $class(); - $xfer += $elem->read($input); - break; - case TType::MAP: - $xfer += $this->_readMap($elem, $espec, $input); - break; - case TType::LST: - $xfer += $this->_readList($elem, $espec, $input, false); - break; - case TType::SET: - $xfer += $this->_readList($elem, $espec, $input, true); - break; + $var = array(); + $_ktype = $_vtype = $size = 0; + $xfer += $input->readMapBegin($_ktype, $_vtype, $size); + for ($i = 0; $i < $size; ++$i) { + $key = $val = null; + if ($kread !== null) { + $xfer += $input->$kread($key); + } else { + switch ($ktype) { + case TType::STRUCT: + $class = $kspec['class']; + $key = new $class(); + $xfer += $key->read($input); + break; + case TType::MAP: + $xfer += $this->_readMap($key, $kspec, $input); + break; + case TType::LST: + $xfer += $this->_readList($key, $kspec, $input, false); + break; + case TType::SET: + $xfer += $this->_readList($key, $kspec, $input, true); + break; + } + } + if ($vread !== null) { + $xfer += $input->$vread($val); + } else { + switch ($vtype) { + case TType::STRUCT: + $class = $vspec['class']; + $val = new $class(); + $xfer += $val->read($input); + break; + case TType::MAP: + $xfer += $this->_readMap($val, $vspec, $input); + break; + case TType::LST: + $xfer += $this->_readList($val, $vspec, $input, false); + break; + case TType::SET: + $xfer += $this->_readList($val, $vspec, $input, true); + break; + } + } + $var[$key] = $val; } - } - if ($set) { - $var[$elem] = true; - } else { - $var []= $elem; - } - } - if ($set) { - $xfer += $input->readSetEnd(); - } else { - $xfer += $input->readListEnd(); - } + $xfer += $input->readMapEnd(); - return $xfer; - } + return $xfer; + } - protected function _read($class, $spec, $input) - { - $xfer = 0; - $fname = null; - $ftype = 0; - $fid = 0; - $xfer += $input->readStructBegin($fname); - while (true) { - $xfer += $input->readFieldBegin($fname, $ftype, $fid); - if ($ftype == TType::STOP) { - break; - } - if (isset($spec[$fid])) { - $fspec = $spec[$fid]; - $var = $fspec['var']; - if ($ftype == $fspec['type']) { - $xfer = 0; - if (isset(TBase::$tmethod[$ftype])) { - $func = 'read'.TBase::$tmethod[$ftype]; - $xfer += $input->$func($this->$var); - } else { - switch ($ftype) { - case TType::STRUCT: - $class = $fspec['class']; - $this->$var = new $class(); - $xfer += $this->$var->read($input); - break; - case TType::MAP: - $xfer += $this->_readMap($this->$var, $fspec, $input); - break; - case TType::LST: - $xfer += $this->_readList($this->$var, $fspec, $input, false); - break; - case TType::SET: - $xfer += $this->_readList($this->$var, $fspec, $input, true); - break; + private function _readList(&$var, $spec, $input, $set = false) + { + $xfer = 0; + $etype = $spec['etype']; + $eread = $vread = null; + if (isset(TBase::$tmethod[$etype])) { + $eread = 'read' . TBase::$tmethod[$etype]; + } else { + $espec = $spec['elem']; + } + $var = array(); + $_etype = $size = 0; + if ($set) { + $xfer += $input->readSetBegin($_etype, $size); + } else { + $xfer += $input->readListBegin($_etype, $size); + } + for ($i = 0; $i < $size; ++$i) { + $elem = null; + if ($eread !== null) { + $xfer += $input->$eread($elem); + } else { + $espec = $spec['elem']; + switch ($etype) { + case TType::STRUCT: + $class = $espec['class']; + $elem = new $class(); + $xfer += $elem->read($input); + break; + case TType::MAP: + $xfer += $this->_readMap($elem, $espec, $input); + break; + case TType::LST: + $xfer += $this->_readList($elem, $espec, $input, false); + break; + case TType::SET: + $xfer += $this->_readList($elem, $espec, $input, true); + break; + } + } + if ($set) { + $var[$elem] = true; + } else { + $var [] = $elem; } - } + } + if ($set) { + $xfer += $input->readSetEnd(); } else { - $xfer += $input->skip($ftype); + $xfer += $input->readListEnd(); } - } else { - $xfer += $input->skip($ftype); - } - $xfer += $input->readFieldEnd(); + + return $xfer; } - $xfer += $input->readStructEnd(); - return $xfer; - } + protected function _read($class, $spec, $input) + { + $xfer = 0; + $fname = null; + $ftype = 0; + $fid = 0; + $xfer += $input->readStructBegin($fname); + while (true) { + $xfer += $input->readFieldBegin($fname, $ftype, $fid); + if ($ftype == TType::STOP) { + break; + } + if (isset($spec[$fid])) { + $fspec = $spec[$fid]; + $var = $fspec['var']; + if ($ftype == $fspec['type']) { + $xfer = 0; + if (isset(TBase::$tmethod[$ftype])) { + $func = 'read' . TBase::$tmethod[$ftype]; + $xfer += $input->$func($this->$var); + } else { + switch ($ftype) { + case TType::STRUCT: + $class = $fspec['class']; + $this->$var = new $class(); + $xfer += $this->$var->read($input); + break; + case TType::MAP: + $xfer += $this->_readMap($this->$var, $fspec, $input); + break; + case TType::LST: + $xfer += $this->_readList($this->$var, $fspec, $input, false); + break; + case TType::SET: + $xfer += $this->_readList($this->$var, $fspec, $input, true); + break; + } + } + } else { + $xfer += $input->skip($ftype); + } + } else { + $xfer += $input->skip($ftype); + } + $xfer += $input->readFieldEnd(); + } + $xfer += $input->readStructEnd(); - private function _writeMap($var, $spec, $output) - { - $xfer = 0; - $ktype = $spec['ktype']; - $vtype = $spec['vtype']; - $kwrite = $vwrite = null; - if (isset(TBase::$tmethod[$ktype])) { - $kwrite = 'write'.TBase::$tmethod[$ktype]; - } else { - $kspec = $spec['key']; - } - if (isset(TBase::$tmethod[$vtype])) { - $vwrite = 'write'.TBase::$tmethod[$vtype]; - } else { - $vspec = $spec['val']; + return $xfer; } - $xfer += $output->writeMapBegin($ktype, $vtype, count($var)); - foreach ($var as $key => $val) { - if (isset($kwrite)) { - $xfer += $output->$kwrite($key); - } else { - switch ($ktype) { - case TType::STRUCT: - $xfer += $key->write($output); - break; - case TType::MAP: - $xfer += $this->_writeMap($key, $kspec, $output); - break; - case TType::LST: - $xfer += $this->_writeList($key, $kspec, $output, false); - break; - case TType::SET: - $xfer += $this->_writeList($key, $kspec, $output, true); - break; + + private function _writeMap($var, $spec, $output) + { + $xfer = 0; + $ktype = $spec['ktype']; + $vtype = $spec['vtype']; + $kwrite = $vwrite = null; + if (isset(TBase::$tmethod[$ktype])) { + $kwrite = 'write' . TBase::$tmethod[$ktype]; + } else { + $kspec = $spec['key']; } - } - if (isset($vwrite)) { - $xfer += $output->$vwrite($val); - } else { - switch ($vtype) { - case TType::STRUCT: - $xfer += $val->write($output); - break; - case TType::MAP: - $xfer += $this->_writeMap($val, $vspec, $output); - break; - case TType::LST: - $xfer += $this->_writeList($val, $vspec, $output, false); - break; - case TType::SET: - $xfer += $this->_writeList($val, $vspec, $output, true); - break; + if (isset(TBase::$tmethod[$vtype])) { + $vwrite = 'write' . TBase::$tmethod[$vtype]; + } else { + $vspec = $spec['val']; } - } - } - $xfer += $output->writeMapEnd(); - - return $xfer; - } - - private function _writeList($var, $spec, $output, $set=false) - { - $xfer = 0; - $etype = $spec['etype']; - $ewrite = null; - if (isset(TBase::$tmethod[$etype])) { - $ewrite = 'write'.TBase::$tmethod[$etype]; - } else { - $espec = $spec['elem']; - } - if ($set) { - $xfer += $output->writeSetBegin($etype, count($var)); - } else { - $xfer += $output->writeListBegin($etype, count($var)); - } - foreach ($var as $key => $val) { - $elem = $set ? $key : $val; - if (isset($ewrite)) { - $xfer += $output->$ewrite($elem); - } else { - switch ($etype) { - case TType::STRUCT: - $xfer += $elem->write($output); - break; - case TType::MAP: - $xfer += $this->_writeMap($elem, $espec, $output); - break; - case TType::LST: - $xfer += $this->_writeList($elem, $espec, $output, false); - break; - case TType::SET: - $xfer += $this->_writeList($elem, $espec, $output, true); - break; + $xfer += $output->writeMapBegin($ktype, $vtype, count($var)); + foreach ($var as $key => $val) { + if (isset($kwrite)) { + $xfer += $output->$kwrite($key); + } else { + switch ($ktype) { + case TType::STRUCT: + $xfer += $key->write($output); + break; + case TType::MAP: + $xfer += $this->_writeMap($key, $kspec, $output); + break; + case TType::LST: + $xfer += $this->_writeList($key, $kspec, $output, false); + break; + case TType::SET: + $xfer += $this->_writeList($key, $kspec, $output, true); + break; + } + } + if (isset($vwrite)) { + $xfer += $output->$vwrite($val); + } else { + switch ($vtype) { + case TType::STRUCT: + $xfer += $val->write($output); + break; + case TType::MAP: + $xfer += $this->_writeMap($val, $vspec, $output); + break; + case TType::LST: + $xfer += $this->_writeList($val, $vspec, $output, false); + break; + case TType::SET: + $xfer += $this->_writeList($val, $vspec, $output, true); + break; + } + } } - } - } - if ($set) { - $xfer += $output->writeSetEnd(); - } else { - $xfer += $output->writeListEnd(); - } + $xfer += $output->writeMapEnd(); - return $xfer; - } + return $xfer; + } - protected function _write($class, $spec, $output) - { - $xfer = 0; - $xfer += $output->writeStructBegin($class); - foreach ($spec as $fid => $fspec) { - $var = $fspec['var']; - if ($this->$var !== null) { - $ftype = $fspec['type']; - $xfer += $output->writeFieldBegin($var, $ftype, $fid); - if (isset(TBase::$tmethod[$ftype])) { - $func = 'write'.TBase::$tmethod[$ftype]; - $xfer += $output->$func($this->$var); + private function _writeList($var, $spec, $output, $set = false) + { + $xfer = 0; + $etype = $spec['etype']; + $ewrite = null; + if (isset(TBase::$tmethod[$etype])) { + $ewrite = 'write' . TBase::$tmethod[$etype]; + } else { + $espec = $spec['elem']; + } + if ($set) { + $xfer += $output->writeSetBegin($etype, count($var)); + } else { + $xfer += $output->writeListBegin($etype, count($var)); + } + foreach ($var as $key => $val) { + $elem = $set ? $key : $val; + if (isset($ewrite)) { + $xfer += $output->$ewrite($elem); + } else { + switch ($etype) { + case TType::STRUCT: + $xfer += $elem->write($output); + break; + case TType::MAP: + $xfer += $this->_writeMap($elem, $espec, $output); + break; + case TType::LST: + $xfer += $this->_writeList($elem, $espec, $output, false); + break; + case TType::SET: + $xfer += $this->_writeList($elem, $espec, $output, true); + break; + } + } + } + if ($set) { + $xfer += $output->writeSetEnd(); } else { - switch ($ftype) { - case TType::STRUCT: - $xfer += $this->$var->write($output); - break; - case TType::MAP: - $xfer += $this->_writeMap($this->$var, $fspec, $output); - break; - case TType::LST: - $xfer += $this->_writeList($this->$var, $fspec, $output, false); - break; - case TType::SET: - $xfer += $this->_writeList($this->$var, $fspec, $output, true); - break; - } + $xfer += $output->writeListEnd(); } - $xfer += $output->writeFieldEnd(); - } + + return $xfer; } - $xfer += $output->writeFieldStop(); - $xfer += $output->writeStructEnd(); - return $xfer; - } + protected function _write($class, $spec, $output) + { + $xfer = 0; + $xfer += $output->writeStructBegin($class); + foreach ($spec as $fid => $fspec) { + $var = $fspec['var']; + if ($this->$var !== null) { + $ftype = $fspec['type']; + $xfer += $output->writeFieldBegin($var, $ftype, $fid); + if (isset(TBase::$tmethod[$ftype])) { + $func = 'write' . TBase::$tmethod[$ftype]; + $xfer += $output->$func($this->$var); + } else { + switch ($ftype) { + case TType::STRUCT: + $xfer += $this->$var->write($output); + break; + case TType::MAP: + $xfer += $this->_writeMap($this->$var, $fspec, $output); + break; + case TType::LST: + $xfer += $this->_writeList($this->$var, $fspec, $output, false); + break; + case TType::SET: + $xfer += $this->_writeList($this->$var, $fspec, $output, true); + break; + } + } + $xfer += $output->writeFieldEnd(); + } + } + $xfer += $output->writeFieldStop(); + $xfer += $output->writeStructEnd(); + return $xfer; + } } diff --git a/lib/php/lib/Exception/TProtocolException.php b/lib/php/lib/Exception/TProtocolException.php index ba7135c29..3a55d45ff 100644 --- a/lib/php/lib/Exception/TProtocolException.php +++ b/lib/php/lib/Exception/TProtocolException.php @@ -35,16 +35,16 @@ namespace Thrift\Exception; */ class TProtocolException extends TException { - const UNKNOWN = 0; - const INVALID_DATA = 1; - const NEGATIVE_SIZE = 2; - const SIZE_LIMIT = 3; - const BAD_VERSION = 4; - const NOT_IMPLEMENTED = 5; - const DEPTH_LIMIT = 6; + const UNKNOWN = 0; + const INVALID_DATA = 1; + const NEGATIVE_SIZE = 2; + const SIZE_LIMIT = 3; + const BAD_VERSION = 4; + const NOT_IMPLEMENTED = 5; + const DEPTH_LIMIT = 6; - public function __construct($message=null, $code=0) - { - parent::__construct($message, $code); - } + public function __construct($message = null, $code = 0) + { + parent::__construct($message, $code); + } } diff --git a/lib/php/lib/Exception/TTransportException.php b/lib/php/lib/Exception/TTransportException.php index 0074467d6..7d8d56743 100644 --- a/lib/php/lib/Exception/TTransportException.php +++ b/lib/php/lib/Exception/TTransportException.php @@ -27,14 +27,14 @@ namespace Thrift\Exception; */ class TTransportException extends TException { - const UNKNOWN = 0; - const NOT_OPEN = 1; - const ALREADY_OPEN = 2; - const TIMED_OUT = 3; - const END_OF_FILE = 4; + const UNKNOWN = 0; + const NOT_OPEN = 1; + const ALREADY_OPEN = 2; + const TIMED_OUT = 3; + const END_OF_FILE = 4; - public function __construct($message=null, $code=0) - { - parent::__construct($message, $code); - } + public function __construct($message = null, $code = 0) + { + parent::__construct($message, $code); + } } diff --git a/lib/php/lib/Factory/TBinaryProtocolFactory.php b/lib/php/lib/Factory/TBinaryProtocolFactory.php index 0c1c4a726..2519183df 100644 --- a/lib/php/lib/Factory/TBinaryProtocolFactory.php +++ b/lib/php/lib/Factory/TBinaryProtocolFactory.php @@ -29,17 +29,17 @@ use Thrift\Protocol\TBinaryProtocol; */ class TBinaryProtocolFactory implements TProtocolFactory { - private $strictRead_ = false; - private $strictWrite_ = false; + private $strictRead_ = false; + private $strictWrite_ = false; - public function __construct($strictRead=false, $strictWrite=false) - { - $this->strictRead_ = $strictRead; - $this->strictWrite_ = $strictWrite; - } + public function __construct($strictRead = false, $strictWrite = false) + { + $this->strictRead_ = $strictRead; + $this->strictWrite_ = $strictWrite; + } - public function getProtocol($trans) - { - return new TBinaryProtocol($trans, $this->strictRead_, $this->strictWrite_); - } + public function getProtocol($trans) + { + return new TBinaryProtocol($trans, $this->strictRead_, $this->strictWrite_); + } } diff --git a/lib/php/lib/Factory/TCompactProtocolFactory.php b/lib/php/lib/Factory/TCompactProtocolFactory.php index f4b4fe3eb..11fb8ff33 100644 --- a/lib/php/lib/Factory/TCompactProtocolFactory.php +++ b/lib/php/lib/Factory/TCompactProtocolFactory.php @@ -29,12 +29,12 @@ use Thrift\Protocol\TCompactProtocol; */ class TCompactProtocolFactory implements TProtocolFactory { - public function __construct() - { - } + public function __construct() + { + } - public function getProtocol($trans) - { - return new TCompactProtocol($trans); - } + public function getProtocol($trans) + { + return new TCompactProtocol($trans); + } } diff --git a/lib/php/lib/Factory/TProtocolFactory.php b/lib/php/lib/Factory/TProtocolFactory.php index 4c9562ddb..d3066c8ec 100644 --- a/lib/php/lib/Factory/TProtocolFactory.php +++ b/lib/php/lib/Factory/TProtocolFactory.php @@ -27,10 +27,10 @@ namespace Thrift\Factory; */ interface TProtocolFactory { - /** - * Build a protocol from the base transport - * - * @return Thrift\Protocol\TProtocol protocol - */ - public function getProtocol($trans); + /** + * Build a protocol from the base transport + * + * @return Thrift\Protocol\TProtocol protocol + */ + public function getProtocol($trans); } diff --git a/lib/php/lib/Factory/TStringFuncFactory.php b/lib/php/lib/Factory/TStringFuncFactory.php index 6ad6839c8..7739d169a 100644 --- a/lib/php/lib/Factory/TStringFuncFactory.php +++ b/lib/php/lib/Factory/TStringFuncFactory.php @@ -53,13 +53,12 @@ class TStringFuncFactory */ if (ini_get('mbstring.func_overload') & 2) { self::$_instance = new Mbstring(); - } - /** - * mbstring is not installed or does not have function overloading - * of the str* functions enabled so use PHP core str* functions for - * byte counting. - */ - else { + } else { + /** + * mbstring is not installed or does not have function overloading + * of the str* functions enabled so use PHP core str* functions for + * byte counting. + */ self::$_instance = new Core(); } } diff --git a/lib/php/lib/Factory/TTransportFactory.php b/lib/php/lib/Factory/TTransportFactory.php index b32b5f414..43f2eecde 100644 --- a/lib/php/lib/Factory/TTransportFactory.php +++ b/lib/php/lib/Factory/TTransportFactory.php @@ -6,13 +6,13 @@ use Thrift\Transport\TTransport; class TTransportFactory { - /** - * @static - * @param TTransport $transport - * @return TTransport - */ - public static function getTransport(TTransport $transport) - { - return $transport; - } + /** + * @static + * @param TTransport $transport + * @return TTransport + */ + public static function getTransport(TTransport $transport) + { + return $transport; + } } diff --git a/lib/php/lib/Protocol/SimpleJSON/Context.php b/lib/php/lib/Protocol/SimpleJSON/Context.php index dcffbcbe9..dbd16faa2 100644 --- a/lib/php/lib/Protocol/SimpleJSON/Context.php +++ b/lib/php/lib/Protocol/SimpleJSON/Context.php @@ -33,4 +33,3 @@ class Context return false; } } - diff --git a/lib/php/lib/Protocol/SimpleJSON/MapContext.php b/lib/php/lib/Protocol/SimpleJSON/MapContext.php index bb9a04d21..61c060d09 100644 --- a/lib/php/lib/Protocol/SimpleJSON/MapContext.php +++ b/lib/php/lib/Protocol/SimpleJSON/MapContext.php @@ -22,8 +22,6 @@ namespace Thrift\Protocol\SimpleJSON; -use Thrift\Protocol\TSimpleJSONProtocol; - class MapContext extends StructContext { protected $isKey = true; @@ -47,5 +45,3 @@ class MapContext extends StructContext return $this->isKey; } } - - diff --git a/lib/php/lib/Protocol/SimpleJSON/StructContext.php b/lib/php/lib/Protocol/SimpleJSON/StructContext.php index 8162f2bc2..38a62d1a2 100644 --- a/lib/php/lib/Protocol/SimpleJSON/StructContext.php +++ b/lib/php/lib/Protocol/SimpleJSON/StructContext.php @@ -43,11 +43,10 @@ class StructContext extends Context } else { $this->p_->getTransport()->write( $this->colon_ ? - TSimpleJSONProtocol::COLON : - TSimpleJSONProtocol::COMMA + TSimpleJSONProtocol::COLON : + TSimpleJSONProtocol::COMMA ); $this->colon_ = !$this->colon_; } } } - diff --git a/lib/php/lib/Protocol/TBinaryProtocol.php b/lib/php/lib/Protocol/TBinaryProtocol.php index fe6a10343..cda5c0d4c 100644 --- a/lib/php/lib/Protocol/TBinaryProtocol.php +++ b/lib/php/lib/Protocol/TBinaryProtocol.php @@ -32,422 +32,422 @@ use Thrift\Factory\TStringFuncFactory; */ class TBinaryProtocol extends TProtocol { - const VERSION_MASK = 0xffff0000; - const VERSION_1 = 0x80010000; - - protected $strictRead_ = false; - protected $strictWrite_ = true; - - public function __construct($trans, $strictRead=false, $strictWrite=true) - { - parent::__construct($trans); - $this->strictRead_ = $strictRead; - $this->strictWrite_ = $strictWrite; - } - - public function writeMessageBegin($name, $type, $seqid) - { - if ($this->strictWrite_) { - $version = self::VERSION_1 | $type; - - return - $this->writeI32($version) + - $this->writeString($name) + - $this->writeI32($seqid); - } else { - return - $this->writeString($name) + - $this->writeByte($type) + - $this->writeI32($seqid); - } - } - - public function writeMessageEnd() - { - return 0; - } - - public function writeStructBegin($name) - { - return 0; - } - - public function writeStructEnd() - { - return 0; - } - - public function writeFieldBegin($fieldName, $fieldType, $fieldId) - { - return - $this->writeByte($fieldType) + - $this->writeI16($fieldId); - } - - public function writeFieldEnd() - { - return 0; - } - - public function writeFieldStop() - { - return - $this->writeByte(TType::STOP); - } - - public function writeMapBegin($keyType, $valType, $size) - { - return - $this->writeByte($keyType) + - $this->writeByte($valType) + - $this->writeI32($size); - } - - public function writeMapEnd() - { - return 0; - } - - public function writeListBegin($elemType, $size) - { - return - $this->writeByte($elemType) + - $this->writeI32($size); - } - - public function writeListEnd() - { - return 0; - } - - public function writeSetBegin($elemType, $size) - { - return - $this->writeByte($elemType) + - $this->writeI32($size); - } - - public function writeSetEnd() - { - return 0; - } - - public function writeBool($value) - { - $data = pack('c', $value ? 1 : 0); - $this->trans_->write($data, 1); - - return 1; - } - - public function writeByte($value) - { - $data = pack('c', $value); - $this->trans_->write($data, 1); - - return 1; - } - - public function writeI16($value) - { - $data = pack('n', $value); - $this->trans_->write($data, 2); - - return 2; - } - - public function writeI32($value) - { - $data = pack('N', $value); - $this->trans_->write($data, 4); - - return 4; - } - - public function writeI64($value) - { - // If we are on a 32bit architecture we have to explicitly deal with - // 64-bit twos-complement arithmetic since PHP wants to treat all ints - // as signed and any int over 2^31 - 1 as a float - if (PHP_INT_SIZE == 4) { - $neg = $value < 0; - - if ($neg) { - $value *= -1; - } - - $hi = (int) ($value / 4294967296); - $lo = (int) $value; - - if ($neg) { - $hi = ~$hi; - $lo = ~$lo; - if (($lo & (int) 0xffffffff) == (int) 0xffffffff) { - $lo = 0; - $hi++; + const VERSION_MASK = 0xffff0000; + const VERSION_1 = 0x80010000; + + protected $strictRead_ = false; + protected $strictWrite_ = true; + + public function __construct($trans, $strictRead = false, $strictWrite = true) + { + parent::__construct($trans); + $this->strictRead_ = $strictRead; + $this->strictWrite_ = $strictWrite; + } + + public function writeMessageBegin($name, $type, $seqid) + { + if ($this->strictWrite_) { + $version = self::VERSION_1 | $type; + + return + $this->writeI32($version) + + $this->writeString($name) + + $this->writeI32($seqid); + } else { + return + $this->writeString($name) + + $this->writeByte($type) + + $this->writeI32($seqid); + } + } + + public function writeMessageEnd() + { + return 0; + } + + public function writeStructBegin($name) + { + return 0; + } + + public function writeStructEnd() + { + return 0; + } + + public function writeFieldBegin($fieldName, $fieldType, $fieldId) + { + return + $this->writeByte($fieldType) + + $this->writeI16($fieldId); + } + + public function writeFieldEnd() + { + return 0; + } + + public function writeFieldStop() + { + return + $this->writeByte(TType::STOP); + } + + public function writeMapBegin($keyType, $valType, $size) + { + return + $this->writeByte($keyType) + + $this->writeByte($valType) + + $this->writeI32($size); + } + + public function writeMapEnd() + { + return 0; + } + + public function writeListBegin($elemType, $size) + { + return + $this->writeByte($elemType) + + $this->writeI32($size); + } + + public function writeListEnd() + { + return 0; + } + + public function writeSetBegin($elemType, $size) + { + return + $this->writeByte($elemType) + + $this->writeI32($size); + } + + public function writeSetEnd() + { + return 0; + } + + public function writeBool($value) + { + $data = pack('c', $value ? 1 : 0); + $this->trans_->write($data, 1); + + return 1; + } + + public function writeByte($value) + { + $data = pack('c', $value); + $this->trans_->write($data, 1); + + return 1; + } + + public function writeI16($value) + { + $data = pack('n', $value); + $this->trans_->write($data, 2); + + return 2; + } + + public function writeI32($value) + { + $data = pack('N', $value); + $this->trans_->write($data, 4); + + return 4; + } + + public function writeI64($value) + { + // If we are on a 32bit architecture we have to explicitly deal with + // 64-bit twos-complement arithmetic since PHP wants to treat all ints + // as signed and any int over 2^31 - 1 as a float + if (PHP_INT_SIZE == 4) { + $neg = $value < 0; + + if ($neg) { + $value *= -1; + } + + $hi = (int)($value / 4294967296); + $lo = (int)$value; + + if ($neg) { + $hi = ~$hi; + $lo = ~$lo; + if (($lo & (int)0xffffffff) == (int)0xffffffff) { + $lo = 0; + $hi++; + } else { + $lo++; + } + } + $data = pack('N2', $hi, $lo); } else { - $lo++; + $hi = $value >> 32; + $lo = $value & 0xFFFFFFFF; + $data = pack('N2', $hi, $lo); + } + + $this->trans_->write($data, 8); + + return 8; + } + + public function writeDouble($value) + { + $data = pack('d', $value); + $this->trans_->write(strrev($data), 8); + + return 8; + } + + public function writeString($value) + { + $len = TStringFuncFactory::create()->strlen($value); + $result = $this->writeI32($len); + if ($len) { + $this->trans_->write($value, $len); } - } - $data = pack('N2', $hi, $lo); - - } else { - $hi = $value >> 32; - $lo = $value & 0xFFFFFFFF; - $data = pack('N2', $hi, $lo); - } - - $this->trans_->write($data, 8); - - return 8; - } - - public function writeDouble($value) - { - $data = pack('d', $value); - $this->trans_->write(strrev($data), 8); - - return 8; - } - - public function writeString($value) - { - $len = TStringFuncFactory::create()->strlen($value); - $result = $this->writeI32($len); - if ($len) { - $this->trans_->write($value, $len); - } - - return $result + $len; - } - - public function readMessageBegin(&$name, &$type, &$seqid) - { - $result = $this->readI32($sz); - if ($sz < 0) { - $version = (int) ($sz & self::VERSION_MASK); - if ($version != (int) self::VERSION_1) { - throw new TProtocolException('Bad version identifier: '.$sz, TProtocolException::BAD_VERSION); - } - $type = $sz & 0x000000ff; - $result += - $this->readString($name) + - $this->readI32($seqid); - } else { - if ($this->strictRead_) { - throw new TProtocolException('No version identifier, old protocol client?', TProtocolException::BAD_VERSION); - } else { - // Handle pre-versioned input - $name = $this->trans_->readAll($sz); - $result += - $sz + - $this->readByte($type) + - $this->readI32($seqid); - } - } - - return $result; - } - - public function readMessageEnd() - { - return 0; - } - - public function readStructBegin(&$name) - { - $name = ''; - - return 0; - } - - public function readStructEnd() - { - return 0; - } - - public function readFieldBegin(&$name, &$fieldType, &$fieldId) - { - $result = $this->readByte($fieldType); - if ($fieldType == TType::STOP) { - $fieldId = 0; - - return $result; - } - $result += $this->readI16($fieldId); - - return $result; - } - - public function readFieldEnd() - { - return 0; - } - - public function readMapBegin(&$keyType, &$valType, &$size) - { - return - $this->readByte($keyType) + - $this->readByte($valType) + - $this->readI32($size); - } - - public function readMapEnd() - { - return 0; - } - - public function readListBegin(&$elemType, &$size) - { - return - $this->readByte($elemType) + - $this->readI32($size); - } - - public function readListEnd() - { - return 0; - } - - public function readSetBegin(&$elemType, &$size) - { - return - $this->readByte($elemType) + - $this->readI32($size); - } - - public function readSetEnd() - { - return 0; - } - - public function readBool(&$value) - { - $data = $this->trans_->readAll(1); - $arr = unpack('c', $data); - $value = $arr[1] == 1; - - return 1; - } - - public function readByte(&$value) - { - $data = $this->trans_->readAll(1); - $arr = unpack('c', $data); - $value = $arr[1]; - - return 1; - } - - public function readI16(&$value) - { - $data = $this->trans_->readAll(2); - $arr = unpack('n', $data); - $value = $arr[1]; - if ($value > 0x7fff) { - $value = 0 - (($value - 1) ^ 0xffff); - } - - return 2; - } - - public function readI32(&$value) - { - $data = $this->trans_->readAll(4); - $arr = unpack('N', $data); - $value = $arr[1]; - if ($value > 0x7fffffff) { - $value = 0 - (($value - 1) ^ 0xffffffff); - } - - return 4; - } - - public function readI64(&$value) - { - $data = $this->trans_->readAll(8); - - $arr = unpack('N2', $data); - - // If we are on a 32bit architecture we have to explicitly deal with - // 64-bit twos-complement arithmetic since PHP wants to treat all ints - // as signed and any int over 2^31 - 1 as a float - if (PHP_INT_SIZE == 4) { - - $hi = $arr[1]; - $lo = $arr[2]; - $isNeg = $hi < 0; - - // Check for a negative - if ($isNeg) { - $hi = ~$hi & (int) 0xffffffff; - $lo = ~$lo & (int) 0xffffffff; - - if ($lo == (int) 0xffffffff) { - $hi++; - $lo = 0; + + return $result + $len; + } + + public function readMessageBegin(&$name, &$type, &$seqid) + { + $result = $this->readI32($sz); + if ($sz < 0) { + $version = (int)($sz & self::VERSION_MASK); + if ($version != (int)self::VERSION_1) { + throw new TProtocolException('Bad version identifier: ' . $sz, TProtocolException::BAD_VERSION); + } + $type = $sz & 0x000000ff; + $result += + $this->readString($name) + + $this->readI32($seqid); } else { - $lo++; + if ($this->strictRead_) { + throw new TProtocolException( + 'No version identifier, old protocol client?', + TProtocolException::BAD_VERSION + ); + } else { + // Handle pre-versioned input + $name = $this->trans_->readAll($sz); + $result += + $sz + + $this->readByte($type) + + $this->readI32($seqid); + } } - } - - // Force 32bit words in excess of 2G to pe positive - we deal wigh sign - // explicitly below - - if ($hi & (int) 0x80000000) { - $hi &= (int) 0x7fffffff; - $hi += 0x80000000; - } - - if ($lo & (int) 0x80000000) { - $lo &= (int) 0x7fffffff; - $lo += 0x80000000; - } - - $value = $hi * 4294967296 + $lo; - - if ($isNeg) { - $value = 0 - $value; - } - } else { - - // Upcast negatives in LSB bit - if ($arr[2] & 0x80000000) { - $arr[2] = $arr[2] & 0xffffffff; - } - - // Check for a negative - if ($arr[1] & 0x80000000) { - $arr[1] = $arr[1] & 0xffffffff; - $arr[1] = $arr[1] ^ 0xffffffff; - $arr[2] = $arr[2] ^ 0xffffffff; - $value = 0 - $arr[1]*4294967296 - $arr[2] - 1; - } else { - $value = $arr[1]*4294967296 + $arr[2]; - } - } - - return 8; - } - - public function readDouble(&$value) - { - $data = strrev($this->trans_->readAll(8)); - $arr = unpack('d', $data); - $value = $arr[1]; - - return 8; - } - - public function readString(&$value) - { - $result = $this->readI32($len); - if ($len) { - $value = $this->trans_->readAll($len); - } else { - $value = ''; - } - - return $result + $len; - } + + return $result; + } + + public function readMessageEnd() + { + return 0; + } + + public function readStructBegin(&$name) + { + $name = ''; + + return 0; + } + + public function readStructEnd() + { + return 0; + } + + public function readFieldBegin(&$name, &$fieldType, &$fieldId) + { + $result = $this->readByte($fieldType); + if ($fieldType == TType::STOP) { + $fieldId = 0; + + return $result; + } + $result += $this->readI16($fieldId); + + return $result; + } + + public function readFieldEnd() + { + return 0; + } + + public function readMapBegin(&$keyType, &$valType, &$size) + { + return + $this->readByte($keyType) + + $this->readByte($valType) + + $this->readI32($size); + } + + public function readMapEnd() + { + return 0; + } + + public function readListBegin(&$elemType, &$size) + { + return + $this->readByte($elemType) + + $this->readI32($size); + } + + public function readListEnd() + { + return 0; + } + + public function readSetBegin(&$elemType, &$size) + { + return + $this->readByte($elemType) + + $this->readI32($size); + } + + public function readSetEnd() + { + return 0; + } + + public function readBool(&$value) + { + $data = $this->trans_->readAll(1); + $arr = unpack('c', $data); + $value = $arr[1] == 1; + + return 1; + } + + public function readByte(&$value) + { + $data = $this->trans_->readAll(1); + $arr = unpack('c', $data); + $value = $arr[1]; + + return 1; + } + + public function readI16(&$value) + { + $data = $this->trans_->readAll(2); + $arr = unpack('n', $data); + $value = $arr[1]; + if ($value > 0x7fff) { + $value = 0 - (($value - 1) ^ 0xffff); + } + + return 2; + } + + public function readI32(&$value) + { + $data = $this->trans_->readAll(4); + $arr = unpack('N', $data); + $value = $arr[1]; + if ($value > 0x7fffffff) { + $value = 0 - (($value - 1) ^ 0xffffffff); + } + + return 4; + } + + public function readI64(&$value) + { + $data = $this->trans_->readAll(8); + + $arr = unpack('N2', $data); + + // If we are on a 32bit architecture we have to explicitly deal with + // 64-bit twos-complement arithmetic since PHP wants to treat all ints + // as signed and any int over 2^31 - 1 as a float + if (PHP_INT_SIZE == 4) { + $hi = $arr[1]; + $lo = $arr[2]; + $isNeg = $hi < 0; + + // Check for a negative + if ($isNeg) { + $hi = ~$hi & (int)0xffffffff; + $lo = ~$lo & (int)0xffffffff; + + if ($lo == (int)0xffffffff) { + $hi++; + $lo = 0; + } else { + $lo++; + } + } + + // Force 32bit words in excess of 2G to pe positive - we deal wigh sign + // explicitly below + + if ($hi & (int)0x80000000) { + $hi &= (int)0x7fffffff; + $hi += 0x80000000; + } + + if ($lo & (int)0x80000000) { + $lo &= (int)0x7fffffff; + $lo += 0x80000000; + } + + $value = $hi * 4294967296 + $lo; + + if ($isNeg) { + $value = 0 - $value; + } + } else { + // Upcast negatives in LSB bit + if ($arr[2] & 0x80000000) { + $arr[2] = $arr[2] & 0xffffffff; + } + + // Check for a negative + if ($arr[1] & 0x80000000) { + $arr[1] = $arr[1] & 0xffffffff; + $arr[1] = $arr[1] ^ 0xffffffff; + $arr[2] = $arr[2] ^ 0xffffffff; + $value = 0 - $arr[1] * 4294967296 - $arr[2] - 1; + } else { + $value = $arr[1] * 4294967296 + $arr[2]; + } + } + + return 8; + } + + public function readDouble(&$value) + { + $data = strrev($this->trans_->readAll(8)); + $arr = unpack('d', $data); + $value = $arr[1]; + + return 8; + } + + public function readString(&$value) + { + $result = $this->readI32($len); + if ($len) { + $value = $this->trans_->readAll($len); + } else { + $value = ''; + } + + return $result + $len; + } } diff --git a/lib/php/lib/Protocol/TBinaryProtocolAccelerated.php b/lib/php/lib/Protocol/TBinaryProtocolAccelerated.php index f0e0bb99f..ff799a6ab 100644 --- a/lib/php/lib/Protocol/TBinaryProtocolAccelerated.php +++ b/lib/php/lib/Protocol/TBinaryProtocolAccelerated.php @@ -30,36 +30,38 @@ use Thrift\Transport\TBufferedTransport; */ class TBinaryProtocolAccelerated extends TBinaryProtocol { - public function __construct($trans, $strictRead=false, $strictWrite=true) - { - // If the transport doesn't implement putBack, wrap it in a - // TBufferedTransport (which does) + public function __construct($trans, $strictRead = false, $strictWrite = true) + { + // If the transport doesn't implement putBack, wrap it in a + // TBufferedTransport (which does) - // NOTE (t.heintz): This is very evil to do, because the TBufferedTransport may swallow bytes, which - // are then never written to the underlying transport. This happens precisely when a number of bytes - // less than the max buffer size (512 by default) is written to the transport and then flush() is NOT - // called. In that case the data stays in the writeBuffer of the transport, from where it can never be - // accessed again (for example through read()). - // - // Since the caller of this method does not know about the wrapping transport, this creates bugs which - // are very difficult to find. Hence the wrapping of a transport in a buffer should be left to the - // calling code. An interface could used to mandate the presence of the putBack() method in the transport. - // - // I am leaving this code in nonetheless, because there may be applications depending on this behavior. - // - // @see THRIFT-1579 + // NOTE (t.heintz): This is very evil to do, because the TBufferedTransport may swallow bytes, which + // are then never written to the underlying transport. This happens precisely when a number of bytes + // less than the max buffer size (512 by default) is written to the transport and then flush() is NOT + // called. In that case the data stays in the writeBuffer of the transport, from where it can never be + // accessed again (for example through read()). + // + // Since the caller of this method does not know about the wrapping transport, this creates bugs which + // are very difficult to find. Hence the wrapping of a transport in a buffer should be left to the + // calling code. An interface could used to mandate the presence of the putBack() method in the transport. + // + // I am leaving this code in nonetheless, because there may be applications depending on this behavior. + // + // @see THRIFT-1579 - if (!method_exists($trans, 'putBack')) { - $trans = new TBufferedTransport($trans); + if (!method_exists($trans, 'putBack')) { + $trans = new TBufferedTransport($trans); + } + parent::__construct($trans, $strictRead, $strictWrite); + } + + public function isStrictRead() + { + return $this->strictRead_; + } + + public function isStrictWrite() + { + return $this->strictWrite_; } - parent::__construct($trans, $strictRead, $strictWrite); - } - public function isStrictRead() - { - return $this->strictRead_; - } - public function isStrictWrite() - { - return $this->strictWrite_; - } } diff --git a/lib/php/lib/Protocol/TCompactProtocol.php b/lib/php/lib/Protocol/TCompactProtocol.php index c25b0501b..1af2a274a 100644 --- a/lib/php/lib/Protocol/TCompactProtocol.php +++ b/lib/php/lib/Protocol/TCompactProtocol.php @@ -32,708 +32,708 @@ use Thrift\Factory\TStringFuncFactory; */ class TCompactProtocol extends TProtocol { - const COMPACT_STOP = 0x00; - const COMPACT_TRUE = 0x01; - const COMPACT_FALSE = 0x02; - const COMPACT_BYTE = 0x03; - const COMPACT_I16 = 0x04; - const COMPACT_I32 = 0x05; - const COMPACT_I64 = 0x06; - const COMPACT_DOUBLE = 0x07; - const COMPACT_BINARY = 0x08; - const COMPACT_LIST = 0x09; - const COMPACT_SET = 0x0A; - const COMPACT_MAP = 0x0B; - const COMPACT_STRUCT = 0x0C; - - const STATE_CLEAR = 0; - const STATE_FIELD_WRITE = 1; - const STATE_VALUE_WRITE = 2; - const STATE_CONTAINER_WRITE = 3; - const STATE_BOOL_WRITE = 4; - const STATE_FIELD_READ = 5; - const STATE_CONTAINER_READ = 6; - const STATE_VALUE_READ = 7; - const STATE_BOOL_READ = 8; - - const VERSION_MASK = 0x1f; - const VERSION = 1; - const PROTOCOL_ID = 0x82; - const TYPE_MASK = 0xe0; - const TYPE_BITS = 0x07; - const TYPE_SHIFT_AMOUNT = 5; - - protected static $ctypes = array( - TType::STOP => TCompactProtocol::COMPACT_STOP, - TType::BOOL => TCompactProtocol::COMPACT_TRUE, // used for collection - TType::BYTE => TCompactProtocol::COMPACT_BYTE, - TType::I16 => TCompactProtocol::COMPACT_I16, - TType::I32 => TCompactProtocol::COMPACT_I32, - TType::I64 => TCompactProtocol::COMPACT_I64, - TType::DOUBLE => TCompactProtocol::COMPACT_DOUBLE, - TType::STRING => TCompactProtocol::COMPACT_BINARY, - TType::STRUCT => TCompactProtocol::COMPACT_STRUCT, - TType::LST => TCompactProtocol::COMPACT_LIST, - TType::SET => TCompactProtocol::COMPACT_SET, - TType::MAP => TCompactProtocol::COMPACT_MAP, - ); - - protected static $ttypes = array( - TCompactProtocol::COMPACT_STOP => TType::STOP , - TCompactProtocol::COMPACT_TRUE => TType::BOOL, // used for collection - TCompactProtocol::COMPACT_FALSE => TType::BOOL, - TCompactProtocol::COMPACT_BYTE => TType::BYTE, - TCompactProtocol::COMPACT_I16 => TType::I16, - TCompactProtocol::COMPACT_I32 => TType::I32, - TCompactProtocol::COMPACT_I64 => TType::I64, - TCompactProtocol::COMPACT_DOUBLE => TType::DOUBLE, - TCompactProtocol::COMPACT_BINARY => TType::STRING, - TCompactProtocol::COMPACT_STRUCT => TType::STRUCT, - TCompactProtocol::COMPACT_LIST => TType::LST, - TCompactProtocol::COMPACT_SET => TType::SET, - TCompactProtocol::COMPACT_MAP => TType::MAP, - ); - - protected $state = TCompactProtocol::STATE_CLEAR; - protected $lastFid = 0; - protected $boolFid = null; - protected $boolValue = null; - protected $structs = array(); - protected $containers = array(); - - // Some varint / zigzag helper methods - public function toZigZag($n, $bits) - { - return ($n << 1) ^ ($n >> ($bits - 1)); - } - - public function fromZigZag($n) - { - return ($n >> 1) ^ -($n & 1); - } - - public function getVarint($data) - { - $out = ""; - while (true) { - if (($data & ~0x7f) === 0) { - $out .= chr($data); - break; - } else { - $out .= chr(($data & 0xff) | 0x80); - $data = $data >> 7; - } - } - - return $out; - } - - public function writeVarint($data) - { - $out = $this->getVarint($data); - $result = TStringFuncFactory::create()->strlen($out); - $this->trans_->write($out, $result); - - return $result; - } - - public function readVarint(&$result) - { - $idx = 0; - $shift = 0; - $result = 0; - while (true) { - $x = $this->trans_->readAll(1); - $arr = unpack('C', $x); - $byte = $arr[1]; - $idx += 1; - $result |= ($byte & 0x7f) << $shift; - if (($byte >> 7) === 0) { + const COMPACT_STOP = 0x00; + const COMPACT_TRUE = 0x01; + const COMPACT_FALSE = 0x02; + const COMPACT_BYTE = 0x03; + const COMPACT_I16 = 0x04; + const COMPACT_I32 = 0x05; + const COMPACT_I64 = 0x06; + const COMPACT_DOUBLE = 0x07; + const COMPACT_BINARY = 0x08; + const COMPACT_LIST = 0x09; + const COMPACT_SET = 0x0A; + const COMPACT_MAP = 0x0B; + const COMPACT_STRUCT = 0x0C; + + const STATE_CLEAR = 0; + const STATE_FIELD_WRITE = 1; + const STATE_VALUE_WRITE = 2; + const STATE_CONTAINER_WRITE = 3; + const STATE_BOOL_WRITE = 4; + const STATE_FIELD_READ = 5; + const STATE_CONTAINER_READ = 6; + const STATE_VALUE_READ = 7; + const STATE_BOOL_READ = 8; + + const VERSION_MASK = 0x1f; + const VERSION = 1; + const PROTOCOL_ID = 0x82; + const TYPE_MASK = 0xe0; + const TYPE_BITS = 0x07; + const TYPE_SHIFT_AMOUNT = 5; + + protected static $ctypes = array( + TType::STOP => TCompactProtocol::COMPACT_STOP, + TType::BOOL => TCompactProtocol::COMPACT_TRUE, // used for collection + TType::BYTE => TCompactProtocol::COMPACT_BYTE, + TType::I16 => TCompactProtocol::COMPACT_I16, + TType::I32 => TCompactProtocol::COMPACT_I32, + TType::I64 => TCompactProtocol::COMPACT_I64, + TType::DOUBLE => TCompactProtocol::COMPACT_DOUBLE, + TType::STRING => TCompactProtocol::COMPACT_BINARY, + TType::STRUCT => TCompactProtocol::COMPACT_STRUCT, + TType::LST => TCompactProtocol::COMPACT_LIST, + TType::SET => TCompactProtocol::COMPACT_SET, + TType::MAP => TCompactProtocol::COMPACT_MAP, + ); + + protected static $ttypes = array( + TCompactProtocol::COMPACT_STOP => TType::STOP, + TCompactProtocol::COMPACT_TRUE => TType::BOOL, // used for collection + TCompactProtocol::COMPACT_FALSE => TType::BOOL, + TCompactProtocol::COMPACT_BYTE => TType::BYTE, + TCompactProtocol::COMPACT_I16 => TType::I16, + TCompactProtocol::COMPACT_I32 => TType::I32, + TCompactProtocol::COMPACT_I64 => TType::I64, + TCompactProtocol::COMPACT_DOUBLE => TType::DOUBLE, + TCompactProtocol::COMPACT_BINARY => TType::STRING, + TCompactProtocol::COMPACT_STRUCT => TType::STRUCT, + TCompactProtocol::COMPACT_LIST => TType::LST, + TCompactProtocol::COMPACT_SET => TType::SET, + TCompactProtocol::COMPACT_MAP => TType::MAP, + ); + + protected $state = TCompactProtocol::STATE_CLEAR; + protected $lastFid = 0; + protected $boolFid = null; + protected $boolValue = null; + protected $structs = array(); + protected $containers = array(); + + // Some varint / zigzag helper methods + public function toZigZag($n, $bits) + { + return ($n << 1) ^ ($n >> ($bits - 1)); + } + + public function fromZigZag($n) + { + return ($n >> 1) ^ -($n & 1); + } + + public function getVarint($data) + { + $out = ""; + while (true) { + if (($data & ~0x7f) === 0) { + $out .= chr($data); + break; + } else { + $out .= chr(($data & 0xff) | 0x80); + $data = $data >> 7; + } + } + + return $out; + } + + public function writeVarint($data) + { + $out = $this->getVarint($data); + $result = TStringFuncFactory::create()->strlen($out); + $this->trans_->write($out, $result); + + return $result; + } + + public function readVarint(&$result) + { + $idx = 0; + $shift = 0; + $result = 0; + while (true) { + $x = $this->trans_->readAll(1); + $arr = unpack('C', $x); + $byte = $arr[1]; + $idx += 1; + $result |= ($byte & 0x7f) << $shift; + if (($byte >> 7) === 0) { + return $idx; + } + $shift += 7; + } + return $idx; - } - $shift += 7; - } - - return $idx; - } - - public function __construct($trans) - { - parent::__construct($trans); - } - - public function writeMessageBegin($name, $type, $seqid) - { - $written = - $this->writeUByte(TCompactProtocol::PROTOCOL_ID) + - $this->writeUByte(TCompactProtocol::VERSION | - ($type << TCompactProtocol::TYPE_SHIFT_AMOUNT)) + - $this->writeVarint($seqid) + - $this->writeString($name); - $this->state = TCompactProtocol::STATE_VALUE_WRITE; - - return $written; - } - - public function writeMessageEnd() - { - $this->state = TCompactProtocol::STATE_CLEAR; - - return 0; - } - - public function writeStructBegin($name) - { - $this->structs[] = array($this->state, $this->lastFid); - $this->state = TCompactProtocol::STATE_FIELD_WRITE; - $this->lastFid = 0; - - return 0; - } - - public function writeStructEnd() - { - $old_values = array_pop($this->structs); - $this->state = $old_values[0]; - $this->lastFid = $old_values[1]; - - return 0; - } - - public function writeFieldStop() - { - return $this->writeByte(0); - } - - public function writeFieldHeader($type, $fid) - { - $written = 0; - $delta = $fid - $this->lastFid; - if (0 < $delta && $delta <= 15) { - $written = $this->writeUByte(($delta << 4) | $type); - } else { - $written = $this->writeByte($type) + - $this->writeI16($fid); - } - $this->lastFid = $fid; - - return $written; - } - - public function writeFieldBegin($field_name, $field_type, $field_id) - { - if ($field_type == TTYPE::BOOL) { - $this->state = TCompactProtocol::STATE_BOOL_WRITE; - $this->boolFid = $field_id; - - return 0; - } else { - $this->state = TCompactProtocol::STATE_VALUE_WRITE; - - return $this->writeFieldHeader(self::$ctypes[$field_type], $field_id); - } - } - - public function writeFieldEnd() - { - $this->state = TCompactProtocol::STATE_FIELD_WRITE; - - return 0; - } - - public function writeCollectionBegin($etype, $size) - { - $written = 0; - if ($size <= 14) { - $written = $this->writeUByte($size << 4 | - self::$ctypes[$etype]); - } else { - $written = $this->writeUByte(0xf0 | - self::$ctypes[$etype]) + - $this->writeVarint($size); - } - $this->containers[] = $this->state; - $this->state = TCompactProtocol::STATE_CONTAINER_WRITE; - - return $written; - } - - public function writeMapBegin($key_type, $val_type, $size) - { - $written = 0; - if ($size == 0) { - $written = $this->writeByte(0); - } else { - $written = $this->writeVarint($size) + - $this->writeUByte(self::$ctypes[$key_type] << 4 | - self::$ctypes[$val_type]); - } - $this->containers[] = $this->state; - - return $written; - } - - public function writeCollectionEnd() - { - $this->state = array_pop($this->containers); - - return 0; - } - - public function writeMapEnd() - { - return $this->writeCollectionEnd(); - } - - public function writeListBegin($elem_type, $size) - { - return $this->writeCollectionBegin($elem_type, $size); - } - - public function writeListEnd() - { - return $this->writeCollectionEnd(); - } - - public function writeSetBegin($elem_type, $size) - { - return $this->writeCollectionBegin($elem_type, $size); - } - - public function writeSetEnd() - { - return $this->writeCollectionEnd(); - } - - public function writeBool($value) - { - if ($this->state == TCompactProtocol::STATE_BOOL_WRITE) { - $ctype = TCompactProtocol::COMPACT_FALSE; - if ($value) { - $ctype = TCompactProtocol::COMPACT_TRUE; - } - - return $this->writeFieldHeader($ctype, $this->boolFid); - } elseif ($this->state == TCompactProtocol::STATE_CONTAINER_WRITE) { - return $this->writeByte($value ? 1 : 0); - } else { - throw new TProtocolException('Invalid state in compact protocol'); - } - } - - public function writeByte($value) - { - $data = pack('c', $value); - $this->trans_->write($data, 1); - - return 1; - } - - public function writeUByte($byte) - { - $this->trans_->write(pack('C', $byte), 1); - - return 1; - } - - public function writeI16($value) - { - $thing = $this->toZigZag($value, 16); - - return $this->writeVarint($thing); - } - - public function writeI32($value) - { - $thing = $this->toZigZag($value, 32); - - return $this->writeVarint($thing); - } - - public function writeDouble($value) - { - $data = pack('d', $value); - $this->trans_->write($data, 8); - - return 8; - } - - public function writeString($value) - { - $len = TStringFuncFactory::create()->strlen($value); - $result = $this->writeVarint($len); - if ($len) { - $this->trans_->write($value, $len); - } - - return $result + $len; - } - - public function readFieldBegin(&$name, &$field_type, &$field_id) - { - $result = $this->readUByte($compact_type_and_delta); - - $compact_type = $compact_type_and_delta & 0x0f; - - if ($compact_type == TType::STOP) { - $field_type = $compact_type; - $field_id = 0; - - return $result; - } - $delta = $compact_type_and_delta >> 4; - if ($delta == 0) { - $result += $this->readI16($field_id); - } else { - $field_id = $this->lastFid + $delta; - } - $this->lastFid = $field_id; - $field_type = $this->getTType($compact_type); - - if ($compact_type == TCompactProtocol::COMPACT_TRUE) { - $this->state = TCompactProtocol::STATE_BOOL_READ; - $this->boolValue = true; - } elseif ($compact_type == TCompactProtocol::COMPACT_FALSE) { - $this->state = TCompactProtocol::STATE_BOOL_READ; - $this->boolValue = false; - } else { - $this->state = TCompactProtocol::STATE_VALUE_READ; - } - - return $result; - } - - public function readFieldEnd() - { - $this->state = TCompactProtocol::STATE_FIELD_READ; - - return 0; - } - - public function readUByte(&$value) - { - $data = $this->trans_->readAll(1); - $arr = unpack('C', $data); - $value = $arr[1]; - - return 1; - } - - public function readByte(&$value) - { - $data = $this->trans_->readAll(1); - $arr = unpack('c', $data); - $value = $arr[1]; - - return 1; - } - - public function readZigZag(&$value) - { - $result = $this->readVarint($value); - $value = $this->fromZigZag($value); - - return $result; - } - - public function readMessageBegin(&$name, &$type, &$seqid) - { - $protoId = 0; - $result = $this->readUByte($protoId); - if ($protoId != TCompactProtocol::PROTOCOL_ID) { - throw new TProtocolException('Bad protocol id in TCompact message'); - } - $verType = 0; - $result += $this->readUByte($verType); - $type = ($verType >> TCompactProtocol::TYPE_SHIFT_AMOUNT) & TCompactProtocol::TYPE_BITS; - $version = $verType & TCompactProtocol::VERSION_MASK; - if ($version != TCompactProtocol::VERSION) { - throw new TProtocolException('Bad version in TCompact message'); - } - $result += $this->readVarint($seqid); - $result += $this->readString($name); - - return $result; - } - - public function readMessageEnd() - { - return 0; - } - - public function readStructBegin(&$name) - { - $name = ''; // unused - $this->structs[] = array($this->state, $this->lastFid); - $this->state = TCompactProtocol::STATE_FIELD_READ; - $this->lastFid = 0; - - return 0; - } - - public function readStructEnd() - { - $last = array_pop($this->structs); - $this->state = $last[0]; - $this->lastFid = $last[1]; - - return 0; - } - - public function readCollectionBegin(&$type, &$size) - { - $sizeType = 0; - $result = $this->readUByte($sizeType); - $size = $sizeType >> 4; - $type = $this->getTType($sizeType); - if ($size == 15) { - $result += $this->readVarint($size); - } - $this->containers[] = $this->state; - $this->state = TCompactProtocol::STATE_CONTAINER_READ; - - return $result; - } - - public function readMapBegin(&$key_type, &$val_type, &$size) - { - $result = $this->readVarint($size); - $types = 0; - if ($size > 0) { - $result += $this->readUByte($types); - } - $val_type = $this->getTType($types); - $key_type = $this->getTType($types >> 4); - $this->containers[] = $this->state; - $this->state = TCompactProtocol::STATE_CONTAINER_READ; - - return $result; - } - - public function readCollectionEnd() - { - $this->state = array_pop($this->containers); - - return 0; - } - - public function readMapEnd() - { - return $this->readCollectionEnd(); - } - - public function readListBegin(&$elem_type, &$size) - { - return $this->readCollectionBegin($elem_type, $size); - } - - public function readListEnd() - { - return $this->readCollectionEnd(); - } - - public function readSetBegin(&$elem_type, &$size) - { - return $this->readCollectionBegin($elem_type, $size); - } - - public function readSetEnd() - { - return $this->readCollectionEnd(); - } - - public function readBool(&$value) - { - if ($this->state == TCompactProtocol::STATE_BOOL_READ) { - $value = $this->boolValue; - - return 0; - } elseif ($this->state == TCompactProtocol::STATE_CONTAINER_READ) { - return $this->readByte($value); - } else { - throw new TProtocolException('Invalid state in compact protocol'); - } - } - - public function readI16(&$value) - { - return $this->readZigZag($value); - } - - public function readI32(&$value) - { - return $this->readZigZag($value); - } - - public function readDouble(&$value) - { - $data = $this->trans_->readAll(8); - $arr = unpack('d', $data); - $value = $arr[1]; - - return 8; - } - - public function readString(&$value) - { - $result = $this->readVarint($len); - if ($len) { - $value = $this->trans_->readAll($len); - } else { - $value = ''; - } - - return $result + $len; - } - - public function getTType($byte) - { - return self::$ttypes[$byte & 0x0f]; - } - - // If we are on a 32bit architecture we have to explicitly deal with - // 64-bit twos-complement arithmetic since PHP wants to treat all ints - // as signed and any int over 2^31 - 1 as a float - - // Read and write I64 as two 32 bit numbers $hi and $lo - - public function readI64(&$value) - { - // Read varint from wire - $hi = 0; - $lo = 0; - - $idx = 0; - $shift = 0; - - while (true) { - $x = $this->trans_->readAll(1); - $arr = unpack('C', $x); - $byte = $arr[1]; - $idx += 1; - // Shift hi and lo together. - if ($shift < 28) { - $lo |= (($byte & 0x7f) << $shift); - } elseif ($shift == 28) { - $lo |= (($byte & 0x0f) << 28); - $hi |= (($byte & 0x70) >> 4); - } else { - $hi |= (($byte & 0x7f) << ($shift - 32)); - } - if (($byte >> 7) === 0) { - break; - } - $shift += 7; - } - - // Now, unzig it. - $xorer = 0; - if ($lo & 1) { - $xorer = 0xffffffff; - } - $lo = ($lo >> 1) & 0x7fffffff; - $lo = $lo | (($hi & 1) << 31); - $hi = ($hi >> 1) ^ $xorer; - $lo = $lo ^ $xorer; - - // Now put $hi and $lo back together - $isNeg = $hi < 0 || $hi & 0x80000000; - - // Check for a negative - if ($isNeg) { - $hi = ~$hi & (int) 0xffffffff; - $lo = ~$lo & (int) 0xffffffff; - - if ($lo == (int) 0xffffffff) { - $hi++; - $lo = 0; - } else { - $lo++; - } } - // Force 32bit words in excess of 2G to be positive - we deal with sign - // explicitly below + public function __construct($trans) + { + parent::__construct($trans); + } - if ($hi & (int) 0x80000000) { - $hi &= (int) 0x7fffffff; - $hi += 0x80000000; + public function writeMessageBegin($name, $type, $seqid) + { + $written = + $this->writeUByte(TCompactProtocol::PROTOCOL_ID) + + $this->writeUByte(TCompactProtocol::VERSION | + ($type << TCompactProtocol::TYPE_SHIFT_AMOUNT)) + + $this->writeVarint($seqid) + + $this->writeString($name); + $this->state = TCompactProtocol::STATE_VALUE_WRITE; + + return $written; } - if ($lo & (int) 0x80000000) { - $lo &= (int) 0x7fffffff; - $lo += 0x80000000; + public function writeMessageEnd() + { + $this->state = TCompactProtocol::STATE_CLEAR; + + return 0; } - // Create as negative value first, since we can store -2^63 but not 2^63 - $value = -$hi * 4294967296 - $lo; + public function writeStructBegin($name) + { + $this->structs[] = array($this->state, $this->lastFid); + $this->state = TCompactProtocol::STATE_FIELD_WRITE; + $this->lastFid = 0; - if (!$isNeg) { - $value = -$value; + return 0; } - return $idx; - } + public function writeStructEnd() + { + $old_values = array_pop($this->structs); + $this->state = $old_values[0]; + $this->lastFid = $old_values[1]; - public function writeI64($value) - { - // If we are in an I32 range, use the easy method below. - if (($value > 4294967296) || ($value < -4294967296)) { - // Convert $value to $hi and $lo - $neg = $value < 0; + return 0; + } - if ($neg) { - $value *= -1; - } + public function writeFieldStop() + { + return $this->writeByte(0); + } - $hi = (int) $value >> 32; - $lo = (int) $value & 0xffffffff; + public function writeFieldHeader($type, $fid) + { + $written = 0; + $delta = $fid - $this->lastFid; + if (0 < $delta && $delta <= 15) { + $written = $this->writeUByte(($delta << 4) | $type); + } else { + $written = $this->writeByte($type) + + $this->writeI16($fid); + } + $this->lastFid = $fid; + + return $written; + } - if ($neg) { - $hi = ~$hi; - $lo = ~$lo; - if (($lo & (int) 0xffffffff) == (int) 0xffffffff) { - $lo = 0; - $hi++; + public function writeFieldBegin($field_name, $field_type, $field_id) + { + if ($field_type == TTYPE::BOOL) { + $this->state = TCompactProtocol::STATE_BOOL_WRITE; + $this->boolFid = $field_id; + + return 0; } else { - $lo++; + $this->state = TCompactProtocol::STATE_VALUE_WRITE; + + return $this->writeFieldHeader(self::$ctypes[$field_type], $field_id); } - } - - // Now do the zigging and zagging. - $xorer = 0; - if ($neg) { - $xorer = 0xffffffff; - } - $lowbit = ($lo >> 31) & 1; - $hi = ($hi << 1) | $lowbit; - $lo = ($lo << 1); - $lo = ($lo ^ $xorer) & 0xffffffff; - $hi = ($hi ^ $xorer) & 0xffffffff; - - // now write out the varint, ensuring we shift both hi and lo - $out = ""; - while (true) { - if (($lo & ~0x7f) === 0 && - $hi === 0) { - $out .= chr($lo); - break; + } + + public function writeFieldEnd() + { + $this->state = TCompactProtocol::STATE_FIELD_WRITE; + + return 0; + } + + public function writeCollectionBegin($etype, $size) + { + $written = 0; + if ($size <= 14) { + $written = $this->writeUByte($size << 4 | + self::$ctypes[$etype]); } else { - $out .= chr(($lo & 0xff) | 0x80); - $lo = $lo >> 7; - $lo = $lo | ($hi << 25); - $hi = $hi >> 7; - // Right shift carries sign, but we don't want it to. - $hi = $hi & (127 << 25); + $written = $this->writeUByte(0xf0 | + self::$ctypes[$etype]) + + $this->writeVarint($size); } - } + $this->containers[] = $this->state; + $this->state = TCompactProtocol::STATE_CONTAINER_WRITE; + + return $written; + } + + public function writeMapBegin($key_type, $val_type, $size) + { + $written = 0; + if ($size == 0) { + $written = $this->writeByte(0); + } else { + $written = $this->writeVarint($size) + + $this->writeUByte(self::$ctypes[$key_type] << 4 | + self::$ctypes[$val_type]); + } + $this->containers[] = $this->state; + + return $written; + } + + public function writeCollectionEnd() + { + $this->state = array_pop($this->containers); + + return 0; + } + + public function writeMapEnd() + { + return $this->writeCollectionEnd(); + } + + public function writeListBegin($elem_type, $size) + { + return $this->writeCollectionBegin($elem_type, $size); + } - $ret = TStringFuncFactory::create()->strlen($out); - $this->trans_->write($out, $ret); + public function writeListEnd() + { + return $this->writeCollectionEnd(); + } + + public function writeSetBegin($elem_type, $size) + { + return $this->writeCollectionBegin($elem_type, $size); + } + + public function writeSetEnd() + { + return $this->writeCollectionEnd(); + } + + public function writeBool($value) + { + if ($this->state == TCompactProtocol::STATE_BOOL_WRITE) { + $ctype = TCompactProtocol::COMPACT_FALSE; + if ($value) { + $ctype = TCompactProtocol::COMPACT_TRUE; + } + + return $this->writeFieldHeader($ctype, $this->boolFid); + } elseif ($this->state == TCompactProtocol::STATE_CONTAINER_WRITE) { + return $this->writeByte($value ? 1 : 0); + } else { + throw new TProtocolException('Invalid state in compact protocol'); + } + } + + public function writeByte($value) + { + $data = pack('c', $value); + $this->trans_->write($data, 1); + + return 1; + } + + public function writeUByte($byte) + { + $this->trans_->write(pack('C', $byte), 1); + + return 1; + } + + public function writeI16($value) + { + $thing = $this->toZigZag($value, 16); + + return $this->writeVarint($thing); + } + + public function writeI32($value) + { + $thing = $this->toZigZag($value, 32); + + return $this->writeVarint($thing); + } + + public function writeDouble($value) + { + $data = pack('d', $value); + $this->trans_->write($data, 8); + + return 8; + } + + public function writeString($value) + { + $len = TStringFuncFactory::create()->strlen($value); + $result = $this->writeVarint($len); + if ($len) { + $this->trans_->write($value, $len); + } + + return $result + $len; + } + + public function readFieldBegin(&$name, &$field_type, &$field_id) + { + $result = $this->readUByte($compact_type_and_delta); + + $compact_type = $compact_type_and_delta & 0x0f; + + if ($compact_type == TType::STOP) { + $field_type = $compact_type; + $field_id = 0; + + return $result; + } + $delta = $compact_type_and_delta >> 4; + if ($delta == 0) { + $result += $this->readI16($field_id); + } else { + $field_id = $this->lastFid + $delta; + } + $this->lastFid = $field_id; + $field_type = $this->getTType($compact_type); + + if ($compact_type == TCompactProtocol::COMPACT_TRUE) { + $this->state = TCompactProtocol::STATE_BOOL_READ; + $this->boolValue = true; + } elseif ($compact_type == TCompactProtocol::COMPACT_FALSE) { + $this->state = TCompactProtocol::STATE_BOOL_READ; + $this->boolValue = false; + } else { + $this->state = TCompactProtocol::STATE_VALUE_READ; + } + + return $result; + } + + public function readFieldEnd() + { + $this->state = TCompactProtocol::STATE_FIELD_READ; + + return 0; + } - return $ret; - } else { - return $this->writeVarint($this->toZigZag($value, 64)); + public function readUByte(&$value) + { + $data = $this->trans_->readAll(1); + $arr = unpack('C', $data); + $value = $arr[1]; + + return 1; + } + + public function readByte(&$value) + { + $data = $this->trans_->readAll(1); + $arr = unpack('c', $data); + $value = $arr[1]; + + return 1; + } + + public function readZigZag(&$value) + { + $result = $this->readVarint($value); + $value = $this->fromZigZag($value); + + return $result; + } + + public function readMessageBegin(&$name, &$type, &$seqid) + { + $protoId = 0; + $result = $this->readUByte($protoId); + if ($protoId != TCompactProtocol::PROTOCOL_ID) { + throw new TProtocolException('Bad protocol id in TCompact message'); + } + $verType = 0; + $result += $this->readUByte($verType); + $type = ($verType >> TCompactProtocol::TYPE_SHIFT_AMOUNT) & TCompactProtocol::TYPE_BITS; + $version = $verType & TCompactProtocol::VERSION_MASK; + if ($version != TCompactProtocol::VERSION) { + throw new TProtocolException('Bad version in TCompact message'); + } + $result += $this->readVarint($seqid); + $result += $this->readString($name); + + return $result; + } + + public function readMessageEnd() + { + return 0; + } + + public function readStructBegin(&$name) + { + $name = ''; // unused + $this->structs[] = array($this->state, $this->lastFid); + $this->state = TCompactProtocol::STATE_FIELD_READ; + $this->lastFid = 0; + + return 0; + } + + public function readStructEnd() + { + $last = array_pop($this->structs); + $this->state = $last[0]; + $this->lastFid = $last[1]; + + return 0; + } + + public function readCollectionBegin(&$type, &$size) + { + $sizeType = 0; + $result = $this->readUByte($sizeType); + $size = $sizeType >> 4; + $type = $this->getTType($sizeType); + if ($size == 15) { + $result += $this->readVarint($size); + } + $this->containers[] = $this->state; + $this->state = TCompactProtocol::STATE_CONTAINER_READ; + + return $result; + } + + public function readMapBegin(&$key_type, &$val_type, &$size) + { + $result = $this->readVarint($size); + $types = 0; + if ($size > 0) { + $result += $this->readUByte($types); + } + $val_type = $this->getTType($types); + $key_type = $this->getTType($types >> 4); + $this->containers[] = $this->state; + $this->state = TCompactProtocol::STATE_CONTAINER_READ; + + return $result; + } + + public function readCollectionEnd() + { + $this->state = array_pop($this->containers); + + return 0; + } + + public function readMapEnd() + { + return $this->readCollectionEnd(); + } + + public function readListBegin(&$elem_type, &$size) + { + return $this->readCollectionBegin($elem_type, $size); + } + + public function readListEnd() + { + return $this->readCollectionEnd(); + } + + public function readSetBegin(&$elem_type, &$size) + { + return $this->readCollectionBegin($elem_type, $size); + } + + public function readSetEnd() + { + return $this->readCollectionEnd(); + } + + public function readBool(&$value) + { + if ($this->state == TCompactProtocol::STATE_BOOL_READ) { + $value = $this->boolValue; + + return 0; + } elseif ($this->state == TCompactProtocol::STATE_CONTAINER_READ) { + return $this->readByte($value); + } else { + throw new TProtocolException('Invalid state in compact protocol'); + } + } + + public function readI16(&$value) + { + return $this->readZigZag($value); + } + + public function readI32(&$value) + { + return $this->readZigZag($value); + } + + public function readDouble(&$value) + { + $data = $this->trans_->readAll(8); + $arr = unpack('d', $data); + $value = $arr[1]; + + return 8; + } + + public function readString(&$value) + { + $result = $this->readVarint($len); + if ($len) { + $value = $this->trans_->readAll($len); + } else { + $value = ''; + } + + return $result + $len; + } + + public function getTType($byte) + { + return self::$ttypes[$byte & 0x0f]; + } + + // If we are on a 32bit architecture we have to explicitly deal with + // 64-bit twos-complement arithmetic since PHP wants to treat all ints + // as signed and any int over 2^31 - 1 as a float + + // Read and write I64 as two 32 bit numbers $hi and $lo + + public function readI64(&$value) + { + // Read varint from wire + $hi = 0; + $lo = 0; + + $idx = 0; + $shift = 0; + + while (true) { + $x = $this->trans_->readAll(1); + $arr = unpack('C', $x); + $byte = $arr[1]; + $idx += 1; + // Shift hi and lo together. + if ($shift < 28) { + $lo |= (($byte & 0x7f) << $shift); + } elseif ($shift == 28) { + $lo |= (($byte & 0x0f) << 28); + $hi |= (($byte & 0x70) >> 4); + } else { + $hi |= (($byte & 0x7f) << ($shift - 32)); + } + if (($byte >> 7) === 0) { + break; + } + $shift += 7; + } + + // Now, unzig it. + $xorer = 0; + if ($lo & 1) { + $xorer = 0xffffffff; + } + $lo = ($lo >> 1) & 0x7fffffff; + $lo = $lo | (($hi & 1) << 31); + $hi = ($hi >> 1) ^ $xorer; + $lo = $lo ^ $xorer; + + // Now put $hi and $lo back together + $isNeg = $hi < 0 || $hi & 0x80000000; + + // Check for a negative + if ($isNeg) { + $hi = ~$hi & (int)0xffffffff; + $lo = ~$lo & (int)0xffffffff; + + if ($lo == (int)0xffffffff) { + $hi++; + $lo = 0; + } else { + $lo++; + } + } + + // Force 32bit words in excess of 2G to be positive - we deal with sign + // explicitly below + + if ($hi & (int)0x80000000) { + $hi &= (int)0x7fffffff; + $hi += 0x80000000; + } + + if ($lo & (int)0x80000000) { + $lo &= (int)0x7fffffff; + $lo += 0x80000000; + } + + // Create as negative value first, since we can store -2^63 but not 2^63 + $value = -$hi * 4294967296 - $lo; + + if (!$isNeg) { + $value = -$value; + } + + return $idx; + } + + public function writeI64($value) + { + // If we are in an I32 range, use the easy method below. + if (($value > 4294967296) || ($value < -4294967296)) { + // Convert $value to $hi and $lo + $neg = $value < 0; + + if ($neg) { + $value *= -1; + } + + $hi = (int)$value >> 32; + $lo = (int)$value & 0xffffffff; + + if ($neg) { + $hi = ~$hi; + $lo = ~$lo; + if (($lo & (int)0xffffffff) == (int)0xffffffff) { + $lo = 0; + $hi++; + } else { + $lo++; + } + } + + // Now do the zigging and zagging. + $xorer = 0; + if ($neg) { + $xorer = 0xffffffff; + } + $lowbit = ($lo >> 31) & 1; + $hi = ($hi << 1) | $lowbit; + $lo = ($lo << 1); + $lo = ($lo ^ $xorer) & 0xffffffff; + $hi = ($hi ^ $xorer) & 0xffffffff; + + // now write out the varint, ensuring we shift both hi and lo + $out = ""; + while (true) { + if (($lo & ~0x7f) === 0 && + $hi === 0) { + $out .= chr($lo); + break; + } else { + $out .= chr(($lo & 0xff) | 0x80); + $lo = $lo >> 7; + $lo = $lo | ($hi << 25); + $hi = $hi >> 7; + // Right shift carries sign, but we don't want it to. + $hi = $hi & (127 << 25); + } + } + + $ret = TStringFuncFactory::create()->strlen($out); + $this->trans_->write($out, $ret); + + return $ret; + } else { + return $this->writeVarint($this->toZigZag($value, 64)); + } } - } } diff --git a/lib/php/lib/Protocol/TJSONProtocol.php b/lib/php/lib/Protocol/TJSONProtocol.php index 6d8e81faa..914488421 100644 --- a/lib/php/lib/Protocol/TJSONProtocol.php +++ b/lib/php/lib/Protocol/TJSONProtocol.php @@ -217,9 +217,9 @@ class TJSONProtocol extends TProtocol private function hasJSONUnescapedUnicode() { - if (PHP_MAJOR_VERSION > 5 - || (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION >= 4)) + if (PHP_MAJOR_VERSION > 5 || (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION >= 4)) { return true; + } return false; } @@ -237,18 +237,24 @@ class TJSONProtocol extends TProtocol * High surrogate: 0xD800 - 0xDBFF * Low surrogate: 0xDC00 - 0xDFFF */ - $json = preg_replace_callback('/\\\\u(d[89ab][0-9a-f]{2})\\\\u(d[cdef][0-9a-f]{2})/i', + $json = preg_replace_callback( + '/\\\\u(d[89ab][0-9a-f]{2})\\\\u(d[cdef][0-9a-f]{2})/i', function ($matches) { - return mb_convert_encoding(pack('H*', $matches[1].$matches[2]), 'UTF-8', 'UTF-16BE'); - }, $json); + return mb_convert_encoding(pack('H*', $matches[1] . $matches[2]), 'UTF-8', 'UTF-16BE'); + }, + $json + ); /* * Unescaped characters within the Basic Multilingual Plane */ - $json = preg_replace_callback('/\\\\u([0-9a-f]{4})/i', + $json = preg_replace_callback( + '/\\\\u([0-9a-f]{4})/i', function ($matches) { return mb_convert_encoding(pack('H*', $matches[1]), 'UTF-8', 'UTF-16BE'); - }, $json); + }, + $json + ); return $json; } @@ -308,54 +314,54 @@ class TJSONProtocol extends TProtocol private function writeJSONObjectStart() { - $this->context_->write(); - $this->trans_->write(self::LBRACE); - $this->pushContext(new PairContext($this)); + $this->context_->write(); + $this->trans_->write(self::LBRACE); + $this->pushContext(new PairContext($this)); } private function writeJSONObjectEnd() { - $this->popContext(); - $this->trans_->write(self::RBRACE); + $this->popContext(); + $this->trans_->write(self::RBRACE); } private function writeJSONArrayStart() { - $this->context_->write(); - $this->trans_->write(self::LBRACKET); - $this->pushContext(new ListContext($this)); + $this->context_->write(); + $this->trans_->write(self::LBRACKET); + $this->pushContext(new ListContext($this)); } private function writeJSONArrayEnd() { - $this->popContext(); - $this->trans_->write(self::RBRACKET); + $this->popContext(); + $this->trans_->write(self::RBRACKET); } private function readJSONString($skipContext) { - if (!$skipContext) { - $this->context_->read(); - } - - $jsonString = ''; - $lastChar = null; - while (true) { - $ch = $this->reader_->read(); - $jsonString .= $ch; - if ($ch == self::QUOTE && - $lastChar !== NULL && - $lastChar !== self::ESCSEQ) { - break; + if (!$skipContext) { + $this->context_->read(); } - if ($ch == self::ESCSEQ && $lastChar == self::ESCSEQ) { - $lastChar = self::DOUBLEESC; - } else { - $lastChar = $ch; + + $jsonString = ''; + $lastChar = null; + while (true) { + $ch = $this->reader_->read(); + $jsonString .= $ch; + if ($ch == self::QUOTE && + $lastChar !== null && + $lastChar !== self::ESCSEQ) { + break; + } + if ($ch == self::ESCSEQ && $lastChar == self::ESCSEQ) { + $lastChar = self::DOUBLEESC; + } else { + $lastChar = $ch; + } } - } - return json_decode($jsonString); + return json_decode($jsonString); } private function isJSONNumeric($b) @@ -376,8 +382,8 @@ class TJSONProtocol extends TProtocol case '9': case 'E': case 'e': - return true; - } + return true; + } return false; } @@ -459,8 +465,10 @@ class TJSONProtocol extends TProtocol } elseif ($arr == "Infinity") { return INF; } elseif (!$this->context_->escapeNum()) { - throw new TProtocolException("Numeric data unexpectedly quoted " . $arr, - TProtocolException::INVALID_DATA); + throw new TProtocolException( + "Numeric data unexpectedly quoted " . $arr, + TProtocolException::INVALID_DATA + ); } return floatval($arr); @@ -514,9 +522,9 @@ class TJSONProtocol extends TProtocol /** * Writes the message header * - * @param string $name Function name - * @param int $type message type TMessageType::CALL or TMessageType::REPLY - * @param int $seqid The sequence id of this message + * @param string $name Function name + * @param int $type message type TMessageType::CALL or TMessageType::REPLY + * @param int $seqid The sequence id of this message */ public function writeMessageBegin($name, $type, $seqid) { @@ -538,7 +546,7 @@ class TJSONProtocol extends TProtocol /** * Writes a struct header. * - * @param string $name Struct name + * @param string $name Struct name * @throws TException on write error * @return int How many bytes written */ @@ -652,7 +660,7 @@ class TJSONProtocol extends TProtocol * Reads the message header * * @param string $name Function name - * @param int $type message type TMessageType::CALL or TMessageType::REPLY + * @param int $type message type TMessageType::CALL or TMessageType::REPLY * @parem int $seqid The sequence id of this message */ public function readMessageBegin(&$name, &$type, &$seqid) diff --git a/lib/php/lib/Protocol/TProtocol.php b/lib/php/lib/Protocol/TProtocol.php index 0e3bc0d0b..81aceb623 100644 --- a/lib/php/lib/Protocol/TProtocol.php +++ b/lib/php/lib/Protocol/TProtocol.php @@ -30,323 +30,321 @@ use Thrift\Exception\TProtocolException; */ abstract class TProtocol { - /** - * Underlying transport - * - * @var TTransport - */ - protected $trans_; - - /** - * Constructor - */ - protected function __construct($trans) - { - $this->trans_ = $trans; - } - - /** - * Accessor for transport - * - * @return TTransport - */ - public function getTransport() - { - return $this->trans_; - } + /** + * Underlying transport + * + * @var TTransport + */ + protected $trans_; + + /** + * Constructor + */ + protected function __construct($trans) + { + $this->trans_ = $trans; + } - /** - * Writes the message header - * - * @param string $name Function name - * @param int $type message type TMessageType::CALL or TMessageType::REPLY - * @param int $seqid The sequence id of this message - */ - abstract public function writeMessageBegin($name, $type, $seqid); + /** + * Accessor for transport + * + * @return TTransport + */ + public function getTransport() + { + return $this->trans_; + } - /** - * Close the message - */ - abstract public function writeMessageEnd(); + /** + * Writes the message header + * + * @param string $name Function name + * @param int $type message type TMessageType::CALL or TMessageType::REPLY + * @param int $seqid The sequence id of this message + */ + abstract public function writeMessageBegin($name, $type, $seqid); - /** - * Writes a struct header. - * - * @param string $name Struct name - * @throws TException on write error - * @return int How many bytes written - */ - abstract public function writeStructBegin($name); + /** + * Close the message + */ + abstract public function writeMessageEnd(); - /** - * Close a struct. - * - * @throws TException on write error - * @return int How many bytes written - */ - abstract public function writeStructEnd(); + /** + * Writes a struct header. + * + * @param string $name Struct name + * @throws TException on write error + * @return int How many bytes written + */ + abstract public function writeStructBegin($name); - /* - * Starts a field. - * - * @param string $name Field name - * @param int $type Field type - * @param int $fid Field id - * @throws TException on write error - * @return int How many bytes written - */ - abstract public function writeFieldBegin($fieldName, $fieldType, $fieldId); + /** + * Close a struct. + * + * @throws TException on write error + * @return int How many bytes written + */ + abstract public function writeStructEnd(); - abstract public function writeFieldEnd(); + /* + * Starts a field. + * + * @param string $name Field name + * @param int $type Field type + * @param int $fid Field id + * @throws TException on write error + * @return int How many bytes written + */ + abstract public function writeFieldBegin($fieldName, $fieldType, $fieldId); - abstract public function writeFieldStop(); + abstract public function writeFieldEnd(); - abstract public function writeMapBegin($keyType, $valType, $size); - - abstract public function writeMapEnd(); - - abstract public function writeListBegin($elemType, $size); - - abstract public function writeListEnd(); - - abstract public function writeSetBegin($elemType, $size); - - abstract public function writeSetEnd(); - - abstract public function writeBool($bool); - - abstract public function writeByte($byte); - - abstract public function writeI16($i16); - - abstract public function writeI32($i32); - - abstract public function writeI64($i64); - - abstract public function writeDouble($dub); - - abstract public function writeString($str); - - /** - * Reads the message header - * - * @param string $name Function name - * @param int $type message type TMessageType::CALL or TMessageType::REPLY - * @parem int $seqid The sequence id of this message - */ - abstract public function readMessageBegin(&$name, &$type, &$seqid); - - /** - * Read the close of message - */ - abstract public function readMessageEnd(); - - abstract public function readStructBegin(&$name); + abstract public function writeFieldStop(); - abstract public function readStructEnd(); + abstract public function writeMapBegin($keyType, $valType, $size); - abstract public function readFieldBegin(&$name, &$fieldType, &$fieldId); + abstract public function writeMapEnd(); - abstract public function readFieldEnd(); + abstract public function writeListBegin($elemType, $size); - abstract public function readMapBegin(&$keyType, &$valType, &$size); + abstract public function writeListEnd(); - abstract public function readMapEnd(); + abstract public function writeSetBegin($elemType, $size); - abstract public function readListBegin(&$elemType, &$size); + abstract public function writeSetEnd(); - abstract public function readListEnd(); + abstract public function writeBool($bool); - abstract public function readSetBegin(&$elemType, &$size); + abstract public function writeByte($byte); - abstract public function readSetEnd(); + abstract public function writeI16($i16); - abstract public function readBool(&$bool); + abstract public function writeI32($i32); - abstract public function readByte(&$byte); + abstract public function writeI64($i64); - abstract public function readI16(&$i16); + abstract public function writeDouble($dub); - abstract public function readI32(&$i32); + abstract public function writeString($str); - abstract public function readI64(&$i64); + /** + * Reads the message header + * + * @param string $name Function name + * @param int $type message type TMessageType::CALL or TMessageType::REPLY + * @parem int $seqid The sequence id of this message + */ + abstract public function readMessageBegin(&$name, &$type, &$seqid); - abstract public function readDouble(&$dub); + /** + * Read the close of message + */ + abstract public function readMessageEnd(); - abstract public function readString(&$str); + abstract public function readStructBegin(&$name); - /** - * The skip function is a utility to parse over unrecognized date without - * causing corruption. - * - * @param TType $type What type is it - */ - public function skip($type) - { - switch ($type) { - case TType::BOOL: - return $this->readBool($bool); - case TType::BYTE: - return $this->readByte($byte); - case TType::I16: - return $this->readI16($i16); - case TType::I32: - return $this->readI32($i32); - case TType::I64: - return $this->readI64($i64); - case TType::DOUBLE: - return $this->readDouble($dub); - case TType::STRING: - return $this->readString($str); - case TType::STRUCT: - { - $result = $this->readStructBegin($name); - while (true) { - $result += $this->readFieldBegin($name, $ftype, $fid); - if ($ftype == TType::STOP) { - break; - } - $result += $this->skip($ftype); - $result += $this->readFieldEnd(); - } - $result += $this->readStructEnd(); - - return $result; - } - case TType::MAP: - { - $result = $this->readMapBegin($keyType, $valType, $size); - for ($i = 0; $i < $size; $i++) { - $result += $this->skip($keyType); - $result += $this->skip($valType); - } - $result += $this->readMapEnd(); - - return $result; - } - case TType::SET: - { - $result = $this->readSetBegin($elemType, $size); - for ($i = 0; $i < $size; $i++) { - $result += $this->skip($elemType); - } - $result += $this->readSetEnd(); - - return $result; - } - case TType::LST: - { - $result = $this->readListBegin($elemType, $size); - for ($i = 0; $i < $size; $i++) { - $result += $this->skip($elemType); - } - $result += $this->readListEnd(); + abstract public function readStructEnd(); - return $result; - } - default: - throw new TProtocolException('Unknown field type: '.$type, - TProtocolException::INVALID_DATA); - } - } - - /** - * Utility for skipping binary data - * - * @param TTransport $itrans TTransport object - * @param int $type Field type - */ - public static function skipBinary($itrans, $type) - { - switch ($type) { - case TType::BOOL: - return $itrans->readAll(1); - case TType::BYTE: - return $itrans->readAll(1); - case TType::I16: - return $itrans->readAll(2); - case TType::I32: - return $itrans->readAll(4); - case TType::I64: - return $itrans->readAll(8); - case TType::DOUBLE: - return $itrans->readAll(8); - case TType::STRING: - $len = unpack('N', $itrans->readAll(4)); - $len = $len[1]; - if ($len > 0x7fffffff) { - $len = 0 - (($len - 1) ^ 0xffffffff); - } - - return 4 + $itrans->readAll($len); - case TType::STRUCT: - { - $result = 0; - while (true) { - $ftype = 0; - $fid = 0; - $data = $itrans->readAll(1); - $arr = unpack('c', $data); - $ftype = $arr[1]; - if ($ftype == TType::STOP) { - break; - } - // I16 field id - $result += $itrans->readAll(2); - $result += self::skipBinary($itrans, $ftype); - } + abstract public function readFieldBegin(&$name, &$fieldType, &$fieldId); - return $result; - } - case TType::MAP: - { - // Ktype - $data = $itrans->readAll(1); - $arr = unpack('c', $data); - $ktype = $arr[1]; - // Vtype - $data = $itrans->readAll(1); - $arr = unpack('c', $data); - $vtype = $arr[1]; - // Size - $data = $itrans->readAll(4); - $arr = unpack('N', $data); - $size = $arr[1]; - if ($size > 0x7fffffff) { - $size = 0 - (($size - 1) ^ 0xffffffff); - } - $result = 6; - for ($i = 0; $i < $size; $i++) { - $result += self::skipBinary($itrans, $ktype); - $result += self::skipBinary($itrans, $vtype); - } + abstract public function readFieldEnd(); - return $result; - } - case TType::SET: - case TType::LST: - { - // Vtype - $data = $itrans->readAll(1); - $arr = unpack('c', $data); - $vtype = $arr[1]; - // Size - $data = $itrans->readAll(4); - $arr = unpack('N', $data); - $size = $arr[1]; - if ($size > 0x7fffffff) { - $size = 0 - (($size - 1) ^ 0xffffffff); - } - $result = 5; - for ($i = 0; $i < $size; $i++) { - $result += self::skipBinary($itrans, $vtype); + abstract public function readMapBegin(&$keyType, &$valType, &$size); + + abstract public function readMapEnd(); + + abstract public function readListBegin(&$elemType, &$size); + + abstract public function readListEnd(); + + abstract public function readSetBegin(&$elemType, &$size); + + abstract public function readSetEnd(); + + abstract public function readBool(&$bool); + + abstract public function readByte(&$byte); + + abstract public function readI16(&$i16); + + abstract public function readI32(&$i32); + + abstract public function readI64(&$i64); + + abstract public function readDouble(&$dub); + + abstract public function readString(&$str); + + /** + * The skip function is a utility to parse over unrecognized date without + * causing corruption. + * + * @param TType $type What type is it + */ + public function skip($type) + { + switch ($type) { + case TType::BOOL: + return $this->readBool($bool); + case TType::BYTE: + return $this->readByte($byte); + case TType::I16: + return $this->readI16($i16); + case TType::I32: + return $this->readI32($i32); + case TType::I64: + return $this->readI64($i64); + case TType::DOUBLE: + return $this->readDouble($dub); + case TType::STRING: + return $this->readString($str); + case TType::STRUCT: + $result = $this->readStructBegin($name); + while (true) { + $result += $this->readFieldBegin($name, $ftype, $fid); + if ($ftype == TType::STOP) { + break; + } + $result += $this->skip($ftype); + $result += $this->readFieldEnd(); + } + $result += $this->readStructEnd(); + + return $result; + + case TType::MAP: + $result = $this->readMapBegin($keyType, $valType, $size); + for ($i = 0; $i < $size; $i++) { + $result += $this->skip($keyType); + $result += $this->skip($valType); + } + $result += $this->readMapEnd(); + + return $result; + + case TType::SET: + $result = $this->readSetBegin($elemType, $size); + for ($i = 0; $i < $size; $i++) { + $result += $this->skip($elemType); + } + $result += $this->readSetEnd(); + + return $result; + + case TType::LST: + $result = $this->readListBegin($elemType, $size); + for ($i = 0; $i < $size; $i++) { + $result += $this->skip($elemType); + } + $result += $this->readListEnd(); + + return $result; + + default: + throw new TProtocolException( + 'Unknown field type: ' . $type, + TProtocolException::INVALID_DATA + ); } + } - return $result; - } - default: - throw new TProtocolException('Unknown field type: '.$type, - TProtocolException::INVALID_DATA); + /** + * Utility for skipping binary data + * + * @param TTransport $itrans TTransport object + * @param int $type Field type + */ + public static function skipBinary($itrans, $type) + { + switch ($type) { + case TType::BOOL: + return $itrans->readAll(1); + case TType::BYTE: + return $itrans->readAll(1); + case TType::I16: + return $itrans->readAll(2); + case TType::I32: + return $itrans->readAll(4); + case TType::I64: + return $itrans->readAll(8); + case TType::DOUBLE: + return $itrans->readAll(8); + case TType::STRING: + $len = unpack('N', $itrans->readAll(4)); + $len = $len[1]; + if ($len > 0x7fffffff) { + $len = 0 - (($len - 1) ^ 0xffffffff); + } + + return 4 + $itrans->readAll($len); + + case TType::STRUCT: + $result = 0; + while (true) { + $ftype = 0; + $fid = 0; + $data = $itrans->readAll(1); + $arr = unpack('c', $data); + $ftype = $arr[1]; + if ($ftype == TType::STOP) { + break; + } + // I16 field id + $result += $itrans->readAll(2); + $result += self::skipBinary($itrans, $ftype); + } + + return $result; + + case TType::MAP: + // Ktype + $data = $itrans->readAll(1); + $arr = unpack('c', $data); + $ktype = $arr[1]; + // Vtype + $data = $itrans->readAll(1); + $arr = unpack('c', $data); + $vtype = $arr[1]; + // Size + $data = $itrans->readAll(4); + $arr = unpack('N', $data); + $size = $arr[1]; + if ($size > 0x7fffffff) { + $size = 0 - (($size - 1) ^ 0xffffffff); + } + $result = 6; + for ($i = 0; $i < $size; $i++) { + $result += self::skipBinary($itrans, $ktype); + $result += self::skipBinary($itrans, $vtype); + } + + return $result; + + case TType::SET: + case TType::LST: + // Vtype + $data = $itrans->readAll(1); + $arr = unpack('c', $data); + $vtype = $arr[1]; + // Size + $data = $itrans->readAll(4); + $arr = unpack('N', $data); + $size = $arr[1]; + if ($size > 0x7fffffff) { + $size = 0 - (($size - 1) ^ 0xffffffff); + } + $result = 5; + for ($i = 0; $i < $size; $i++) { + $result += self::skipBinary($itrans, $vtype); + } + + return $result; + + default: + throw new TProtocolException( + 'Unknown field type: ' . $type, + TProtocolException::INVALID_DATA + ); + } } - } } diff --git a/lib/php/lib/Protocol/TProtocolDecorator.php b/lib/php/lib/Protocol/TProtocolDecorator.php index c08c4d505..a85e0b8e5 100644 --- a/lib/php/lib/Protocol/TProtocolDecorator.php +++ b/lib/php/lib/Protocol/TProtocolDecorator.php @@ -21,6 +21,7 @@ */ namespace Thrift\Protocol; + use Thrift\Exception\TException; /** diff --git a/lib/php/lib/Protocol/TSimpleJSONProtocol.php b/lib/php/lib/Protocol/TSimpleJSONProtocol.php index 9cf90bdaa..1cf1f6407 100644 --- a/lib/php/lib/Protocol/TSimpleJSONProtocol.php +++ b/lib/php/lib/Protocol/TSimpleJSONProtocol.php @@ -54,7 +54,8 @@ class TSimpleJSONProtocol extends TProtocol /** * Push a new write context onto the stack. */ - protected function pushWriteContext(Context $c) { + protected function pushWriteContext(Context $c) + { $this->writeContextStack_[] = $this->writeContext_; $this->writeContext_ = $c; } @@ -62,14 +63,16 @@ class TSimpleJSONProtocol extends TProtocol /** * Pop the last write context off the stack */ - protected function popWriteContext() { + protected function popWriteContext() + { $this->writeContext_ = array_pop($this->writeContextStack_); } /** * Used to make sure that we are not encountering a map whose keys are containers */ - protected function assertContextIsNotMapKey($invalidKeyType) { + protected function assertContextIsNotMapKey($invalidKeyType) + { if ($this->writeContext_->isMapKey()) { throw new CollectionMapKeyException( "Cannot serialize a map with keys that are of type " . diff --git a/lib/php/lib/Serializer/TBinarySerializer.php b/lib/php/lib/Serializer/TBinarySerializer.php index aa2f71b40..9d2b14730 100644 --- a/lib/php/lib/Serializer/TBinarySerializer.php +++ b/lib/php/lib/Serializer/TBinarySerializer.php @@ -33,53 +33,55 @@ use Thrift\Type\TMessageType; */ class TBinarySerializer { - // NOTE(rmarin): Because thrift_protocol_write_binary - // adds a begin message prefix, you cannot specify - // a transport in which to serialize an object. It has to - // be a string. Otherwise we will break the compatibility with - // normal deserialization. - public static function serialize($object) - { - $transport = new TMemoryBuffer(); - $protocol = new TBinaryProtocolAccelerated($transport); - if (function_exists('thrift_protocol_write_binary')) { - thrift_protocol_write_binary($protocol, $object->getName(), - TMessageType::REPLY, $object, - 0, $protocol->isStrictWrite()); + // NOTE(rmarin): Because thrift_protocol_write_binary + // adds a begin message prefix, you cannot specify + // a transport in which to serialize an object. It has to + // be a string. Otherwise we will break the compatibility with + // normal deserialization. + public static function serialize($object) + { + $transport = new TMemoryBuffer(); + $protocol = new TBinaryProtocolAccelerated($transport); + if (function_exists('thrift_protocol_write_binary')) { + thrift_protocol_write_binary( + $protocol, + $object->getName(), + TMessageType::REPLY, + $object, + 0, + $protocol->isStrictWrite() + ); - $protocol->readMessageBegin($unused_name, $unused_type, - $unused_seqid); - } else { - $object->write($protocol); - } - $protocol->getTransport()->flush(); + $protocol->readMessageBegin($unused_name, $unused_type, $unused_seqid); + } else { + $object->write($protocol); + } + $protocol->getTransport()->flush(); - return $transport->getBuffer(); - } + return $transport->getBuffer(); + } - public static function deserialize($string_object, $class_name, $buffer_size = 8192) - { - $transport = new TMemoryBuffer(); - $protocol = new TBinaryProtocolAccelerated($transport); - if (function_exists('thrift_protocol_read_binary')) { - // NOTE (t.heintz) TBinaryProtocolAccelerated internally wraps our TMemoryBuffer in a - // TBufferedTransport, so we have to retrieve it again or risk losing data when writing - // less than 512 bytes to the transport (see the comment there as well). - // @see THRIFT-1579 - $protocol->writeMessageBegin('', TMessageType::REPLY, 0); - $protocolTransport = $protocol->getTransport(); - $protocolTransport->write($string_object); - $protocolTransport->flush(); + public static function deserialize($string_object, $class_name, $buffer_size = 8192) + { + $transport = new TMemoryBuffer(); + $protocol = new TBinaryProtocolAccelerated($transport); + if (function_exists('thrift_protocol_read_binary')) { + // NOTE (t.heintz) TBinaryProtocolAccelerated internally wraps our TMemoryBuffer in a + // TBufferedTransport, so we have to retrieve it again or risk losing data when writing + // less than 512 bytes to the transport (see the comment there as well). + // @see THRIFT-1579 + $protocol->writeMessageBegin('', TMessageType::REPLY, 0); + $protocolTransport = $protocol->getTransport(); + $protocolTransport->write($string_object); + $protocolTransport->flush(); - return thrift_protocol_read_binary($protocol, $class_name, - $protocol->isStrictRead(), - $buffer_size); - } else { - $transport->write($string_object); - $object = new $class_name(); - $object->read($protocol); + return thrift_protocol_read_binary($protocol, $class_name, $protocol->isStrictRead(), $buffer_size); + } else { + $transport->write($string_object); + $object = new $class_name(); + $object->read($protocol); - return $object; - } - } + return $object; + } + } } diff --git a/lib/php/lib/Server/TForkingServer.php b/lib/php/lib/Server/TForkingServer.php index 7f6e541cd..0bb6e9192 100644 --- a/lib/php/lib/Server/TForkingServer.php +++ b/lib/php/lib/Server/TForkingServer.php @@ -13,108 +13,113 @@ use Thrift\Exception\TTransportException; */ class TForkingServer extends TServer { - /** - * Flag for the main serving loop - * - * @var bool - */ - private $stop_ = false; + /** + * Flag for the main serving loop + * + * @var bool + */ + private $stop_ = false; - /** - * List of children. - * - * @var array - */ - protected $children_ = array(); + /** + * List of children. + * + * @var array + */ + protected $children_ = array(); - /** - * Listens for new client using the supplied - * transport. We fork when a new connection - * arrives. - * - * @return void - */ - public function serve() - { - $this->transport_->listen(); + /** + * Listens for new client using the supplied + * transport. We fork when a new connection + * arrives. + * + * @return void + */ + public function serve() + { + $this->transport_->listen(); - while (!$this->stop_) { - try { - $transport = $this->transport_->accept(); + while (!$this->stop_) { + try { + $transport = $this->transport_->accept(); - if ($transport != null) { - $pid = pcntl_fork(); + if ($transport != null) { + $pid = pcntl_fork(); - if ($pid > 0) { - $this->handleParent($transport, $pid); - } elseif ($pid === 0) { - $this->handleChild($transport); - } else { - throw new TException('Failed to fork'); - } - } - } catch (TTransportException $e) { } + if ($pid > 0) { + $this->handleParent($transport, $pid); + } elseif ($pid === 0) { + $this->handleChild($transport); + } else { + throw new TException('Failed to fork'); + } + } + } catch (TTransportException $e) { + } - $this->collectChildren(); + $this->collectChildren(); + } } - } - /** - * Code run by the parent - * - * @param TTransport $transport - * @param int $pid - * @return void - */ - private function handleParent(TTransport $transport, $pid) - { - $this->children_[$pid] = $transport; - } + /** + * Code run by the parent + * + * @param TTransport $transport + * @param int $pid + * @return void + */ + private function handleParent(TTransport $transport, $pid) + { + $this->children_[$pid] = $transport; + } - /** - * Code run by the child. - * - * @param TTransport $transport - * @return void - */ - private function handleChild(TTransport $transport) - { - try { - $inputTransport = $this->inputTransportFactory_->getTransport($transport); - $outputTransport = $this->outputTransportFactory_->getTransport($transport); - $inputProtocol = $this->inputProtocolFactory_->getProtocol($inputTransport); - $outputProtocol = $this->outputProtocolFactory_->getProtocol($outputTransport); - while ($this->processor_->process($inputProtocol, $outputProtocol)) { } - @$transport->close(); - } catch (TTransportException $e) { } + /** + * Code run by the child. + * + * @param TTransport $transport + * @return void + */ + private function handleChild(TTransport $transport) + { + try { + $inputTransport = $this->inputTransportFactory_->getTransport($transport); + $outputTransport = $this->outputTransportFactory_->getTransport($transport); + $inputProtocol = $this->inputProtocolFactory_->getProtocol($inputTransport); + $outputProtocol = $this->outputProtocolFactory_->getProtocol($outputTransport); + while ($this->processor_->process($inputProtocol, $outputProtocol)) { + } + @$transport->close(); + } catch (TTransportException $e) { + } - exit(0); - } + exit(0); + } - /** - * Collects any children we may have - * - * @return void - */ - private function collectChildren() - { - foreach ($this->children_ as $pid => $transport) { - if (pcntl_waitpid($pid, $status, WNOHANG) > 0) { - unset($this->children_[$pid]); - if ($transport) @$transport->close(); - } + /** + * Collects any children we may have + * + * @return void + */ + private function collectChildren() + { + foreach ($this->children_ as $pid => $transport) { + if (pcntl_waitpid($pid, $status, WNOHANG) > 0) { + unset($this->children_[$pid]); + if ($transport) { + @$transport->close(); + } + } + } } - } - /** - * Stops the server running. Kills the transport - * and then stops the main serving loop - * - * @return void - */ - public function stop() - { - $this->transport_->close(); - $this->stop_ = true; - } + /** + * Stops the server running. Kills the transport + * and then stops the main serving loop + * + * @return void + */ + public function stop() + { + $this->transport_->close(); + $this->stop_ = true; + } } diff --git a/lib/php/lib/Server/TSSLServerSocket.php b/lib/php/lib/Server/TSSLServerSocket.php index dfc470430..ac589b76b 100644 --- a/lib/php/lib/Server/TSSLServerSocket.php +++ b/lib/php/lib/Server/TSSLServerSocket.php @@ -30,65 +30,68 @@ use Thrift\Transport\TSSLSocket; */ class TSSLServerSocket extends TServerSocket { - /** - * Remote port - * - * @var resource - */ - protected $context_ = null; + /** + * Remote port + * + * @var resource + */ + protected $context_ = null; - /** - * ServerSocket constructor - * - * @param string $host Host to listen on - * @param int $port Port to listen on - * @param resource $context Stream context - * @return void - */ - public function __construct($host = 'localhost', $port = 9090, $context = null) - { - $ssl_host = $this->getSSLHost($host); - parent::__construct($ssl_host, $port); - $this->context_ = $context; - } + /** + * ServerSocket constructor + * + * @param string $host Host to listen on + * @param int $port Port to listen on + * @param resource $context Stream context + * @return void + */ + public function __construct($host = 'localhost', $port = 9090, $context = null) + { + $ssl_host = $this->getSSLHost($host); + parent::__construct($ssl_host, $port); + $this->context_ = $context; + } - public function getSSLHost($host) - { - $transport_protocol_loc = strpos($host, "://"); - if ($transport_protocol_loc === false) { - $host = 'ssl://'.$host; + public function getSSLHost($host) + { + $transport_protocol_loc = strpos($host, "://"); + if ($transport_protocol_loc === false) { + $host = 'ssl://' . $host; + } + return $host; } - return $host; - } - /** - * Opens a new socket server handle - * - * @return void - */ - public function listen() - { - $this->listener_ = @stream_socket_server( - $this->host_ . ':' . $this->port_, - $errno, - $errstr, - STREAM_SERVER_BIND|STREAM_SERVER_LISTEN, - $this->context_); - } + /** + * Opens a new socket server handle + * + * @return void + */ + public function listen() + { + $this->listener_ = @stream_socket_server( + $this->host_ . ':' . $this->port_, + $errno, + $errstr, + STREAM_SERVER_BIND | STREAM_SERVER_LISTEN, + $this->context_ + ); + } - /** - * Implementation of accept. If not client is accepted in the given time - * - * @return TSocket - */ - protected function acceptImpl() - { - $handle = @stream_socket_accept($this->listener_, $this->acceptTimeout_ / 1000.0); - if(!$handle) return null; + /** + * Implementation of accept. If not client is accepted in the given time + * + * @return TSocket + */ + protected function acceptImpl() + { + $handle = @stream_socket_accept($this->listener_, $this->acceptTimeout_ / 1000.0); + if (!$handle) { + return null; + } - $socket = new TSSLSocket(); - $socket->setHandle($handle); + $socket = new TSSLSocket(); + $socket->setHandle($handle); - return $socket; - } + return $socket; + } } diff --git a/lib/php/lib/Server/TServer.php b/lib/php/lib/Server/TServer.php index f4d76cc15..268c37820 100644 --- a/lib/php/lib/Server/TServer.php +++ b/lib/php/lib/Server/TServer.php @@ -12,89 +12,91 @@ use Thrift\Factory\TProtocolFactory; */ abstract class TServer { - /** - * Processor to handle new clients - * - * @var TProcessor - */ - protected $processor_; + /** + * Processor to handle new clients + * + * @var TProcessor + */ + protected $processor_; - /** - * Server transport to be used for listening - * and accepting new clients - * - * @var TServerTransport - */ - protected $transport_; + /** + * Server transport to be used for listening + * and accepting new clients + * + * @var TServerTransport + */ + protected $transport_; - /** - * Input transport factory - * - * @var TTransportFactory - */ - protected $inputTransportFactory_; + /** + * Input transport factory + * + * @var TTransportFactory + */ + protected $inputTransportFactory_; - /** - * Output transport factory - * - * @var TTransportFactory - */ - protected $outputTransportFactory_; + /** + * Output transport factory + * + * @var TTransportFactory + */ + protected $outputTransportFactory_; - /** - * Input protocol factory - * - * @var TProtocolFactory - */ - protected $inputProtocolFactory_; + /** + * Input protocol factory + * + * @var TProtocolFactory + */ + protected $inputProtocolFactory_; - /** - * Output protocol factory - * - * @var TProtocolFactory - */ - protected $outputProtocolFactory_; + /** + * Output protocol factory + * + * @var TProtocolFactory + */ + protected $outputProtocolFactory_; - /** - * Sets up all the factories, etc - * - * @param object $processor - * @param TServerTransport $transport - * @param TTransportFactory $inputTransportFactory - * @param TTransportFactory $outputTransportFactory - * @param TProtocolFactory $inputProtocolFactory - * @param TProtocolFactory $outputProtocolFactory - * @return void - */ - public function __construct($processor, - TServerTransport $transport, - TTransportFactory $inputTransportFactory, - TTransportFactory $outputTransportFactory, - TProtocolFactory $inputProtocolFactory, - TProtocolFactory $outputProtocolFactory) { - $this->processor_ = $processor; - $this->transport_ = $transport; - $this->inputTransportFactory_ = $inputTransportFactory; - $this->outputTransportFactory_ = $outputTransportFactory; - $this->inputProtocolFactory_ = $inputProtocolFactory; - $this->outputProtocolFactory_ = $outputProtocolFactory; - } + /** + * Sets up all the factories, etc + * + * @param object $processor + * @param TServerTransport $transport + * @param TTransportFactory $inputTransportFactory + * @param TTransportFactory $outputTransportFactory + * @param TProtocolFactory $inputProtocolFactory + * @param TProtocolFactory $outputProtocolFactory + * @return void + */ + public function __construct( + $processor, + TServerTransport $transport, + TTransportFactory $inputTransportFactory, + TTransportFactory $outputTransportFactory, + TProtocolFactory $inputProtocolFactory, + TProtocolFactory $outputProtocolFactory + ) { + $this->processor_ = $processor; + $this->transport_ = $transport; + $this->inputTransportFactory_ = $inputTransportFactory; + $this->outputTransportFactory_ = $outputTransportFactory; + $this->inputProtocolFactory_ = $inputProtocolFactory; + $this->outputProtocolFactory_ = $outputProtocolFactory; + } - /** - * Serves the server. This should never return - * unless a problem permits it to do so or it - * is interrupted intentionally - * - * @abstract - * @return void - */ - abstract public function serve(); + /** + * Serves the server. This should never return + * unless a problem permits it to do so or it + * is interrupted intentionally + * + * @abstract + * @return void + */ + abstract public function serve(); - /** - * Stops the server serving - * - * @abstract - * @return void - */ - abstract public function stop(); + /** + * Stops the server serving + * + * @abstract + * @return void + */ + abstract public function stop(); } diff --git a/lib/php/lib/Server/TServerSocket.php b/lib/php/lib/Server/TServerSocket.php index da8e22683..8f38fb23f 100644 --- a/lib/php/lib/Server/TServerSocket.php +++ b/lib/php/lib/Server/TServerSocket.php @@ -31,92 +31,94 @@ use Thrift\Transport\TSocket; */ class TServerSocket extends TServerTransport { - /** - * Handle for the listener socket - * - * @var resource - */ - protected $listener_; + /** + * Handle for the listener socket + * + * @var resource + */ + protected $listener_; - /** - * Port for the listener to listen on - * - * @var int - */ - protected $port_; + /** + * Port for the listener to listen on + * + * @var int + */ + protected $port_; - /** - * Timeout when listening for a new client - * - * @var int - */ - protected $acceptTimeout_ = 30000; + /** + * Timeout when listening for a new client + * + * @var int + */ + protected $acceptTimeout_ = 30000; - /** - * Host to listen on - * - * @var string - */ - protected $host_; + /** + * Host to listen on + * + * @var string + */ + protected $host_; - /** - * ServerSocket constructor - * - * @param string $host Host to listen on - * @param int $port Port to listen on - * @return void - */ - public function __construct($host = 'localhost', $port = 9090) - { - $this->host_ = $host; - $this->port_ = $port; - } + /** + * ServerSocket constructor + * + * @param string $host Host to listen on + * @param int $port Port to listen on + * @return void + */ + public function __construct($host = 'localhost', $port = 9090) + { + $this->host_ = $host; + $this->port_ = $port; + } - /** - * Sets the accept timeout - * - * @param int $acceptTimeout - * @return void - */ - public function setAcceptTimeout($acceptTimeout) - { - $this->acceptTimeout_ = $acceptTimeout; - } + /** + * Sets the accept timeout + * + * @param int $acceptTimeout + * @return void + */ + public function setAcceptTimeout($acceptTimeout) + { + $this->acceptTimeout_ = $acceptTimeout; + } - /** - * Opens a new socket server handle - * - * @return void - */ - public function listen() - { - $this->listener_ = stream_socket_server('tcp://' . $this->host_ . ':' . $this->port_); - } + /** + * Opens a new socket server handle + * + * @return void + */ + public function listen() + { + $this->listener_ = stream_socket_server('tcp://' . $this->host_ . ':' . $this->port_); + } - /** - * Closes the socket server handle - * - * @return void - */ - public function close() - { - @fclose($this->listener_); - $this->listener_ = null; - } + /** + * Closes the socket server handle + * + * @return void + */ + public function close() + { + @fclose($this->listener_); + $this->listener_ = null; + } - /** - * Implementation of accept. If not client is accepted in the given time - * - * @return TSocket - */ - protected function acceptImpl() - { - $handle = @stream_socket_accept($this->listener_, $this->acceptTimeout_ / 1000.0); - if(!$handle) return null; + /** + * Implementation of accept. If not client is accepted in the given time + * + * @return TSocket + */ + protected function acceptImpl() + { + $handle = @stream_socket_accept($this->listener_, $this->acceptTimeout_ / 1000.0); + if (!$handle) { + return null; + } - $socket = new TSocket(); - $socket->setHandle($handle); + $socket = new TSocket(); + $socket->setHandle($handle); - return $socket; - } + return $socket; + } } diff --git a/lib/php/lib/Server/TServerTransport.php b/lib/php/lib/Server/TServerTransport.php index f82d06d1d..15a27afa8 100644 --- a/lib/php/lib/Server/TServerTransport.php +++ b/lib/php/lib/Server/TServerTransport.php @@ -11,46 +11,46 @@ use Thrift\Exception\TTransportException; */ abstract class TServerTransport { - /** - * List for new clients - * - * @abstract - * @return void - */ - abstract public function listen(); - - /** - * Close the server - * - * @abstract - * @return void - */ - abstract public function close(); - - /** - * Subclasses should use this to implement - * accept. - * - * @abstract - * @return TTransport - */ - abstract protected function acceptImpl(); - - /** - * Uses the accept implemtation. If null is returned, an - * exception is thrown. - * - * @throws TTransportException - * @return TTransport - */ - public function accept() - { - $transport = $this->acceptImpl(); - - if ($transport == null) { - throw new TTransportException("accept() may not return NULL"); + /** + * List for new clients + * + * @abstract + * @return void + */ + abstract public function listen(); + + /** + * Close the server + * + * @abstract + * @return void + */ + abstract public function close(); + + /** + * Subclasses should use this to implement + * accept. + * + * @abstract + * @return TTransport + */ + abstract protected function acceptImpl(); + + /** + * Uses the accept implemtation. If null is returned, an + * exception is thrown. + * + * @throws TTransportException + * @return TTransport + */ + public function accept() + { + $transport = $this->acceptImpl(); + + if ($transport == null) { + throw new TTransportException("accept() may not return NULL"); + } + + return $transport; } - - return $transport; - } } diff --git a/lib/php/lib/Server/TSimpleServer.php b/lib/php/lib/Server/TSimpleServer.php index e277700e8..4c1dda5a5 100644 --- a/lib/php/lib/Server/TSimpleServer.php +++ b/lib/php/lib/Server/TSimpleServer.php @@ -11,48 +11,50 @@ use Thrift\Exception\TTransportException; */ class TSimpleServer extends TServer { - /** - * Flag for the main serving loop - * - * @var bool - */ - private $stop_ = false; + /** + * Flag for the main serving loop + * + * @var bool + */ + private $stop_ = false; - /** - * Listens for new client using the supplied - * transport. It handles TTransportExceptions - * to avoid timeouts etc killing it - * - * @return void - */ - public function serve() - { - $this->transport_->listen(); + /** + * Listens for new client using the supplied + * transport. It handles TTransportExceptions + * to avoid timeouts etc killing it + * + * @return void + */ + public function serve() + { + $this->transport_->listen(); - while (!$this->stop_) { - try { - $transport = $this->transport_->accept(); + while (!$this->stop_) { + try { + $transport = $this->transport_->accept(); - if ($transport != null) { - $inputTransport = $this->inputTransportFactory_->getTransport($transport); - $outputTransport = $this->outputTransportFactory_->getTransport($transport); - $inputProtocol = $this->inputProtocolFactory_->getProtocol($inputTransport); - $outputProtocol = $this->outputProtocolFactory_->getProtocol($outputTransport); - while ($this->processor_->process($inputProtocol, $outputProtocol)) { } + if ($transport != null) { + $inputTransport = $this->inputTransportFactory_->getTransport($transport); + $outputTransport = $this->outputTransportFactory_->getTransport($transport); + $inputProtocol = $this->inputProtocolFactory_->getProtocol($inputTransport); + $outputProtocol = $this->outputProtocolFactory_->getProtocol($outputTransport); + while ($this->processor_->process($inputProtocol, $outputProtocol)) { + } + } + } catch (TTransportException $e) { + } } - } catch (TTransportException $e) { } } - } - /** - * Stops the server running. Kills the transport - * and then stops the main serving loop - * - * @return void - */ - public function stop() - { - $this->transport_->close(); - $this->stop_ = true; - } + /** + * Stops the server running. Kills the transport + * and then stops the main serving loop + * + * @return void + */ + public function stop() + { + $this->transport_->close(); + $this->stop_ = true; + } } diff --git a/lib/php/lib/StoredMessageProtocol.php b/lib/php/lib/StoredMessageProtocol.php index 476d9a685..c4aaaa9ec 100644 --- a/lib/php/lib/StoredMessageProtocol.php +++ b/lib/php/lib/StoredMessageProtocol.php @@ -32,7 +32,9 @@ use Thrift\Protocol\TProtocolDecorator; */ class StoredMessageProtocol extends TProtocolDecorator { - private $fname_, $mtype_, $rseqid_; + private $fname_; + private $mtype_; + private $rseqid_; public function __construct(TProtocol $protocol, $fname, $mtype, $rseqid) { diff --git a/lib/php/lib/TMultiplexedProcessor.php b/lib/php/lib/TMultiplexedProcessor.php index 0c2094d0c..a64a9687c 100644 --- a/lib/php/lib/TMultiplexedProcessor.php +++ b/lib/php/lib/TMultiplexedProcessor.php @@ -111,7 +111,8 @@ class TMultiplexedProcessor $processor = $this->serviceProcessorMap_[$serviceName]; return $processor->process( - new StoredMessageProtocol($input, $messageName, $mtype, $rseqid), $output + new StoredMessageProtocol($input, $messageName, $mtype, $rseqid), + $output ); } } diff --git a/lib/php/lib/Transport/TBufferedTransport.php b/lib/php/lib/Transport/TBufferedTransport.php index f654ad3ee..a541cbb51 100644 --- a/lib/php/lib/Transport/TBufferedTransport.php +++ b/lib/php/lib/Transport/TBufferedTransport.php @@ -33,149 +33,148 @@ use Thrift\Factory\TStringFuncFactory; */ class TBufferedTransport extends TTransport { - /** - * Constructor. Creates a buffered transport around an underlying transport - */ - public function __construct($transport=null, $rBufSize=512, $wBufSize=512) - { - $this->transport_ = $transport; - $this->rBufSize_ = $rBufSize; - $this->wBufSize_ = $wBufSize; - } - - /** - * The underlying transport - * - * @var TTransport - */ - protected $transport_ = null; - - /** - * The receive buffer size - * - * @var int - */ - protected $rBufSize_ = 512; - - /** - * The write buffer size - * - * @var int - */ - protected $wBufSize_ = 512; - - /** - * The write buffer. - * - * @var string - */ - protected $wBuf_ = ''; - - /** - * The read buffer. - * - * @var string - */ - protected $rBuf_ = ''; - - public function isOpen() - { - return $this->transport_->isOpen(); - } - - public function open() - { - $this->transport_->open(); - } - - public function close() - { - $this->transport_->close(); - } - - public function putBack($data) - { - if (TStringFuncFactory::create()->strlen($this->rBuf_) === 0) { - $this->rBuf_ = $data; - } else { - $this->rBuf_ = ($data . $this->rBuf_); + /** + * Constructor. Creates a buffered transport around an underlying transport + */ + public function __construct($transport = null, $rBufSize = 512, $wBufSize = 512) + { + $this->transport_ = $transport; + $this->rBufSize_ = $rBufSize; + $this->wBufSize_ = $wBufSize; } - } - - /** - * The reason that we customize readAll here is that the majority of PHP - * streams are already internally buffered by PHP. The socket stream, for - * example, buffers internally and blocks if you call read with $len greater - * than the amount of data available, unlike recv() in C. - * - * Therefore, use the readAll method of the wrapped transport inside - * the buffered readAll. - */ - public function readAll($len) - { - $have = TStringFuncFactory::create()->strlen($this->rBuf_); - if ($have == 0) { - $data = $this->transport_->readAll($len); - } elseif ($have < $len) { - $data = $this->rBuf_; - $this->rBuf_ = ''; - $data .= $this->transport_->readAll($len - $have); - } elseif ($have == $len) { - $data = $this->rBuf_; - $this->rBuf_ = ''; - } elseif ($have > $len) { - $data = TStringFuncFactory::create()->substr($this->rBuf_, 0, $len); - $this->rBuf_ = TStringFuncFactory::create()->substr($this->rBuf_, $len); + + /** + * The underlying transport + * + * @var TTransport + */ + protected $transport_ = null; + + /** + * The receive buffer size + * + * @var int + */ + protected $rBufSize_ = 512; + + /** + * The write buffer size + * + * @var int + */ + protected $wBufSize_ = 512; + + /** + * The write buffer. + * + * @var string + */ + protected $wBuf_ = ''; + + /** + * The read buffer. + * + * @var string + */ + protected $rBuf_ = ''; + + public function isOpen() + { + return $this->transport_->isOpen(); } - return $data; - } + public function open() + { + $this->transport_->open(); + } - public function read($len) - { - if (TStringFuncFactory::create()->strlen($this->rBuf_) === 0) { - $this->rBuf_ = $this->transport_->read($this->rBufSize_); + public function close() + { + $this->transport_->close(); } - if (TStringFuncFactory::create()->strlen($this->rBuf_) <= $len) { - $ret = $this->rBuf_; - $this->rBuf_ = ''; + public function putBack($data) + { + if (TStringFuncFactory::create()->strlen($this->rBuf_) === 0) { + $this->rBuf_ = $data; + } else { + $this->rBuf_ = ($data . $this->rBuf_); + } + } - return $ret; + /** + * The reason that we customize readAll here is that the majority of PHP + * streams are already internally buffered by PHP. The socket stream, for + * example, buffers internally and blocks if you call read with $len greater + * than the amount of data available, unlike recv() in C. + * + * Therefore, use the readAll method of the wrapped transport inside + * the buffered readAll. + */ + public function readAll($len) + { + $have = TStringFuncFactory::create()->strlen($this->rBuf_); + if ($have == 0) { + $data = $this->transport_->readAll($len); + } elseif ($have < $len) { + $data = $this->rBuf_; + $this->rBuf_ = ''; + $data .= $this->transport_->readAll($len - $have); + } elseif ($have == $len) { + $data = $this->rBuf_; + $this->rBuf_ = ''; + } elseif ($have > $len) { + $data = TStringFuncFactory::create()->substr($this->rBuf_, 0, $len); + $this->rBuf_ = TStringFuncFactory::create()->substr($this->rBuf_, $len); + } + + return $data; } - $ret = TStringFuncFactory::create()->substr($this->rBuf_, 0, $len); - $this->rBuf_ = TStringFuncFactory::create()->substr($this->rBuf_, $len); + public function read($len) + { + if (TStringFuncFactory::create()->strlen($this->rBuf_) === 0) { + $this->rBuf_ = $this->transport_->read($this->rBufSize_); + } - return $ret; - } + if (TStringFuncFactory::create()->strlen($this->rBuf_) <= $len) { + $ret = $this->rBuf_; + $this->rBuf_ = ''; - public function write($buf) - { - $this->wBuf_ .= $buf; - if (TStringFuncFactory::create()->strlen($this->wBuf_) >= $this->wBufSize_) { - $out = $this->wBuf_; + return $ret; + } - // Note that we clear the internal wBuf_ prior to the underlying write - // to ensure we're in a sane state (i.e. internal buffer cleaned) - // if the underlying write throws up an exception - $this->wBuf_ = ''; - $this->transport_->write($out); + $ret = TStringFuncFactory::create()->substr($this->rBuf_, 0, $len); + $this->rBuf_ = TStringFuncFactory::create()->substr($this->rBuf_, $len); + + return $ret; } - } - - public function flush() - { - if (TStringFuncFactory::create()->strlen($this->wBuf_) > 0) { - $out = $this->wBuf_; - - // Note that we clear the internal wBuf_ prior to the underlying write - // to ensure we're in a sane state (i.e. internal buffer cleaned) - // if the underlying write throws up an exception - $this->wBuf_ = ''; - $this->transport_->write($out); + + public function write($buf) + { + $this->wBuf_ .= $buf; + if (TStringFuncFactory::create()->strlen($this->wBuf_) >= $this->wBufSize_) { + $out = $this->wBuf_; + + // Note that we clear the internal wBuf_ prior to the underlying write + // to ensure we're in a sane state (i.e. internal buffer cleaned) + // if the underlying write throws up an exception + $this->wBuf_ = ''; + $this->transport_->write($out); + } } - $this->transport_->flush(); - } + public function flush() + { + if (TStringFuncFactory::create()->strlen($this->wBuf_) > 0) { + $out = $this->wBuf_; + + // Note that we clear the internal wBuf_ prior to the underlying write + // to ensure we're in a sane state (i.e. internal buffer cleaned) + // if the underlying write throws up an exception + $this->wBuf_ = ''; + $this->transport_->write($out); + } + $this->transport_->flush(); + } } diff --git a/lib/php/lib/Transport/TCurlClient.php b/lib/php/lib/Transport/TCurlClient.php index c761cd025..f51fa88ea 100644 --- a/lib/php/lib/Transport/TCurlClient.php +++ b/lib/php/lib/Transport/TCurlClient.php @@ -32,218 +32,217 @@ use Thrift\Factory\TStringFuncFactory; */ class TCurlClient extends TTransport { - private static $curlHandle; - - /** - * The host to connect to - * - * @var string - */ - protected $host_; - - /** - * The port to connect on - * - * @var int - */ - protected $port_; - - /** - * The URI to request - * - * @var string - */ - protected $uri_; - - /** - * The scheme to use for the request, i.e. http, https - * - * @var string - */ - protected $scheme_; - - /** - * Buffer for the HTTP request data - * - * @var string - */ - protected $request_; - - /** - * Buffer for the HTTP response data. - * - * @var binary string - */ - protected $response_; - - /** - * Read timeout - * - * @var float - */ - protected $timeout_; - - /** - * http headers - * - * @var array - */ - protected $headers_; - - /** - * Make a new HTTP client. - * - * @param string $host - * @param int $port - * @param string $uri - */ - public function __construct($host, $port=80, $uri='', $scheme = 'http') - { - if ((TStringFuncFactory::create()->strlen($uri) > 0) && ($uri{0} != '/')) { - $uri = '/'.$uri; + private static $curlHandle; + + /** + * The host to connect to + * + * @var string + */ + protected $host_; + + /** + * The port to connect on + * + * @var int + */ + protected $port_; + + /** + * The URI to request + * + * @var string + */ + protected $uri_; + + /** + * The scheme to use for the request, i.e. http, https + * + * @var string + */ + protected $scheme_; + + /** + * Buffer for the HTTP request data + * + * @var string + */ + protected $request_; + + /** + * Buffer for the HTTP response data. + * + * @var binary string + */ + protected $response_; + + /** + * Read timeout + * + * @var float + */ + protected $timeout_; + + /** + * http headers + * + * @var array + */ + protected $headers_; + + /** + * Make a new HTTP client. + * + * @param string $host + * @param int $port + * @param string $uri + */ + public function __construct($host, $port = 80, $uri = '', $scheme = 'http') + { + if ((TStringFuncFactory::create()->strlen($uri) > 0) && ($uri{0} != '/')) { + $uri = '/' . $uri; + } + $this->scheme_ = $scheme; + $this->host_ = $host; + $this->port_ = $port; + $this->uri_ = $uri; + $this->request_ = ''; + $this->response_ = null; + $this->timeout_ = null; + $this->headers_ = array(); } - $this->scheme_ = $scheme; - $this->host_ = $host; - $this->port_ = $port; - $this->uri_ = $uri; - $this->request_ = ''; - $this->response_ = null; - $this->timeout_ = null; - $this->headers_ = array(); - } - - /** - * Set read timeout - * - * @param float $timeout - */ - public function setTimeoutSecs($timeout) - { - $this->timeout_ = $timeout; - } - - /** - * Whether this transport is open. - * - * @return boolean true if open - */ - public function isOpen() - { - return true; - } - - /** - * Open the transport for reading/writing - * - * @throws TTransportException if cannot open - */ - public function open() - { - } - - /** - * Close the transport. - */ - public function close() - { - $this->request_ = ''; - $this->response_ = null; - } - - /** - * Read some data into the array. - * - * @param int $len How much to read - * @return string The data that has been read - * @throws TTransportException if cannot read any more data - */ - public function read($len) - { - if ($len >= strlen($this->response_)) { - return $this->response_; - } else { - $ret = substr($this->response_, 0, $len); - $this->response_ = substr($this->response_, $len); - - return $ret; + + /** + * Set read timeout + * + * @param float $timeout + */ + public function setTimeoutSecs($timeout) + { + $this->timeout_ = $timeout; } - } - - /** - * Writes some data into the pending buffer - * - * @param string $buf The data to write - * @throws TTransportException if writing fails - */ - public function write($buf) - { - $this->request_ .= $buf; - } - - /** - * Opens and sends the actual request over the HTTP connection - * - * @throws TTransportException if a writing error occurs - */ - public function flush() - { - if (!self::$curlHandle) { - register_shutdown_function(array('Thrift\\Transport\\TCurlClient', 'closeCurlHandle')); - self::$curlHandle = curl_init(); - curl_setopt(self::$curlHandle, CURLOPT_RETURNTRANSFER, true); - curl_setopt(self::$curlHandle, CURLOPT_BINARYTRANSFER, true); - curl_setopt(self::$curlHandle, CURLOPT_USERAGENT, 'PHP/TCurlClient'); - curl_setopt(self::$curlHandle, CURLOPT_CUSTOMREQUEST, 'POST'); - curl_setopt(self::$curlHandle, CURLOPT_FOLLOWLOCATION, true); - curl_setopt(self::$curlHandle, CURLOPT_MAXREDIRS, 1); + + /** + * Whether this transport is open. + * + * @return boolean true if open + */ + public function isOpen() + { + return true; } - // God, PHP really has some esoteric ways of doing simple things. - $host = $this->host_.($this->port_ != 80 ? ':'.$this->port_ : ''); - $fullUrl = $this->scheme_."://".$host.$this->uri_; - - $headers = array(); - $defaultHeaders = array('Accept' => 'application/x-thrift', - 'Content-Type' => 'application/x-thrift', - 'Content-Length' => TStringFuncFactory::create()->strlen($this->request_)); - foreach (array_merge($defaultHeaders, $this->headers_) as $key => $value) { - $headers[] = "$key: $value"; + + /** + * Open the transport for reading/writing + * + * @throws TTransportException if cannot open + */ + public function open() + { } - curl_setopt(self::$curlHandle, CURLOPT_HTTPHEADER, $headers); + /** + * Close the transport. + */ + public function close() + { + $this->request_ = ''; + $this->response_ = null; + } - if ($this->timeout_ > 0) { - curl_setopt(self::$curlHandle, CURLOPT_TIMEOUT, $this->timeout_); + /** + * Read some data into the array. + * + * @param int $len How much to read + * @return string The data that has been read + * @throws TTransportException if cannot read any more data + */ + public function read($len) + { + if ($len >= strlen($this->response_)) { + return $this->response_; + } else { + $ret = substr($this->response_, 0, $len); + $this->response_ = substr($this->response_, $len); + + return $ret; + } } - curl_setopt(self::$curlHandle, CURLOPT_POSTFIELDS, $this->request_); - $this->request_ = ''; - - curl_setopt(self::$curlHandle, CURLOPT_URL, $fullUrl); - $this->response_ = curl_exec(self::$curlHandle); - - // Connect failed? - if (!$this->response_) { - curl_close(self::$curlHandle); - self::$curlHandle = null; - $error = 'TCurlClient: Could not connect to '.$fullUrl; - throw new TTransportException($error, TTransportException::NOT_OPEN); + + /** + * Writes some data into the pending buffer + * + * @param string $buf The data to write + * @throws TTransportException if writing fails + */ + public function write($buf) + { + $this->request_ .= $buf; } - } - - public static function closeCurlHandle() - { - try { - if (self::$curlHandle) { - curl_close(self::$curlHandle); - self::$curlHandle = null; - } - } catch (\Exception $x) { - error_log('There was an error closing the curl handle: ' . $x->getMessage()); + + /** + * Opens and sends the actual request over the HTTP connection + * + * @throws TTransportException if a writing error occurs + */ + public function flush() + { + if (!self::$curlHandle) { + register_shutdown_function(array('Thrift\\Transport\\TCurlClient', 'closeCurlHandle')); + self::$curlHandle = curl_init(); + curl_setopt(self::$curlHandle, CURLOPT_RETURNTRANSFER, true); + curl_setopt(self::$curlHandle, CURLOPT_BINARYTRANSFER, true); + curl_setopt(self::$curlHandle, CURLOPT_USERAGENT, 'PHP/TCurlClient'); + curl_setopt(self::$curlHandle, CURLOPT_CUSTOMREQUEST, 'POST'); + curl_setopt(self::$curlHandle, CURLOPT_FOLLOWLOCATION, true); + curl_setopt(self::$curlHandle, CURLOPT_MAXREDIRS, 1); + } + // God, PHP really has some esoteric ways of doing simple things. + $host = $this->host_ . ($this->port_ != 80 ? ':' . $this->port_ : ''); + $fullUrl = $this->scheme_ . "://" . $host . $this->uri_; + + $headers = array(); + $defaultHeaders = array('Accept' => 'application/x-thrift', + 'Content-Type' => 'application/x-thrift', + 'Content-Length' => TStringFuncFactory::create()->strlen($this->request_)); + foreach (array_merge($defaultHeaders, $this->headers_) as $key => $value) { + $headers[] = "$key: $value"; + } + + curl_setopt(self::$curlHandle, CURLOPT_HTTPHEADER, $headers); + + if ($this->timeout_ > 0) { + curl_setopt(self::$curlHandle, CURLOPT_TIMEOUT, $this->timeout_); + } + curl_setopt(self::$curlHandle, CURLOPT_POSTFIELDS, $this->request_); + $this->request_ = ''; + + curl_setopt(self::$curlHandle, CURLOPT_URL, $fullUrl); + $this->response_ = curl_exec(self::$curlHandle); + + // Connect failed? + if (!$this->response_) { + curl_close(self::$curlHandle); + self::$curlHandle = null; + $error = 'TCurlClient: Could not connect to ' . $fullUrl; + throw new TTransportException($error, TTransportException::NOT_OPEN); + } } - } - public function addHeaders($headers) - { - $this->headers_ = array_merge($this->headers_, $headers); - } + public static function closeCurlHandle() + { + try { + if (self::$curlHandle) { + curl_close(self::$curlHandle); + self::$curlHandle = null; + } + } catch (\Exception $x) { + error_log('There was an error closing the curl handle: ' . $x->getMessage()); + } + } + public function addHeaders($headers) + { + $this->headers_ = array_merge($this->headers_, $headers); + } } diff --git a/lib/php/lib/Transport/TFramedTransport.php b/lib/php/lib/Transport/TFramedTransport.php index b8a64a9a9..39d186987 100644 --- a/lib/php/lib/Transport/TFramedTransport.php +++ b/lib/php/lib/Transport/TFramedTransport.php @@ -32,162 +32,161 @@ use Thrift\Factory\TStringFuncFactory; */ class TFramedTransport extends TTransport { - /** - * Underlying transport object. - * - * @var TTransport - */ - private $transport_; - - /** - * Buffer for read data. - * - * @var string - */ - private $rBuf_; - - /** - * Buffer for queued output data - * - * @var string - */ - private $wBuf_; - - /** - * Whether to frame reads - * - * @var bool - */ - private $read_; - - /** - * Whether to frame writes - * - * @var bool - */ - private $write_; - - /** - * Constructor. - * - * @param TTransport $transport Underlying transport - */ - public function __construct($transport=null, $read=true, $write=true) - { - $this->transport_ = $transport; - $this->read_ = $read; - $this->write_ = $write; - } - - public function isOpen() - { - return $this->transport_->isOpen(); - } - - public function open() - { - $this->transport_->open(); - } - - public function close() - { - $this->transport_->close(); - } - - /** - * Reads from the buffer. When more data is required reads another entire - * chunk and serves future reads out of that. - * - * @param int $len How much data - */ - public function read($len) - { - if (!$this->read_) { - return $this->transport_->read($len); + /** + * Underlying transport object. + * + * @var TTransport + */ + private $transport_; + + /** + * Buffer for read data. + * + * @var string + */ + private $rBuf_; + + /** + * Buffer for queued output data + * + * @var string + */ + private $wBuf_; + + /** + * Whether to frame reads + * + * @var bool + */ + private $read_; + + /** + * Whether to frame writes + * + * @var bool + */ + private $write_; + + /** + * Constructor. + * + * @param TTransport $transport Underlying transport + */ + public function __construct($transport = null, $read = true, $write = true) + { + $this->transport_ = $transport; + $this->read_ = $read; + $this->write_ = $write; } - if (TStringFuncFactory::create()->strlen($this->rBuf_) === 0) { - $this->readFrame(); + public function isOpen() + { + return $this->transport_->isOpen(); } - // Just return full buff - if ($len >= TStringFuncFactory::create()->strlen($this->rBuf_)) { - $out = $this->rBuf_; - $this->rBuf_ = null; - - return $out; + public function open() + { + $this->transport_->open(); } - // Return TStringFuncFactory::create()->substr - $out = TStringFuncFactory::create()->substr($this->rBuf_, 0, $len); - $this->rBuf_ = TStringFuncFactory::create()->substr($this->rBuf_, $len); - - return $out; - } - - /** - * Put previously read data back into the buffer - * - * @param string $data data to return - */ - public function putBack($data) - { - if (TStringFuncFactory::create()->strlen($this->rBuf_) === 0) { - $this->rBuf_ = $data; - } else { - $this->rBuf_ = ($data . $this->rBuf_); - } - } - - /** - * Reads a chunk of data into the internal read buffer. - */ - private function readFrame() - { - $buf = $this->transport_->readAll(4); - $val = unpack('N', $buf); - $sz = $val[1]; - - $this->rBuf_ = $this->transport_->readAll($sz); - } - - /** - * Writes some data to the pending output buffer. - * - * @param string $buf The data - * @param int $len Limit of bytes to write - */ - public function write($buf, $len=null) - { - if (!$this->write_) { - return $this->transport_->write($buf, $len); + public function close() + { + $this->transport_->close(); } - if ($len !== null && $len < TStringFuncFactory::create()->strlen($buf)) { - $buf = TStringFuncFactory::create()->substr($buf, 0, $len); + /** + * Reads from the buffer. When more data is required reads another entire + * chunk and serves future reads out of that. + * + * @param int $len How much data + */ + public function read($len) + { + if (!$this->read_) { + return $this->transport_->read($len); + } + + if (TStringFuncFactory::create()->strlen($this->rBuf_) === 0) { + $this->readFrame(); + } + + // Just return full buff + if ($len >= TStringFuncFactory::create()->strlen($this->rBuf_)) { + $out = $this->rBuf_; + $this->rBuf_ = null; + + return $out; + } + + // Return TStringFuncFactory::create()->substr + $out = TStringFuncFactory::create()->substr($this->rBuf_, 0, $len); + $this->rBuf_ = TStringFuncFactory::create()->substr($this->rBuf_, $len); + + return $out; } - $this->wBuf_ .= $buf; - } - - /** - * Writes the output buffer to the stream in the format of a 4-byte length - * followed by the actual data. - */ - public function flush() - { - if (!$this->write_ || TStringFuncFactory::create()->strlen($this->wBuf_) == 0) { - return $this->transport_->flush(); + + /** + * Put previously read data back into the buffer + * + * @param string $data data to return + */ + public function putBack($data) + { + if (TStringFuncFactory::create()->strlen($this->rBuf_) === 0) { + $this->rBuf_ = $data; + } else { + $this->rBuf_ = ($data . $this->rBuf_); + } } - $out = pack('N', TStringFuncFactory::create()->strlen($this->wBuf_)); - $out .= $this->wBuf_; + /** + * Reads a chunk of data into the internal read buffer. + */ + private function readFrame() + { + $buf = $this->transport_->readAll(4); + $val = unpack('N', $buf); + $sz = $val[1]; - // Note that we clear the internal wBuf_ prior to the underlying write - // to ensure we're in a sane state (i.e. internal buffer cleaned) - // if the underlying write throws up an exception - $this->wBuf_ = ''; - $this->transport_->write($out); - $this->transport_->flush(); - } + $this->rBuf_ = $this->transport_->readAll($sz); + } + /** + * Writes some data to the pending output buffer. + * + * @param string $buf The data + * @param int $len Limit of bytes to write + */ + public function write($buf, $len = null) + { + if (!$this->write_) { + return $this->transport_->write($buf, $len); + } + + if ($len !== null && $len < TStringFuncFactory::create()->strlen($buf)) { + $buf = TStringFuncFactory::create()->substr($buf, 0, $len); + } + $this->wBuf_ .= $buf; + } + + /** + * Writes the output buffer to the stream in the format of a 4-byte length + * followed by the actual data. + */ + public function flush() + { + if (!$this->write_ || TStringFuncFactory::create()->strlen($this->wBuf_) == 0) { + return $this->transport_->flush(); + } + + $out = pack('N', TStringFuncFactory::create()->strlen($this->wBuf_)); + $out .= $this->wBuf_; + + // Note that we clear the internal wBuf_ prior to the underlying write + // to ensure we're in a sane state (i.e. internal buffer cleaned) + // if the underlying write throws up an exception + $this->wBuf_ = ''; + $this->transport_->write($out); + $this->transport_->flush(); + } } diff --git a/lib/php/lib/Transport/THttpClient.php b/lib/php/lib/Transport/THttpClient.php index b372ab74a..a89794b08 100644 --- a/lib/php/lib/Transport/THttpClient.php +++ b/lib/php/lib/Transport/THttpClient.php @@ -32,198 +32,212 @@ use Thrift\Factory\TStringFuncFactory; */ class THttpClient extends TTransport { - /** - * The host to connect to - * - * @var string - */ - protected $host_; - - /** - * The port to connect on - * - * @var int - */ - protected $port_; - - /** - * The URI to request - * - * @var string - */ - protected $uri_; - - /** - * The scheme to use for the request, i.e. http, https - * - * @var string - */ - protected $scheme_; - - /** - * Buffer for the HTTP request data - * - * @var string - */ - protected $buf_; - - /** - * Input socket stream. - * - * @var resource - */ - protected $handle_; - - /** - * Read timeout - * - * @var float - */ - protected $timeout_; - - /** - * http headers - * - * @var array - */ - protected $headers_; - - /** - * Make a new HTTP client. - * - * @param string $host - * @param int $port - * @param string $uri - */ - public function __construct($host, $port=80, $uri='', $scheme = 'http') - { - if ((TStringFuncFactory::create()->strlen($uri) > 0) && ($uri{0} != '/')) { - $uri = '/'.$uri; + /** + * The host to connect to + * + * @var string + */ + protected $host_; + + /** + * The port to connect on + * + * @var int + */ + protected $port_; + + /** + * The URI to request + * + * @var string + */ + protected $uri_; + + /** + * The scheme to use for the request, i.e. http, https + * + * @var string + */ + protected $scheme_; + + /** + * Buffer for the HTTP request data + * + * @var string + */ + protected $buf_; + + /** + * Input socket stream. + * + * @var resource + */ + protected $handle_; + + /** + * Read timeout + * + * @var float + */ + protected $timeout_; + + /** + * http headers + * + * @var array + */ + protected $headers_; + + /** + * Make a new HTTP client. + * + * @param string $host + * @param int $port + * @param string $uri + */ + public function __construct($host, $port = 80, $uri = '', $scheme = 'http') + { + if ((TStringFuncFactory::create()->strlen($uri) > 0) && ($uri{0} != '/')) { + $uri = '/' . $uri; + } + $this->scheme_ = $scheme; + $this->host_ = $host; + $this->port_ = $port; + $this->uri_ = $uri; + $this->buf_ = ''; + $this->handle_ = null; + $this->timeout_ = null; + $this->headers_ = array(); } - $this->scheme_ = $scheme; - $this->host_ = $host; - $this->port_ = $port; - $this->uri_ = $uri; - $this->buf_ = ''; - $this->handle_ = null; - $this->timeout_ = null; - $this->headers_ = array(); - } - - /** - * Set read timeout - * - * @param float $timeout - */ - public function setTimeoutSecs($timeout) - { - $this->timeout_ = $timeout; - } - - /** - * Whether this transport is open. - * - * @return boolean true if open - */ - public function isOpen() - { - return true; - } - - /** - * Open the transport for reading/writing - * - * @throws TTransportException if cannot open - */ - public function open() {} - - /** - * Close the transport. - */ - public function close() - { - if ($this->handle_) { - @fclose($this->handle_); - $this->handle_ = null; + + /** + * Set read timeout + * + * @param float $timeout + */ + public function setTimeoutSecs($timeout) + { + $this->timeout_ = $timeout; } - } - - /** - * Read some data into the array. - * - * @param int $len How much to read - * @return string The data that has been read - * @throws TTransportException if cannot read any more data - */ - public function read($len) - { - $data = @fread($this->handle_, $len); - if ($data === FALSE || $data === '') { - $md = stream_get_meta_data($this->handle_); - if ($md['timed_out']) { - throw new TTransportException('THttpClient: timed out reading '.$len.' bytes from '.$this->host_.':'.$this->port_.$this->uri_, TTransportException::TIMED_OUT); - } else { - throw new TTransportException('THttpClient: Could not read '.$len.' bytes from '.$this->host_.':'.$this->port_.$this->uri_, TTransportException::UNKNOWN); - } + + /** + * Whether this transport is open. + * + * @return boolean true if open + */ + public function isOpen() + { + return true; } - return $data; - } - - /** - * Writes some data into the pending buffer - * - * @param string $buf The data to write - * @throws TTransportException if writing fails - */ - public function write($buf) - { - $this->buf_ .= $buf; - } - - /** - * Opens and sends the actual request over the HTTP connection - * - * @throws TTransportException if a writing error occurs - */ - public function flush() - { - // God, PHP really has some esoteric ways of doing simple things. - $host = $this->host_.($this->port_ != 80 ? ':'.$this->port_ : ''); - - $headers = array(); - $defaultHeaders = array('Host' => $host, - 'Accept' => 'application/x-thrift', - 'User-Agent' => 'PHP/THttpClient', - 'Content-Type' => 'application/x-thrift', - 'Content-Length' => TStringFuncFactory::create()->strlen($this->buf_)); - foreach (array_merge($defaultHeaders, $this->headers_) as $key => $value) { - $headers[] = "$key: $value"; + /** + * Open the transport for reading/writing + * + * @throws TTransportException if cannot open + */ + public function open() + { } - $options = array('method' => 'POST', - 'header' => implode("\r\n", $headers), - 'max_redirects' => 1, - 'content' => $this->buf_); - if ($this->timeout_ > 0) { - $options['timeout'] = $this->timeout_; + /** + * Close the transport. + */ + public function close() + { + if ($this->handle_) { + @fclose($this->handle_); + $this->handle_ = null; + } } - $this->buf_ = ''; - $contextid = stream_context_create(array('http' => $options)); - $this->handle_ = @fopen($this->scheme_.'://'.$host.$this->uri_, 'r', false, $contextid); + /** + * Read some data into the array. + * + * @param int $len How much to read + * @return string The data that has been read + * @throws TTransportException if cannot read any more data + */ + public function read($len) + { + $data = @fread($this->handle_, $len); + if ($data === false || $data === '') { + $md = stream_get_meta_data($this->handle_); + if ($md['timed_out']) { + throw new TTransportException( + 'THttpClient: timed out reading ' . $len . ' bytes from ' . + $this->host_ . ':' . $this->port_ . $this->uri_, + TTransportException::TIMED_OUT + ); + } else { + throw new TTransportException( + 'THttpClient: Could not read ' . $len . ' bytes from ' . + $this->host_ . ':' . $this->port_ . $this->uri_, + TTransportException::UNKNOWN + ); + } + } + + return $data; + } - // Connect failed? - if ($this->handle_ === FALSE) { - $this->handle_ = null; - $error = 'THttpClient: Could not connect to '.$host.$this->uri_; - throw new TTransportException($error, TTransportException::NOT_OPEN); + /** + * Writes some data into the pending buffer + * + * @param string $buf The data to write + * @throws TTransportException if writing fails + */ + public function write($buf) + { + $this->buf_ .= $buf; } - } - public function addHeaders($headers) - { - $this->headers_ = array_merge($this->headers_, $headers); - } + /** + * Opens and sends the actual request over the HTTP connection + * + * @throws TTransportException if a writing error occurs + */ + public function flush() + { + // God, PHP really has some esoteric ways of doing simple things. + $host = $this->host_ . ($this->port_ != 80 ? ':' . $this->port_ : ''); + + $headers = array(); + $defaultHeaders = array('Host' => $host, + 'Accept' => 'application/x-thrift', + 'User-Agent' => 'PHP/THttpClient', + 'Content-Type' => 'application/x-thrift', + 'Content-Length' => TStringFuncFactory::create()->strlen($this->buf_)); + foreach (array_merge($defaultHeaders, $this->headers_) as $key => $value) { + $headers[] = "$key: $value"; + } + + $options = array('method' => 'POST', + 'header' => implode("\r\n", $headers), + 'max_redirects' => 1, + 'content' => $this->buf_); + if ($this->timeout_ > 0) { + $options['timeout'] = $this->timeout_; + } + $this->buf_ = ''; + + $contextid = stream_context_create(array('http' => $options)); + $this->handle_ = @fopen( + $this->scheme_ . '://' . $host . $this->uri_, + 'r', + false, + $contextid + ); + + // Connect failed? + if ($this->handle_ === false) { + $this->handle_ = null; + $error = 'THttpClient: Could not connect to ' . $host . $this->uri_; + throw new TTransportException($error, TTransportException::NOT_OPEN); + } + } + public function addHeaders($headers) + { + $this->headers_ = array_merge($this->headers_, $headers); + } } diff --git a/lib/php/lib/Transport/TMemoryBuffer.php b/lib/php/lib/Transport/TMemoryBuffer.php index ca31c579f..fee03a2a4 100644 --- a/lib/php/lib/Transport/TMemoryBuffer.php +++ b/lib/php/lib/Transport/TMemoryBuffer.php @@ -35,66 +35,72 @@ use Thrift\Factory\TStringFuncFactory; */ class TMemoryBuffer extends TTransport { - /** - * Constructor. Optionally pass an initial value - * for the buffer. - */ - public function __construct($buf = '') - { - $this->buf_ = $buf; - } - - protected $buf_ = ''; - - public function isOpen() - { - return true; - } - - public function open() {} - - public function close() {} - - public function write($buf) - { - $this->buf_ .= $buf; - } - - public function read($len) - { - $bufLength = TStringFuncFactory::create()->strlen($this->buf_); - - if ($bufLength === 0) { - throw new TTransportException('TMemoryBuffer: Could not read ' . - $len . ' bytes from buffer.', - TTransportException::UNKNOWN); + /** + * Constructor. Optionally pass an initial value + * for the buffer. + */ + public function __construct($buf = '') + { + $this->buf_ = $buf; } - if ($bufLength <= $len) { - $ret = $this->buf_; - $this->buf_ = ''; + protected $buf_ = ''; - return $ret; + public function isOpen() + { + return true; } - $ret = TStringFuncFactory::create()->substr($this->buf_, 0, $len); - $this->buf_ = TStringFuncFactory::create()->substr($this->buf_, $len); + public function open() + { + } + + public function close() + { + } + + public function write($buf) + { + $this->buf_ .= $buf; + } + + public function read($len) + { + $bufLength = TStringFuncFactory::create()->strlen($this->buf_); + + if ($bufLength === 0) { + throw new TTransportException( + 'TMemoryBuffer: Could not read ' . + $len . ' bytes from buffer.', + TTransportException::UNKNOWN + ); + } - return $ret; - } + if ($bufLength <= $len) { + $ret = $this->buf_; + $this->buf_ = ''; - public function getBuffer() - { - return $this->buf_; - } + return $ret; + } - public function available() - { - return TStringFuncFactory::create()->strlen($this->buf_); - } + $ret = TStringFuncFactory::create()->substr($this->buf_, 0, $len); + $this->buf_ = TStringFuncFactory::create()->substr($this->buf_, $len); - public function putBack($data) - { - $this->buf_ = $data.$this->buf_; - } + return $ret; + } + + public function getBuffer() + { + return $this->buf_; + } + + public function available() + { + return TStringFuncFactory::create()->strlen($this->buf_); + } + + public function putBack($data) + { + $this->buf_ = $data . $this->buf_; + } } diff --git a/lib/php/lib/Transport/TNullTransport.php b/lib/php/lib/Transport/TNullTransport.php index feeb7a468..7e086b67c 100644 --- a/lib/php/lib/Transport/TNullTransport.php +++ b/lib/php/lib/Transport/TNullTransport.php @@ -32,20 +32,25 @@ use Thrift\Exception\TTransportException; */ class TNullTransport extends TTransport { - public function isOpen() - { - return true; - } - - public function open() {} - - public function close() {} - - public function read($len) - { - throw new TTransportException("Can't read from TNullTransport."); - } - - public function write($buf) {} - + public function isOpen() + { + return true; + } + + public function open() + { + } + + public function close() + { + } + + public function read($len) + { + throw new TTransportException("Can't read from TNullTransport."); + } + + public function write($buf) + { + } } diff --git a/lib/php/lib/Transport/TPhpStream.php b/lib/php/lib/Transport/TPhpStream.php index 4c14cdfe1..42823ff33 100644 --- a/lib/php/lib/Transport/TPhpStream.php +++ b/lib/php/lib/Transport/TPhpStream.php @@ -33,91 +33,92 @@ use Thrift\Factory\TStringFuncFactory; */ class TPhpStream extends TTransport { - const MODE_R = 1; - const MODE_W = 2; + const MODE_R = 1; + const MODE_W = 2; - private $inStream_ = null; + private $inStream_ = null; - private $outStream_ = null; + private $outStream_ = null; - private $read_ = false; + private $read_ = false; - private $write_ = false; + private $write_ = false; - public function __construct($mode) - { - $this->read_ = $mode & self::MODE_R; - $this->write_ = $mode & self::MODE_W; - } - - public function open() - { - if ($this->read_) { - $this->inStream_ = @fopen(self::inStreamName(), 'r'); - if (!is_resource($this->inStream_)) { - throw new TException('TPhpStream: Could not open php://input'); - } - } - if ($this->write_) { - $this->outStream_ = @fopen('php://output', 'w'); - if (!is_resource($this->outStream_)) { - throw new TException('TPhpStream: Could not open php://output'); - } + public function __construct($mode) + { + $this->read_ = $mode & self::MODE_R; + $this->write_ = $mode & self::MODE_W; } - } - public function close() - { - if ($this->read_) { - @fclose($this->inStream_); - $this->inStream_ = null; + public function open() + { + if ($this->read_) { + $this->inStream_ = @fopen(self::inStreamName(), 'r'); + if (!is_resource($this->inStream_)) { + throw new TException('TPhpStream: Could not open php://input'); + } + } + if ($this->write_) { + $this->outStream_ = @fopen('php://output', 'w'); + if (!is_resource($this->outStream_)) { + throw new TException('TPhpStream: Could not open php://output'); + } + } } - if ($this->write_) { - @fclose($this->outStream_); - $this->outStream_ = null; + + public function close() + { + if ($this->read_) { + @fclose($this->inStream_); + $this->inStream_ = null; + } + if ($this->write_) { + @fclose($this->outStream_); + $this->outStream_ = null; + } } - } - - public function isOpen() - { - return - (!$this->read_ || is_resource($this->inStream_)) && - (!$this->write_ || is_resource($this->outStream_)); - } - - public function read($len) - { - $data = @fread($this->inStream_, $len); - if ($data === FALSE || $data === '') { - throw new TException('TPhpStream: Could not read '.$len.' bytes'); + + public function isOpen() + { + return + (!$this->read_ || is_resource($this->inStream_)) && + (!$this->write_ || is_resource($this->outStream_)); } - return $data; - } - - public function write($buf) - { - while (TStringFuncFactory::create()->strlen($buf) > 0) { - $got = @fwrite($this->outStream_, $buf); - if ($got === 0 || $got === FALSE) { - throw new TException('TPhpStream: Could not write '.TStringFuncFactory::create()->strlen($buf).' bytes'); - } - $buf = TStringFuncFactory::create()->substr($buf, $got); + public function read($len) + { + $data = @fread($this->inStream_, $len); + if ($data === false || $data === '') { + throw new TException('TPhpStream: Could not read ' . $len . ' bytes'); + } + + return $data; } - } - public function flush() - { - @fflush($this->outStream_); - } + public function write($buf) + { + while (TStringFuncFactory::create()->strlen($buf) > 0) { + $got = @fwrite($this->outStream_, $buf); + if ($got === 0 || $got === false) { + throw new TException( + 'TPhpStream: Could not write ' . TStringFuncFactory::create()->strlen($buf) . ' bytes' + ); + } + $buf = TStringFuncFactory::create()->substr($buf, $got); + } + } - private static function inStreamName() - { - if (php_sapi_name() == 'cli') { - return 'php://stdin'; + public function flush() + { + @fflush($this->outStream_); } - return 'php://input'; - } + private static function inStreamName() + { + if (php_sapi_name() == 'cli') { + return 'php://stdin'; + } + return 'php://input'; + } } diff --git a/lib/php/lib/Transport/TSSLSocket.php b/lib/php/lib/Transport/TSSLSocket.php index 533b7bbfe..b4a0adb54 100644 --- a/lib/php/lib/Transport/TSSLSocket.php +++ b/lib/php/lib/Transport/TSSLSocket.php @@ -33,80 +33,85 @@ use Thrift\Factory\TStringFuncFactory; */ class TSSLSocket extends TSocket { - /** - * Remote port - * - * @var resource - */ - protected $context_ = null; + /** + * Remote port + * + * @var resource + */ + protected $context_ = null; - /** - * Socket constructor - * - * @param string $host Remote hostname - * @param int $port Remote port - * @param resource $context Stream context - * @param bool $persist Whether to use a persistent socket - * @param string $debugHandler Function to call for error logging - */ - public function __construct($host='localhost', - $port=9090, - $context=null, - $debugHandler=null) { - $this->host_ = $this->getSSLHost($host); - $this->port_ = $port; - $this->context_ = $context; - $this->debugHandler_ = $debugHandler ? $debugHandler : 'error_log'; - } - - /** - * Creates a host name with SSL transport protocol - * if no transport protocol already specified in - * the host name. - * - * @param string $host Host to listen on - * @return string $host Host name with transport protocol - */ - private function getSSLHost($host) - { - $transport_protocol_loc = strpos($host, "://"); - if ($transport_protocol_loc === false) { - $host = 'ssl://'.$host; + /** + * Socket constructor + * + * @param string $host Remote hostname + * @param int $port Remote port + * @param resource $context Stream context + * @param bool $persist Whether to use a persistent socket + * @param string $debugHandler Function to call for error logging + */ + public function __construct( + $host = 'localhost', + $port = 9090, + $context = null, + $debugHandler = null + ) { + $this->host_ = $this->getSSLHost($host); + $this->port_ = $port; + $this->context_ = $context; + $this->debugHandler_ = $debugHandler ? $debugHandler : 'error_log'; } - return $host; - } - /** - * Connects the socket. - */ - public function open() - { - if ($this->isOpen()) { - throw new TTransportException('Socket already connected', TTransportException::ALREADY_OPEN); + /** + * Creates a host name with SSL transport protocol + * if no transport protocol already specified in + * the host name. + * + * @param string $host Host to listen on + * @return string $host Host name with transport protocol + */ + private function getSSLHost($host) + { + $transport_protocol_loc = strpos($host, "://"); + if ($transport_protocol_loc === false) { + $host = 'ssl://' . $host; + } + return $host; } - if (empty($this->host_)) { - throw new TTransportException('Cannot open null host', TTransportException::NOT_OPEN); - } + /** + * Connects the socket. + */ + public function open() + { + if ($this->isOpen()) { + throw new TTransportException('Socket already connected', TTransportException::ALREADY_OPEN); + } - if ($this->port_ <= 0) { - throw new TTransportException('Cannot open without port', TTransportException::NOT_OPEN); - } + if (empty($this->host_)) { + throw new TTransportException('Cannot open null host', TTransportException::NOT_OPEN); + } + + if ($this->port_ <= 0) { + throw new TTransportException('Cannot open without port', TTransportException::NOT_OPEN); + } - $this->handle_ = @stream_socket_client($this->host_.':'.$this->port_, - $errno, - $errstr, - $this->sendTimeoutSec_ + ($this->sendTimeoutUsec_ / 1000000), - STREAM_CLIENT_CONNECT, - $this->context_); + $this->handle_ = @stream_socket_client( + $this->host_ . ':' . $this->port_, + $errno, + $errstr, + $this->sendTimeoutSec_ + ($this->sendTimeoutUsec_ / 1000000), + STREAM_CLIENT_CONNECT, + $this->context_ + ); - // Connect failed? - if ($this->handle_ === FALSE) { - $error = 'TSocket: Could not connect to '.$this->host_.':'.$this->port_.' ('.$errstr.' ['.$errno.'])'; - if ($this->debug_) { - call_user_func($this->debugHandler_, $error); - } - throw new TException($error); + // Connect failed? + if ($this->handle_ === false) { + $error = 'TSocket: Could not connect to ' . + $this->host_ . ':' . $this->port_ . ' (' . $errstr . ' [' . $errno . '])'; + if ($this->debug_) { + call_user_func($this->debugHandler_, $error); + } + throw new TException($error); + } } - } } diff --git a/lib/php/lib/Transport/TSocket.php b/lib/php/lib/Transport/TSocket.php index a1872b98b..93bd1cfb8 100644 --- a/lib/php/lib/Transport/TSocket.php +++ b/lib/php/lib/Transport/TSocket.php @@ -33,308 +33,333 @@ use Thrift\Factory\TStringFuncFactory; */ class TSocket extends TTransport { - /** - * Handle to PHP socket - * - * @var resource - */ - protected $handle_ = null; - - /** - * Remote hostname - * - * @var string - */ - protected $host_ = 'localhost'; - - /** - * Remote port - * - * @var int - */ - protected $port_ = '9090'; - - /** - * Send timeout in seconds. - * - * Combined with sendTimeoutUsec this is used for send timeouts. - * - * @var int - */ - protected $sendTimeoutSec_ = 0; - - /** - * Send timeout in microseconds. - * - * Combined with sendTimeoutSec this is used for send timeouts. - * - * @var int - */ - protected $sendTimeoutUsec_ = 100000; - - /** - * Recv timeout in seconds - * - * Combined with recvTimeoutUsec this is used for recv timeouts. - * - * @var int - */ - protected $recvTimeoutSec_ = 0; - - /** - * Recv timeout in microseconds - * - * Combined with recvTimeoutSec this is used for recv timeouts. - * - * @var int - */ - protected $recvTimeoutUsec_ = 750000; - - /** - * Persistent socket or plain? - * - * @var bool - */ - protected $persist_ = false; - - /** - * Debugging on? - * - * @var bool - */ - protected $debug_ = false; - - /** - * Debug handler - * - * @var mixed - */ - protected $debugHandler_ = null; - - /** - * Socket constructor - * - * @param string $host Remote hostname - * @param int $port Remote port - * @param bool $persist Whether to use a persistent socket - * @param string $debugHandler Function to call for error logging - */ - public function __construct($host='localhost', - $port=9090, - $persist=false, - $debugHandler=null) { - $this->host_ = $host; - $this->port_ = $port; - $this->persist_ = $persist; - $this->debugHandler_ = $debugHandler ? $debugHandler : 'error_log'; - } - - /** - * @param resource $handle - * @return void - */ - public function setHandle($handle) - { - $this->handle_ = $handle; - } - - /** - * Sets the send timeout. - * - * @param int $timeout Timeout in milliseconds. - */ - public function setSendTimeout($timeout) - { - $this->sendTimeoutSec_ = floor($timeout / 1000); - $this->sendTimeoutUsec_ = + /** + * Handle to PHP socket + * + * @var resource + */ + protected $handle_ = null; + + /** + * Remote hostname + * + * @var string + */ + protected $host_ = 'localhost'; + + /** + * Remote port + * + * @var int + */ + protected $port_ = '9090'; + + /** + * Send timeout in seconds. + * + * Combined with sendTimeoutUsec this is used for send timeouts. + * + * @var int + */ + protected $sendTimeoutSec_ = 0; + + /** + * Send timeout in microseconds. + * + * Combined with sendTimeoutSec this is used for send timeouts. + * + * @var int + */ + protected $sendTimeoutUsec_ = 100000; + + /** + * Recv timeout in seconds + * + * Combined with recvTimeoutUsec this is used for recv timeouts. + * + * @var int + */ + protected $recvTimeoutSec_ = 0; + + /** + * Recv timeout in microseconds + * + * Combined with recvTimeoutSec this is used for recv timeouts. + * + * @var int + */ + protected $recvTimeoutUsec_ = 750000; + + /** + * Persistent socket or plain? + * + * @var bool + */ + protected $persist_ = false; + + /** + * Debugging on? + * + * @var bool + */ + protected $debug_ = false; + + /** + * Debug handler + * + * @var mixed + */ + protected $debugHandler_ = null; + + /** + * Socket constructor + * + * @param string $host Remote hostname + * @param int $port Remote port + * @param bool $persist Whether to use a persistent socket + * @param string $debugHandler Function to call for error logging + */ + public function __construct( + $host = 'localhost', + $port = 9090, + $persist = false, + $debugHandler = null + ) { + $this->host_ = $host; + $this->port_ = $port; + $this->persist_ = $persist; + $this->debugHandler_ = $debugHandler ? $debugHandler : 'error_log'; + } + + /** + * @param resource $handle + * @return void + */ + public function setHandle($handle) + { + $this->handle_ = $handle; + } + + /** + * Sets the send timeout. + * + * @param int $timeout Timeout in milliseconds. + */ + public function setSendTimeout($timeout) + { + $this->sendTimeoutSec_ = floor($timeout / 1000); + $this->sendTimeoutUsec_ = ($timeout - ($this->sendTimeoutSec_ * 1000)) * 1000; - } - - /** - * Sets the receive timeout. - * - * @param int $timeout Timeout in milliseconds. - */ - public function setRecvTimeout($timeout) - { - $this->recvTimeoutSec_ = floor($timeout / 1000); - $this->recvTimeoutUsec_ = - ($timeout - ($this->recvTimeoutSec_ * 1000)) * 1000; - } - - /** - * Sets debugging output on or off - * - * @param bool $debug - */ - public function setDebug($debug) - { - $this->debug_ = $debug; - } - - /** - * Get the host that this socket is connected to - * - * @return string host - */ - public function getHost() - { - return $this->host_; - } - - /** - * Get the remote port that this socket is connected to - * - * @return int port - */ - public function getPort() - { - return $this->port_; - } - - /** - * Tests whether this is open - * - * @return bool true if the socket is open - */ - public function isOpen() - { - return is_resource($this->handle_); - } - - /** - * Connects the socket. - */ - public function open() - { - if ($this->isOpen()) { - throw new TTransportException('Socket already connected', TTransportException::ALREADY_OPEN); } - if (empty($this->host_)) { - throw new TTransportException('Cannot open null host', TTransportException::NOT_OPEN); + /** + * Sets the receive timeout. + * + * @param int $timeout Timeout in milliseconds. + */ + public function setRecvTimeout($timeout) + { + $this->recvTimeoutSec_ = floor($timeout / 1000); + $this->recvTimeoutUsec_ = + ($timeout - ($this->recvTimeoutSec_ * 1000)) * 1000; } - if ($this->port_ <= 0) { - throw new TTransportException('Cannot open without port', TTransportException::NOT_OPEN); + /** + * Sets debugging output on or off + * + * @param bool $debug + */ + public function setDebug($debug) + { + $this->debug_ = $debug; } - if ($this->persist_) { - $this->handle_ = @pfsockopen($this->host_, - $this->port_, - $errno, - $errstr, - $this->sendTimeoutSec_ + ($this->sendTimeoutUsec_ / 1000000)); - } else { - $this->handle_ = @fsockopen($this->host_, - $this->port_, - $errno, - $errstr, - $this->sendTimeoutSec_ + ($this->sendTimeoutUsec_ / 1000000)); + /** + * Get the host that this socket is connected to + * + * @return string host + */ + public function getHost() + { + return $this->host_; } - // Connect failed? - if ($this->handle_ === FALSE) { - $error = 'TSocket: Could not connect to '.$this->host_.':'.$this->port_.' ('.$errstr.' ['.$errno.'])'; - if ($this->debug_) { - call_user_func($this->debugHandler_, $error); - } - throw new TException($error); + /** + * Get the remote port that this socket is connected to + * + * @return int port + */ + public function getPort() + { + return $this->port_; } - if (function_exists('socket_import_stream') && function_exists('socket_set_option')) { - $socket = socket_import_stream($this->handle_); - socket_set_option($socket, SOL_TCP, TCP_NODELAY, 1); + /** + * Tests whether this is open + * + * @return bool true if the socket is open + */ + public function isOpen() + { + return is_resource($this->handle_); } - } - - /** - * Closes the socket. - */ - public function close() - { - @fclose($this->handle_); - $this->handle_ = null; - } - - /** - * Read from the socket at most $len bytes. - * - * This method will not wait for all the requested data, it will return as - * soon as any data is received. - * - * @param int $len Maximum number of bytes to read. - * @return string Binary data - */ - public function read($len) - { - $null = null; - $read = array($this->handle_); - $readable = @stream_select($read, $null, $null, $this->recvTimeoutSec_, $this->recvTimeoutUsec_); - - if ($readable > 0) { - $data = fread($this->handle_, $len); - if ($data === false) { - throw new TTransportException('TSocket: Could not read '.$len.' bytes from '. - $this->host_.':'.$this->port_); - } elseif ($data == '' && feof($this->handle_)) { - throw new TTransportException('TSocket read 0 bytes'); + + /** + * Connects the socket. + */ + public function open() + { + if ($this->isOpen()) { + throw new TTransportException('Socket already connected', TTransportException::ALREADY_OPEN); } - return $data; - } elseif ($readable === 0) { - throw new TTransportException('TSocket: timed out reading '.$len.' bytes from '. - $this->host_.':'.$this->port_); - } else { - throw new TTransportException('TSocket: Could not read '.$len.' bytes from '. - $this->host_.':'.$this->port_); - } - } + if (empty($this->host_)) { + throw new TTransportException('Cannot open null host', TTransportException::NOT_OPEN); + } - /** - * Write to the socket. - * - * @param string $buf The data to write - */ - public function write($buf) - { - $null = null; - $write = array($this->handle_); - - // keep writing until all the data has been written - while (TStringFuncFactory::create()->strlen($buf) > 0) { - // wait for stream to become available for writing - $writable = @stream_select($null, $write, $null, $this->sendTimeoutSec_, $this->sendTimeoutUsec_); - if ($writable > 0) { - // write buffer to stream - $written = fwrite($this->handle_, $buf); - if ($written === -1 || $written === false) { - throw new TTransportException('TSocket: Could not write '.TStringFuncFactory::create()->strlen($buf).' bytes '. - $this->host_.':'.$this->port_); + if ($this->port_ <= 0) { + throw new TTransportException('Cannot open without port', TTransportException::NOT_OPEN); } - // determine how much of the buffer is left to write - $buf = TStringFuncFactory::create()->substr($buf, $written); - } elseif ($writable === 0) { - throw new TTransportException('TSocket: timed out writing '.TStringFuncFactory::create()->strlen($buf).' bytes from '. - $this->host_.':'.$this->port_); + + if ($this->persist_) { + $this->handle_ = @pfsockopen( + $this->host_, + $this->port_, + $errno, + $errstr, + $this->sendTimeoutSec_ + ($this->sendTimeoutUsec_ / 1000000) + ); } else { - throw new TTransportException('TSocket: Could not write '.TStringFuncFactory::create()->strlen($buf).' bytes '. - $this->host_.':'.$this->port_); + $this->handle_ = @fsockopen( + $this->host_, + $this->port_, + $errno, + $errstr, + $this->sendTimeoutSec_ + ($this->sendTimeoutUsec_ / 1000000) + ); + } + + // Connect failed? + if ($this->handle_ === false) { + $error = 'TSocket: Could not connect to ' . + $this->host_ . ':' . $this->port_ . ' (' . $errstr . ' [' . $errno . '])'; + if ($this->debug_) { + call_user_func($this->debugHandler_, $error); + } + throw new TException($error); + } + + if (function_exists('socket_import_stream') && function_exists('socket_set_option')) { + $socket = socket_import_stream($this->handle_); + socket_set_option($socket, SOL_TCP, TCP_NODELAY, 1); + } + } + + /** + * Closes the socket. + */ + public function close() + { + @fclose($this->handle_); + $this->handle_ = null; + } + + /** + * Read from the socket at most $len bytes. + * + * This method will not wait for all the requested data, it will return as + * soon as any data is received. + * + * @param int $len Maximum number of bytes to read. + * @return string Binary data + */ + public function read($len) + { + $null = null; + $read = array($this->handle_); + $readable = @stream_select( + $read, + $null, + $null, + $this->recvTimeoutSec_, + $this->recvTimeoutUsec_ + ); + + if ($readable > 0) { + $data = fread($this->handle_, $len); + if ($data === false) { + throw new TTransportException('TSocket: Could not read ' . $len . ' bytes from ' . + $this->host_ . ':' . $this->port_); + } elseif ($data == '' && feof($this->handle_)) { + throw new TTransportException('TSocket read 0 bytes'); + } + + return $data; + } elseif ($readable === 0) { + throw new TTransportException('TSocket: timed out reading ' . $len . ' bytes from ' . + $this->host_ . ':' . $this->port_); + } else { + throw new TTransportException('TSocket: Could not read ' . $len . ' bytes from ' . + $this->host_ . ':' . $this->port_); + } + } + + /** + * Write to the socket. + * + * @param string $buf The data to write + */ + public function write($buf) + { + $null = null; + $write = array($this->handle_); + + // keep writing until all the data has been written + while (TStringFuncFactory::create()->strlen($buf) > 0) { + // wait for stream to become available for writing + $writable = @stream_select( + $null, + $write, + $null, + $this->sendTimeoutSec_, + $this->sendTimeoutUsec_ + ); + if ($writable > 0) { + // write buffer to stream + $written = fwrite($this->handle_, $buf); + if ($written === -1 || $written === false) { + throw new TTransportException( + 'TSocket: Could not write ' . TStringFuncFactory::create()->strlen($buf) . ' bytes ' . + $this->host_ . ':' . $this->port_ + ); + } + // determine how much of the buffer is left to write + $buf = TStringFuncFactory::create()->substr($buf, $written); + } elseif ($writable === 0) { + throw new TTransportException( + 'TSocket: timed out writing ' . TStringFuncFactory::create()->strlen($buf) . ' bytes from ' . + $this->host_ . ':' . $this->port_ + ); + } else { + throw new TTransportException( + 'TSocket: Could not write ' . TStringFuncFactory::create()->strlen($buf) . ' bytes ' . + $this->host_ . ':' . $this->port_ + ); + } } - } } - /** - * Flush output to the socket. - * - * Since read(), readAll() and write() operate on the sockets directly, - * this is a no-op - * - * If you wish to have flushable buffering behaviour, wrap this TSocket - * in a TBufferedTransport. - */ - public function flush() - { - // no-op + /** + * Flush output to the socket. + * + * Since read(), readAll() and write() operate on the sockets directly, + * this is a no-op + * + * If you wish to have flushable buffering behaviour, wrap this TSocket + * in a TBufferedTransport. + */ + public function flush() + { + // no-op } - } +} diff --git a/lib/php/lib/Transport/TSocketPool.php b/lib/php/lib/Transport/TSocketPool.php index 18ffd8d94..cb9e8ddfa 100644 --- a/lib/php/lib/Transport/TSocketPool.php +++ b/lib/php/lib/Transport/TSocketPool.php @@ -31,8 +31,15 @@ use Thrift\Exception\TException; * misses. */ if (!function_exists('apc_fetch')) { - function apc_fetch($key) { return FALSE; } - function apc_store($key, $var, $ttl=0) { return FALSE; } + function apc_fetch($key) + { + return false; + } + + function apc_store($key, $var, $ttl = 0) + { + return false; + } } /** @@ -43,258 +50,261 @@ if (!function_exists('apc_fetch')) { */ class TSocketPool extends TSocket { - /** - * Remote servers. Array of associative arrays with 'host' and 'port' keys - */ - private $servers_ = array(); - - /** - * How many times to retry each host in connect - * - * @var int - */ - private $numRetries_ = 1; - - /** - * Retry interval in seconds, how long to not try a host if it has been - * marked as down. - * - * @var int - */ - private $retryInterval_ = 60; - - /** - * Max consecutive failures before marking a host down. - * - * @var int - */ - private $maxConsecutiveFailures_ = 1; - - /** - * Try hosts in order? or Randomized? - * - * @var bool - */ - private $randomize_ = true; - - /** - * Always try last host, even if marked down? - * - * @var bool - */ - private $alwaysTryLast_ = true; - - /** - * Socket pool constructor - * - * @param array $hosts List of remote hostnames - * @param mixed $ports Array of remote ports, or a single common port - * @param bool $persist Whether to use a persistent socket - * @param mixed $debugHandler Function for error logging - */ - public function __construct($hosts=array('localhost'), - $ports=array(9090), - $persist=false, - $debugHandler=null) { - parent::__construct(null, 0, $persist, $debugHandler); - - if (!is_array($ports)) { - $port = $ports; - $ports = array(); - foreach ($hosts as $key => $val) { - $ports[$key] = $port; - } + /** + * Remote servers. Array of associative arrays with 'host' and 'port' keys + */ + private $servers_ = array(); + + /** + * How many times to retry each host in connect + * + * @var int + */ + private $numRetries_ = 1; + + /** + * Retry interval in seconds, how long to not try a host if it has been + * marked as down. + * + * @var int + */ + private $retryInterval_ = 60; + + /** + * Max consecutive failures before marking a host down. + * + * @var int + */ + private $maxConsecutiveFailures_ = 1; + + /** + * Try hosts in order? or Randomized? + * + * @var bool + */ + private $randomize_ = true; + + /** + * Always try last host, even if marked down? + * + * @var bool + */ + private $alwaysTryLast_ = true; + + /** + * Socket pool constructor + * + * @param array $hosts List of remote hostnames + * @param mixed $ports Array of remote ports, or a single common port + * @param bool $persist Whether to use a persistent socket + * @param mixed $debugHandler Function for error logging + */ + public function __construct( + $hosts = array('localhost'), + $ports = array(9090), + $persist = false, + $debugHandler = null + ) { + parent::__construct(null, 0, $persist, $debugHandler); + + if (!is_array($ports)) { + $port = $ports; + $ports = array(); + foreach ($hosts as $key => $val) { + $ports[$key] = $port; + } + } + + foreach ($hosts as $key => $host) { + $this->servers_ [] = array('host' => $host, + 'port' => $ports[$key]); + } + } + + /** + * Add a server to the pool + * + * This function does not prevent you from adding a duplicate server entry. + * + * @param string $host hostname or IP + * @param int $port port + */ + public function addServer($host, $port) + { + $this->servers_[] = array('host' => $host, 'port' => $port); + } + + /** + * Sets how many time to keep retrying a host in the connect function. + * + * @param int $numRetries + */ + public function setNumRetries($numRetries) + { + $this->numRetries_ = $numRetries; + } + + /** + * Sets how long to wait until retrying a host if it was marked down + * + * @param int $numRetries + */ + public function setRetryInterval($retryInterval) + { + $this->retryInterval_ = $retryInterval; } - foreach ($hosts as $key => $host) { - $this->servers_ []= array('host' => $host, - 'port' => $ports[$key]); + /** + * Sets how many time to keep retrying a host before marking it as down. + * + * @param int $numRetries + */ + public function setMaxConsecutiveFailures($maxConsecutiveFailures) + { + $this->maxConsecutiveFailures_ = $maxConsecutiveFailures; } - } - - /** - * Add a server to the pool - * - * This function does not prevent you from adding a duplicate server entry. - * - * @param string $host hostname or IP - * @param int $port port - */ - public function addServer($host, $port) - { - $this->servers_[] = array('host' => $host, 'port' => $port); - } - - /** - * Sets how many time to keep retrying a host in the connect function. - * - * @param int $numRetries - */ - public function setNumRetries($numRetries) - { - $this->numRetries_ = $numRetries; - } - - /** - * Sets how long to wait until retrying a host if it was marked down - * - * @param int $numRetries - */ - public function setRetryInterval($retryInterval) - { - $this->retryInterval_ = $retryInterval; - } - - /** - * Sets how many time to keep retrying a host before marking it as down. - * - * @param int $numRetries - */ - public function setMaxConsecutiveFailures($maxConsecutiveFailures) - { - $this->maxConsecutiveFailures_ = $maxConsecutiveFailures; - } - - /** - * Turns randomization in connect order on or off. - * - * @param bool $randomize - */ - public function setRandomize($randomize) - { - $this->randomize_ = $randomize; - } - - /** - * Whether to always try the last server. - * - * @param bool $alwaysTryLast - */ - public function setAlwaysTryLast($alwaysTryLast) - { - $this->alwaysTryLast_ = $alwaysTryLast; - } - - /** - * Connects the socket by iterating through all the servers in the pool - * and trying to find one that works. - */ - public function open() - { - // Check if we want order randomization - if ($this->randomize_) { - shuffle($this->servers_); + + /** + * Turns randomization in connect order on or off. + * + * @param bool $randomize + */ + public function setRandomize($randomize) + { + $this->randomize_ = $randomize; } - // Count servers to identify the "last" one - $numServers = count($this->servers_); + /** + * Whether to always try the last server. + * + * @param bool $alwaysTryLast + */ + public function setAlwaysTryLast($alwaysTryLast) + { + $this->alwaysTryLast_ = $alwaysTryLast; + } - for ($i = 0; $i < $numServers; ++$i) { + /** + * Connects the socket by iterating through all the servers in the pool + * and trying to find one that works. + */ + public function open() + { + // Check if we want order randomization + if ($this->randomize_) { + shuffle($this->servers_); + } - // This extracts the $host and $port variables - extract($this->servers_[$i]); + // Count servers to identify the "last" one + $numServers = count($this->servers_); - // Check APC cache for a record of this server being down - $failtimeKey = 'thrift_failtime:'.$host.':'.$port.'~'; + for ($i = 0; $i < $numServers; ++$i) { + // This extracts the $host and $port variables + extract($this->servers_[$i]); - // Cache miss? Assume it's OK - $lastFailtime = apc_fetch($failtimeKey); - if ($lastFailtime === FALSE) { - $lastFailtime = 0; - } + // Check APC cache for a record of this server being down + $failtimeKey = 'thrift_failtime:' . $host . ':' . $port . '~'; - $retryIntervalPassed = false; + // Cache miss? Assume it's OK + $lastFailtime = apc_fetch($failtimeKey); + if ($lastFailtime === false) { + $lastFailtime = 0; + } - // Cache hit...make sure enough the retry interval has elapsed - if ($lastFailtime > 0) { - $elapsed = time() - $lastFailtime; - if ($elapsed > $this->retryInterval_) { - $retryIntervalPassed = true; - if ($this->debug_) { - call_user_func($this->debugHandler_, - 'TSocketPool: retryInterval '. - '('.$this->retryInterval_.') '. - 'has passed for host '.$host.':'.$port); - } - } - } - - // Only connect if not in the middle of a fail interval, OR if this - // is the LAST server we are trying, just hammer away on it - $isLastServer = false; - if ($this->alwaysTryLast_) { - $isLastServer = ($i == ($numServers - 1)); - } - - if (($lastFailtime === 0) || - ($isLastServer) || - ($lastFailtime > 0 && $retryIntervalPassed)) { - - // Set underlying TSocket params to this one - $this->host_ = $host; - $this->port_ = $port; - - // Try up to numRetries_ connections per server - for ($attempt = 0; $attempt < $this->numRetries_; $attempt++) { - try { - // Use the underlying TSocket open function - parent::open(); - - // Only clear the failure counts if required to do so + $retryIntervalPassed = false; + + // Cache hit...make sure enough the retry interval has elapsed if ($lastFailtime > 0) { - apc_store($failtimeKey, 0); + $elapsed = time() - $lastFailtime; + if ($elapsed > $this->retryInterval_) { + $retryIntervalPassed = true; + if ($this->debug_) { + call_user_func( + $this->debugHandler_, + 'TSocketPool: retryInterval ' . + '(' . $this->retryInterval_ . ') ' . + 'has passed for host ' . $host . ':' . $port + ); + } + } } - // Successful connection, return now - return; + // Only connect if not in the middle of a fail interval, OR if this + // is the LAST server we are trying, just hammer away on it + $isLastServer = false; + if ($this->alwaysTryLast_) { + $isLastServer = ($i == ($numServers - 1)); + } - } catch (TException $tx) { - // Connection failed - } + if (($lastFailtime === 0) || + ($isLastServer) || + ($lastFailtime > 0 && $retryIntervalPassed)) { + // Set underlying TSocket params to this one + $this->host_ = $host; + $this->port_ = $port; + + // Try up to numRetries_ connections per server + for ($attempt = 0; $attempt < $this->numRetries_; $attempt++) { + try { + // Use the underlying TSocket open function + parent::open(); + + // Only clear the failure counts if required to do so + if ($lastFailtime > 0) { + apc_store($failtimeKey, 0); + } + + // Successful connection, return now + return; + } catch (TException $tx) { + // Connection failed + } + } + + // Mark failure of this host in the cache + $consecfailsKey = 'thrift_consecfails:' . $host . ':' . $port . '~'; + + // Ignore cache misses + $consecfails = apc_fetch($consecfailsKey); + if ($consecfails === false) { + $consecfails = 0; + } + + // Increment by one + $consecfails++; + + // Log and cache this failure + if ($consecfails >= $this->maxConsecutiveFailures_) { + if ($this->debug_) { + call_user_func( + $this->debugHandler_, + 'TSocketPool: marking ' . $host . ':' . $port . + ' as down for ' . $this->retryInterval_ . ' secs ' . + 'after ' . $consecfails . ' failed attempts.' + ); + } + // Store the failure time + apc_store($failtimeKey, time()); + + // Clear the count of consecutive failures + apc_store($consecfailsKey, 0); + } else { + apc_store($consecfailsKey, $consecfails); + } + } } - // Mark failure of this host in the cache - $consecfailsKey = 'thrift_consecfails:'.$host.':'.$port.'~'; - - // Ignore cache misses - $consecfails = apc_fetch($consecfailsKey); - if ($consecfails === FALSE) { - $consecfails = 0; + // Oh no; we failed them all. The system is totally ill! + $error = 'TSocketPool: All hosts in pool are down. '; + $hosts = array(); + foreach ($this->servers_ as $server) { + $hosts [] = $server['host'] . ':' . $server['port']; } - - // Increment by one - $consecfails++; - - // Log and cache this failure - if ($consecfails >= $this->maxConsecutiveFailures_) { - if ($this->debug_) { - call_user_func($this->debugHandler_, - 'TSocketPool: marking '.$host.':'.$port. - ' as down for '.$this->retryInterval_.' secs '. - 'after '.$consecfails.' failed attempts.'); - } - // Store the failure time - apc_store($failtimeKey, time()); - - // Clear the count of consecutive failures - apc_store($consecfailsKey, 0); - } else { - apc_store($consecfailsKey, $consecfails); + $hostlist = implode(',', $hosts); + $error .= '(' . $hostlist . ')'; + if ($this->debug_) { + call_user_func($this->debugHandler_, $error); } - } - } - - // Oh no; we failed them all. The system is totally ill! - $error = 'TSocketPool: All hosts in pool are down. '; - $hosts = array(); - foreach ($this->servers_ as $server) { - $hosts []= $server['host'].':'.$server['port']; - } - $hostlist = implode(',', $hosts); - $error .= '('.$hostlist.')'; - if ($this->debug_) { - call_user_func($this->debugHandler_, $error); + throw new TException($error); } - throw new TException($error); - } } diff --git a/lib/php/lib/Transport/TTransport.php b/lib/php/lib/Transport/TTransport.php index 99c39ff37..df248f2cc 100644 --- a/lib/php/lib/Transport/TTransport.php +++ b/lib/php/lib/Transport/TTransport.php @@ -31,65 +31,67 @@ use Thrift\Factory\TStringFuncFactory; */ abstract class TTransport { - /** - * Whether this transport is open. - * - * @return boolean true if open - */ - abstract public function isOpen(); + /** + * Whether this transport is open. + * + * @return boolean true if open + */ + abstract public function isOpen(); - /** - * Open the transport for reading/writing - * - * @throws TTransportException if cannot open - */ - abstract public function open(); + /** + * Open the transport for reading/writing + * + * @throws TTransportException if cannot open + */ + abstract public function open(); - /** - * Close the transport. - */ - abstract public function close(); + /** + * Close the transport. + */ + abstract public function close(); - /** - * Read some data into the array. - * - * @param int $len How much to read - * @return string The data that has been read - * @throws TTransportException if cannot read any more data - */ - abstract public function read($len); + /** + * Read some data into the array. + * + * @param int $len How much to read + * @return string The data that has been read + * @throws TTransportException if cannot read any more data + */ + abstract public function read($len); - /** - * Guarantees that the full amount of data is read. - * - * @return string The data, of exact length - * @throws TTransportException if cannot read data - */ - public function readAll($len) - { - // return $this->read($len); + /** + * Guarantees that the full amount of data is read. + * + * @return string The data, of exact length + * @throws TTransportException if cannot read data + */ + public function readAll($len) + { + // return $this->read($len); - $data = ''; - $got = 0; - while (($got = TStringFuncFactory::create()->strlen($data)) < $len) { - $data .= $this->read($len - $got); - } + $data = ''; + $got = 0; + while (($got = TStringFuncFactory::create()->strlen($data)) < $len) { + $data .= $this->read($len - $got); + } - return $data; - } + return $data; + } - /** - * Writes the given data out. - * - * @param string $buf The data to write - * @throws TTransportException if writing fails - */ - abstract public function write($buf); + /** + * Writes the given data out. + * + * @param string $buf The data to write + * @throws TTransportException if writing fails + */ + abstract public function write($buf); - /** - * Flushes any pending data out of a buffer - * - * @throws TTransportException if a writing error occurs - */ - public function flush() {} + /** + * Flushes any pending data out of a buffer + * + * @throws TTransportException if a writing error occurs + */ + public function flush() + { + } } diff --git a/lib/php/lib/Type/TConstant.php b/lib/php/lib/Type/TConstant.php index 7c8eceb03..215da4a3d 100644 --- a/lib/php/lib/Type/TConstant.php +++ b/lib/php/lib/Type/TConstant.php @@ -30,7 +30,9 @@ abstract class TConstant /** * Don't instanciate this class */ - protected function __construct() {} + protected function __construct() + { + } /** * Get a constant value @@ -41,8 +43,8 @@ abstract class TConstant { if (is_null(static::$$constant)) { static::$$constant = call_user_func( - sprintf('static::init_%s', $constant) - ); + sprintf('static::init_%s', $constant) + ); } return static::$$constant; diff --git a/lib/php/lib/Type/TMessageType.php b/lib/php/lib/Type/TMessageType.php index bff224f88..dc9ae6284 100644 --- a/lib/php/lib/Type/TMessageType.php +++ b/lib/php/lib/Type/TMessageType.php @@ -27,8 +27,8 @@ namespace Thrift\Type; */ class TMessageType { - const CALL = 1; - const REPLY = 2; - const EXCEPTION = 3; - const ONEWAY = 4; + const CALL = 1; + const REPLY = 2; + const EXCEPTION = 3; + const ONEWAY = 4; } diff --git a/lib/php/lib/Type/TType.php b/lib/php/lib/Type/TType.php index 71219c249..3fdb15f53 100644 --- a/lib/php/lib/Type/TType.php +++ b/lib/php/lib/Type/TType.php @@ -27,21 +27,21 @@ namespace Thrift\Type; */ class TType { - const STOP = 0; - const VOID = 1; - const BOOL = 2; - const BYTE = 3; - const I08 = 3; - const DOUBLE = 4; - const I16 = 6; - const I32 = 8; - const I64 = 10; - const STRING = 11; - const UTF7 = 11; - const STRUCT = 12; - const MAP = 13; - const SET = 14; - const LST = 15; // N.B. cannot use LIST keyword in PHP! - const UTF8 = 16; - const UTF16 = 17; + const STOP = 0; + const VOID = 1; + const BOOL = 2; + const BYTE = 3; + const I08 = 3; + const DOUBLE = 4; + const I16 = 6; + const I32 = 8; + const I64 = 10; + const STRING = 11; + const UTF7 = 11; + const STRUCT = 12; + const MAP = 13; + const SET = 14; + const LST = 15; // N.B. cannot use LIST keyword in PHP! + const UTF8 = 16; + const UTF16 = 17; } diff --git a/phpcs.xml.dist b/phpcs.xml.dist new file mode 100644 index 000000000..9c65eaf98 --- /dev/null +++ b/phpcs.xml.dist @@ -0,0 +1,18 @@ +<?xml version="1.0"?> +<ruleset name="PHP_CodeSniffer"> + <description>The coding standard for PHP_CodeSniffer itself.</description> + + <file>lib/php/lib</file> + + <exclude-pattern>*/Standards/*/Tests/*\.(inc|css|js)</exclude-pattern> + + <arg name="basepath" value="."/> + <arg name="colors" /> + <arg name="parallel" value="4" /> + + <rule ref="PSR2"> + <exclude name="PSR2.Methods.MethodDeclaration.Underscore"/> + <exclude name="PSR2.Classes.PropertyDeclaration.Underscore"/> + </rule> + +</ruleset> |