// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r
// OF THE POSSIBILITY OF SUCH DAMAGE.\r
\r
- // G. Giunta 2005/01/29: declare global these variables,\r
- // so that xmlrpc.inc will work even if included from within a function\r
- // Milosch: 2005/08/07 - explicitly request these via $GLOBALS where used.\r
- $GLOBALS['xmlrpcI4']='i4';\r
- $GLOBALS['xmlrpcInt']='int';\r
- $GLOBALS['xmlrpcBoolean']='boolean';\r
- $GLOBALS['xmlrpcDouble']='double';\r
- $GLOBALS['xmlrpcString']='string';\r
- $GLOBALS['xmlrpcDateTime']='dateTime.iso8601';\r
- $GLOBALS['xmlrpcBase64']='base64';\r
- $GLOBALS['xmlrpcArray']='array';\r
- $GLOBALS['xmlrpcStruct']='struct';\r
- $GLOBALS['xmlrpcValue']='undefined';\r
-\r
- $GLOBALS['xmlrpcTypes']=array(\r
- $GLOBALS['xmlrpcI4'] => 1,\r
- $GLOBALS['xmlrpcInt'] => 1,\r
- $GLOBALS['xmlrpcBoolean'] => 1,\r
- $GLOBALS['xmlrpcString'] => 1,\r
- $GLOBALS['xmlrpcDouble'] => 1,\r
- $GLOBALS['xmlrpcDateTime'] => 1,\r
- $GLOBALS['xmlrpcBase64'] => 1,\r
- $GLOBALS['xmlrpcArray'] => 2,\r
- $GLOBALS['xmlrpcStruct'] => 3\r
- );\r
-\r
- $GLOBALS['xmlrpc_valid_parents'] = array(\r
+class Xmlrpc {\r
+\r
+ public $xmlrpcI4 = "i4";\r
+ public $xmlrpcInt = "int";\r
+ public $xmlrpcBoolean = "boolean";\r
+ public $xmlrpcDouble = "double";\r
+ public $xmlrpcString = "string";\r
+ public $xmlrpcDateTime = "dateTime.iso8601";\r
+ public $xmlrpcBase64 = "base64";\r
+ public $xmlrpcArray = "array";\r
+ public $xmlrpcStruct = "struct";\r
+ public $xmlrpcValue = "undefined";\r
+ public $xmlrpcNull = "null";\r
+\r
+ public $xmlrpcTypes;\r
+\r
+ public $xmlrpc_valid_parents = array(\r
'VALUE' => array('MEMBER', 'DATA', 'PARAM', 'FAULT'),\r
'BOOLEAN' => array('VALUE'),\r
'I4' => array('VALUE'),\r
'EX:NIL' => array('VALUE') // only used when extension activated\r
);\r
\r
- // define extra types for supporting NULL (useful for json or <NIL/>)\r
- $GLOBALS['xmlrpcNull']='null';\r
- $GLOBALS['xmlrpcTypes']['null']=1;\r
-\r
// tables used for transcoding different charsets into us-ascii xml\r
-\r
- $GLOBALS['xml_iso88591_Entities']=array();\r
- $GLOBALS['xml_iso88591_Entities']['in'] = array();\r
- $GLOBALS['xml_iso88591_Entities']['out'] = array();\r
- for ($i = 0; $i < 32; $i++)\r
- {\r
- $GLOBALS['xml_iso88591_Entities']['in'][] = chr($i);\r
- $GLOBALS['xml_iso88591_Entities']['out'][] = '&#'.$i.';';\r
- }\r
- for ($i = 160; $i < 256; $i++)\r
- {\r
- $GLOBALS['xml_iso88591_Entities']['in'][] = chr($i);\r
- $GLOBALS['xml_iso88591_Entities']['out'][] = '&#'.$i.';';\r
- }\r
+ public $xml_iso88591_Entities = array("in" => array(), "out" => array());\r
\r
/// @todo add to iso table the characters from cp_1252 range, i.e. 128 to 159?\r
/// These will NOT be present in true ISO-8859-1, but will save the unwary\r
/// windows user from sending junk (though no luck when reciving them...)\r
- /*\r
+ /*\r
$GLOBALS['xml_cp1252_Entities']=array();\r
for ($i = 128; $i < 160; $i++)\r
{\r
'˜', '™', 'š', '›',\r
'œ', '?', 'ž', 'Ÿ'\r
);\r
- */\r
-\r
- $GLOBALS['xmlrpcerr'] = array(\r
- 'unknown_method'=>1,\r
- 'invalid_return'=>2,\r
- 'incorrect_params'=>3,\r
- 'introspect_unknown'=>4,\r
- 'http_error'=>5,\r
- 'no_data'=>6,\r
- 'no_ssl'=>7,\r
- 'curl_fail'=>8,\r
- 'invalid_request'=>15,\r
- 'no_curl'=>16,\r
- 'server_error'=>17,\r
- 'multicall_error'=>18,\r
- 'multicall_notstruct'=>9,\r
- 'multicall_nomethod'=>10,\r
- 'multicall_notstring'=>11,\r
- 'multicall_recursion'=>12,\r
- 'multicall_noparams'=>13,\r
- 'multicall_notarray'=>14,\r
-\r
- 'cannot_decompress'=>103,\r
- 'decompress_fail'=>104,\r
- 'dechunk_fail'=>105,\r
- 'server_cannot_decompress'=>106,\r
- 'server_decompress_fail'=>107\r
+ */\r
+\r
+ public $xmlrpcerr = array(\r
+ 'unknown_method'=>1,\r
+ 'invalid_return'=>2,\r
+ 'incorrect_params'=>3,\r
+ 'introspect_unknown'=>4,\r
+ 'http_error'=>5,\r
+ 'no_data'=>6,\r
+ 'no_ssl'=>7,\r
+ 'curl_fail'=>8,\r
+ 'invalid_request'=>15,\r
+ 'no_curl'=>16,\r
+ 'server_error'=>17,\r
+ 'multicall_error'=>18,\r
+ 'multicall_notstruct'=>9,\r
+ 'multicall_nomethod'=>10,\r
+ 'multicall_notstring'=>11,\r
+ 'multicall_recursion'=>12,\r
+ 'multicall_noparams'=>13,\r
+ 'multicall_notarray'=>14,\r
+\r
+ 'cannot_decompress'=>103,\r
+ 'decompress_fail'=>104,\r
+ 'dechunk_fail'=>105,\r
+ 'server_cannot_decompress'=>106,\r
+ 'server_decompress_fail'=>107\r
);\r
\r
- $GLOBALS['xmlrpcstr'] = array(\r
- 'unknown_method'=>'Unknown method',\r
- 'invalid_return'=>'Invalid return payload: enable debugging to examine incoming payload',\r
- 'incorrect_params'=>'Incorrect parameters passed to method',\r
- 'introspect_unknown'=>"Can't introspect: method unknown",\r
- 'http_error'=>"Didn't receive 200 OK from remote server.",\r
- 'no_data'=>'No data received from server.',\r
- 'no_ssl'=>'No SSL support compiled in.',\r
- 'curl_fail'=>'CURL error',\r
- 'invalid_request'=>'Invalid request payload',\r
- 'no_curl'=>'No CURL support compiled in.',\r
- 'server_error'=>'Internal server error',\r
- 'multicall_error'=>'Received from server invalid multicall response',\r
- 'multicall_notstruct'=>'system.multicall expected struct',\r
- 'multicall_nomethod'=>'missing methodName',\r
- 'multicall_notstring'=>'methodName is not a string',\r
- 'multicall_recursion'=>'recursive system.multicall forbidden',\r
- 'multicall_noparams'=>'missing params',\r
- 'multicall_notarray'=>'params is not an array',\r
-\r
- 'cannot_decompress'=>'Received from server compressed HTTP and cannot decompress',\r
- 'decompress_fail'=>'Received from server invalid compressed HTTP',\r
- 'dechunk_fail'=>'Received from server invalid chunked HTTP',\r
- 'server_cannot_decompress'=>'Received from client compressed HTTP request and cannot decompress',\r
- 'server_decompress_fail'=>'Received from client invalid compressed HTTP request'\r
+ public $xmlrpcstr = array(\r
+ 'unknown_method'=>'Unknown method',\r
+ 'invalid_return'=>'Invalid return payload: enable debugging to examine incoming payload',\r
+ 'incorrect_params'=>'Incorrect parameters passed to method',\r
+ 'introspect_unknown'=>"Can't introspect: method unknown",\r
+ 'http_error'=>"Didn't receive 200 OK from remote server.",\r
+ 'no_data'=>'No data received from server.',\r
+ 'no_ssl'=>'No SSL support compiled in.',\r
+ 'curl_fail'=>'CURL error',\r
+ 'invalid_request'=>'Invalid request payload',\r
+ 'no_curl'=>'No CURL support compiled in.',\r
+ 'server_error'=>'Internal server error',\r
+ 'multicall_error'=>'Received from server invalid multicall response',\r
+ 'multicall_notstruct'=>'system.multicall expected struct',\r
+ 'multicall_nomethod'=>'missing methodName',\r
+ 'multicall_notstring'=>'methodName is not a string',\r
+ 'multicall_recursion'=>'recursive system.multicall forbidden',\r
+ 'multicall_noparams'=>'missing params',\r
+ 'multicall_notarray'=>'params is not an array',\r
+\r
+ 'cannot_decompress'=>'Received from server compressed HTTP and cannot decompress',\r
+ 'decompress_fail'=>'Received from server invalid compressed HTTP',\r
+ 'dechunk_fail'=>'Received from server invalid chunked HTTP',\r
+ 'server_cannot_decompress'=>'Received from client compressed HTTP request and cannot decompress',\r
+ 'server_decompress_fail'=>'Received from client invalid compressed HTTP request'\r
);\r
\r
// The charset encoding used by the server for received messages and\r
// by the client for received responses when received charset cannot be determined\r
// or is not supported\r
- $GLOBALS['xmlrpc_defencoding']='UTF-8';\r
+ public $xmlrpc_defencoding = "UTF-8";\r
\r
// The encoding used internally by PHP.\r
// String values received as xml will be converted to this, and php strings will be converted to xml\r
// as if having been coded with this\r
- $GLOBALS['xmlrpc_internalencoding']='ISO-8859-1';\r
+ public $xmlrpc_internalencoding = "ISO-8859-1"; // TODO: maybe this would be better as UTF-8, or atleast configurable?\r
\r
- $GLOBALS['xmlrpcName']='XML-RPC for PHP';\r
- $GLOBALS['xmlrpcVersion']='3.0.0.beta';\r
+ public $xmlrpcName = "XML-RPC for PHP";\r
+ public $xmlrpcVersion = "3.0.0.beta";\r
\r
// let user errors start at 800\r
- $GLOBALS['xmlrpcerruser']=800;\r
+ public $xmlrpcerruser = 800;\r
// let XML parse errors start at 100\r
- $GLOBALS['xmlrpcerrxml']=100;\r
+ public $xmlrpcerrxml = 100;\r
\r
// set to TRUE to enable correct decoding of <NIL/> and <EX:NIL/> values\r
- $GLOBALS['xmlrpc_null_extension']=false;\r
+ public $xmlrpc_null_extension = false;\r
\r
// set to TRUE to enable encoding of php NULL values to <EX:NIL/> instead of <NIL/>\r
- $GLOBALS['xmlrpc_null_apache_encoding']=false;\r
- $GLOBALS['xmlrpc_null_apache_encoding_ns']='http://ws.apache.org/xmlrpc/namespaces/extensions';\r
+ public $xmlrpc_null_apache_encoding = false;\r
+\r
+ public $xmlrpc_null_apache_encoding_ns = "http://ws.apache.org/xmlrpc/namespaces/extensions";\r
\r
// used to store state during parsing\r
// quick explanation of components:\r
// method - used to store method name\r
// stack - array with genealogy of xml elements names:\r
// used to validate nesting of xmlrpc elements\r
- $GLOBALS['_xh']=null;\r
+ public $_xh = null;\r
+\r
+ private static $instance = null;\r
+\r
+ private function __construct() {\r
+ $this->xmlrpcTypes = array(\r
+ $this->xmlrpcI4 => 1,\r
+ $this->xmlrpcInt => 1,\r
+ $this->xmlrpcBoolean => 1,\r
+ $this->xmlrpcDouble => 1,\r
+ $this->xmlrpcString => 1,\r
+ $this->xmlrpcDateTime => 1,\r
+ $this->xmlrpcBase64 => 1,\r
+ $this->xmlrpcArray => 2,\r
+ $this->xmlrpcStruct => 3,\r
+ $this->xmlrpcNull => 1\r
+ );\r
+\r
+ for($i = 0; $i < 32; $i++) {\r
+ $this->xml_iso88591_Entities["in"][] = chr($i);\r
+ $this->xml_iso88591_Entities["out"][] = "&#{$i};";\r
+ }\r
+\r
+ for($i = 160; $i < 256; $i++) {\r
+ $this->xml_iso88591_Entities["in"][] = chr($i);\r
+ $this->xml_iso88591_Entities["out"][] = "&#{$i};";\r
+ }\r
+ }\r
+\r
+ /**\r
+ * This class is singleton for performance reasons: this way the ASCII array needs to be done only once.\r
+ */\r
+ public static function instance() {\r
+ if(Xmlrpc::$instance === null) {\r
+ Xmlrpc::$instance = new Xmlrpc();\r
+ }\r
+\r
+ return Xmlrpc::$instance;\r
+ }\r
+}\r
\r
/**\r
* Convert a string to the correct XML representation in a target charset\r
*/\r
function xmlrpc_encode_entitites($data, $src_encoding='', $dest_encoding='')\r
{\r
+ $xmlrpc = Xmlrpc::instance();\r
if ($src_encoding == '')\r
{\r
// lame, but we know no better...\r
- $src_encoding = $GLOBALS['xmlrpc_internalencoding'];\r
+ $src_encoding = $xmlrpc->xmlrpc_internalencoding;\r
}\r
\r
switch(strtoupper($src_encoding.'_'.$dest_encoding))\r
case 'ISO-8859-1_':\r
case 'ISO-8859-1_US-ASCII':\r
$escaped_data = str_replace(array('&', '"', "'", '<', '>'), array('&', '"', ''', '<', '>'), $data);\r
- $escaped_data = str_replace($GLOBALS['xml_iso88591_Entities']['in'], $GLOBALS['xml_iso88591_Entities']['out'], $escaped_data);\r
+ $escaped_data = str_replace($xmlrpc->xml_iso88591_Entities['in'], $xmlrpc->xml_iso88591_Entities['out'], $escaped_data);\r
break;\r
case 'ISO-8859-1_UTF-8':\r
$escaped_data = str_replace(array('&', '"', "'", '<', '>'), array('&', '"', ''', '<', '>'), $data);\r
/// xml parser handler function for opening element tags\r
function xmlrpc_se($parser, $name, $attrs, $accept_single_vals=false)\r
{\r
+ $xmlrpc = Xmlrpc::instance();\r
// if invalid xmlrpc already detected, skip all processing\r
- if ($GLOBALS['_xh']['isf'] < 2)\r
+ if ($xmlrpc->_xh['isf'] < 2)\r
{\r
// check for correct element nesting\r
// top level element can only be of 2 types\r
/// @todo optimization creep: save this check into a bool variable, instead of using count() every time:\r
/// there is only a single top level element in xml anyway\r
- if (count($GLOBALS['_xh']['stack']) == 0)\r
+ if (count($xmlrpc->_xh['stack']) == 0)\r
{\r
if ($name != 'METHODRESPONSE' && $name != 'METHODCALL' && (\r
$name != 'VALUE' && !$accept_single_vals))\r
{\r
- $GLOBALS['_xh']['isf'] = 2;\r
- $GLOBALS['_xh']['isf_reason'] = 'missing top level xmlrpc element';\r
+ $xmlrpc->_xh['isf'] = 2;\r
+ $xmlrpc->_xh['isf_reason'] = 'missing top level xmlrpc element';\r
return;\r
}\r
else\r
{\r
- $GLOBALS['_xh']['rt'] = strtolower($name);\r
- $GLOBALS['_xh']['rt'] = strtolower($name);\r
+ $xmlrpc->_xh['rt'] = strtolower($name);\r
+ $xmlrpc->_xh['rt'] = strtolower($name);\r
}\r
}\r
else\r
{\r
// not top level element: see if parent is OK\r
- $parent = end($GLOBALS['_xh']['stack']);\r
- if (!array_key_exists($name, $GLOBALS['xmlrpc_valid_parents']) || !in_array($parent, $GLOBALS['xmlrpc_valid_parents'][$name]))\r
+ $parent = end($xmlrpc->_xh['stack']);\r
+ if (!array_key_exists($name, $xmlrpc->xmlrpc_valid_parents) || !in_array($parent, $xmlrpc->xmlrpc_valid_parents[$name]))\r
{\r
- $GLOBALS['_xh']['isf'] = 2;\r
- $GLOBALS['_xh']['isf_reason'] = "xmlrpc element $name cannot be child of $parent";\r
+ $xmlrpc->_xh['isf'] = 2;\r
+ $xmlrpc->_xh['isf_reason'] = "xmlrpc element $name cannot be child of $parent";\r
return;\r
}\r
}\r
// optimize for speed switch cases: most common cases first\r
case 'VALUE':\r
/// @todo we could check for 2 VALUE elements inside a MEMBER or PARAM element\r
- $GLOBALS['_xh']['vt']='value'; // indicator: no value found yet\r
- $GLOBALS['_xh']['ac']='';\r
- $GLOBALS['_xh']['lv']=1;\r
- $GLOBALS['_xh']['php_class']=null;\r
+ $xmlrpc->_xh['vt']='value'; // indicator: no value found yet\r
+ $xmlrpc->_xh['ac']='';\r
+ $xmlrpc->_xh['lv']=1;\r
+ $xmlrpc->_xh['php_class']=null;\r
break;\r
case 'I4':\r
case 'INT':\r
case 'DOUBLE':\r
case 'DATETIME.ISO8601':\r
case 'BASE64':\r
- if ($GLOBALS['_xh']['vt']!='value')\r
+ if ($xmlrpc->_xh['vt']!='value')\r
{\r
//two data elements inside a value: an error occurred!\r
- $GLOBALS['_xh']['isf'] = 2;\r
- $GLOBALS['_xh']['isf_reason'] = "$name element following a {$GLOBALS['_xh']['vt']} element inside a single value";\r
+ $xmlrpc->_xh['isf'] = 2;\r
+ $xmlrpc->_xh['isf_reason'] = "$name element following a {$xmlrpc->_xh['vt']} element inside a single value";\r
return;\r
}\r
- $GLOBALS['_xh']['ac']=''; // reset the accumulator\r
+ $xmlrpc->_xh['ac']=''; // reset the accumulator\r
break;\r
case 'STRUCT':\r
case 'ARRAY':\r
- if ($GLOBALS['_xh']['vt']!='value')\r
+ if ($xmlrpc->_xh['vt']!='value')\r
{\r
//two data elements inside a value: an error occurred!\r
- $GLOBALS['_xh']['isf'] = 2;\r
- $GLOBALS['_xh']['isf_reason'] = "$name element following a {$GLOBALS['_xh']['vt']} element inside a single value";\r
+ $xmlrpc->_xh['isf'] = 2;\r
+ $xmlrpc->_xh['isf_reason'] = "$name element following a {$xmlrpc->_xh['vt']} element inside a single value";\r
return;\r
}\r
// create an empty array to hold child values, and push it onto appropriate stack\r
{\r
$cur_val['php_class'] = $attrs['PHP_CLASS'];\r
}\r
- $GLOBALS['_xh']['valuestack'][] = $cur_val;\r
- $GLOBALS['_xh']['vt']='data'; // be prepared for a data element next\r
+ $xmlrpc->_xh['valuestack'][] = $cur_val;\r
+ $xmlrpc->_xh['vt']='data'; // be prepared for a data element next\r
break;\r
case 'DATA':\r
- if ($GLOBALS['_xh']['vt']!='data')\r
+ if ($xmlrpc->_xh['vt']!='data')\r
{\r
//two data elements inside a value: an error occurred!\r
- $GLOBALS['_xh']['isf'] = 2;\r
- $GLOBALS['_xh']['isf_reason'] = "found two data elements inside an array element";\r
+ $xmlrpc->_xh['isf'] = 2;\r
+ $xmlrpc->_xh['isf_reason'] = "found two data elements inside an array element";\r
return;\r
}\r
case 'METHODCALL':\r
case 'METHODNAME':\r
case 'NAME':\r
/// @todo we could check for 2 NAME elements inside a MEMBER element\r
- $GLOBALS['_xh']['ac']='';\r
+ $xmlrpc->_xh['ac']='';\r
break;\r
case 'FAULT':\r
- $GLOBALS['_xh']['isf']=1;\r
+ $xmlrpc->_xh['isf']=1;\r
break;\r
case 'MEMBER':\r
- $GLOBALS['_xh']['valuestack'][count($GLOBALS['_xh']['valuestack'])-1]['name']=''; // set member name to null, in case we do not find in the xml later on\r
- //$GLOBALS['_xh']['ac']='';\r
+ $xmlrpc->_xh['valuestack'][count($xmlrpc->_xh['valuestack'])-1]['name']=''; // set member name to null, in case we do not find in the xml later on\r
+ //$xmlrpc->_xh['ac']='';\r
// Drop trough intentionally\r
case 'PARAM':\r
// clear value type, so we can check later if no value has been passed for this param/member\r
- $GLOBALS['_xh']['vt']=null;\r
+ $xmlrpc->_xh['vt']=null;\r
break;\r
case 'NIL':\r
case 'EX:NIL':\r
- if ($GLOBALS['xmlrpc_null_extension'])\r
+ if ($xmlrpc->xmlrpc_null_extension)\r
{\r
- if ($GLOBALS['_xh']['vt']!='value')\r
+ if ($xmlrpc->_xh['vt']!='value')\r
{\r
//two data elements inside a value: an error occurred!\r
- $GLOBALS['_xh']['isf'] = 2;\r
- $GLOBALS['_xh']['isf_reason'] = "$name element following a {$GLOBALS['_xh']['vt']} element inside a single value";\r
+ $xmlrpc->_xh['isf'] = 2;\r
+ $xmlrpc->_xh['isf_reason'] = "$name element following a {$xmlrpc->_xh['vt']} element inside a single value";\r
return;\r
}\r
- $GLOBALS['_xh']['ac']=''; // reset the accumulator\r
+ $xmlrpc->_xh['ac']=''; // reset the accumulator\r
break;\r
}\r
// we do not support the <NIL/> extension, so\r
// drop through intentionally\r
default:\r
/// INVALID ELEMENT: RAISE ISF so that it is later recognized!!!\r
- $GLOBALS['_xh']['isf'] = 2;\r
- $GLOBALS['_xh']['isf_reason'] = "found not-xmlrpc xml element $name";\r
+ $xmlrpc->_xh['isf'] = 2;\r
+ $xmlrpc->_xh['isf_reason'] = "found not-xmlrpc xml element $name";\r
break;\r
}\r
\r
// Save current element name to stack, to validate nesting\r
- $GLOBALS['_xh']['stack'][] = $name;\r
+ $xmlrpc->_xh['stack'][] = $name;\r
\r
/// @todo optimization creep: move this inside the big switch() above\r
if($name!='VALUE')\r
{\r
- $GLOBALS['_xh']['lv']=0;\r
+ $xmlrpc->_xh['lv']=0;\r
}\r
}\r
}\r
/// xml parser handler function for close element tags\r
function xmlrpc_ee($parser, $name, $rebuild_xmlrpcvals = true)\r
{\r
- if ($GLOBALS['_xh']['isf'] < 2)\r
+ $xmlrpc = Xmlrpc::instance();\r
+\r
+ if ($xmlrpc->_xh['isf'] < 2)\r
{\r
// push this element name from stack\r
// NB: if XML validates, correct opening/closing is guaranteed and\r
// we do not have to check for $name == $curr_elem.\r
// we also checked for proper nesting at start of elements...\r
- $curr_elem = array_pop($GLOBALS['_xh']['stack']);\r
+ $curr_elem = array_pop($xmlrpc->_xh['stack']);\r
\r
switch($name)\r
{\r
case 'VALUE':\r
// This if() detects if no scalar was inside <VALUE></VALUE>\r
- if ($GLOBALS['_xh']['vt']=='value')\r
+ if ($xmlrpc->_xh['vt']=='value')\r
{\r
- $GLOBALS['_xh']['value']=$GLOBALS['_xh']['ac'];\r
- $GLOBALS['_xh']['vt']=$GLOBALS['xmlrpcString'];\r
+ $xmlrpc->_xh['value']=$xmlrpc->_xh['ac'];\r
+ $xmlrpc->_xh['vt']=$xmlrpc->xmlrpcString;\r
}\r
\r
if ($rebuild_xmlrpcvals)\r
{\r
// build the xmlrpc val out of the data received, and substitute it\r
- $temp = new xmlrpcval($GLOBALS['_xh']['value'], $GLOBALS['_xh']['vt']);\r
+ $temp = new xmlrpcval($xmlrpc->_xh['value'], $xmlrpc->_xh['vt']);\r
// in case we got info about underlying php class, save it\r
// in the object we're rebuilding\r
- if (isset($GLOBALS['_xh']['php_class']))\r
- $temp->_php_class = $GLOBALS['_xh']['php_class'];\r
+ if (isset($xmlrpc->_xh['php_class']))\r
+ $temp->_php_class = $xmlrpc->_xh['php_class'];\r
// check if we are inside an array or struct:\r
// if value just built is inside an array, let's move it into array on the stack\r
- $vscount = count($GLOBALS['_xh']['valuestack']);\r
- if ($vscount && $GLOBALS['_xh']['valuestack'][$vscount-1]['type']=='ARRAY')\r
+ $vscount = count($xmlrpc->_xh['valuestack']);\r
+ if ($vscount && $xmlrpc->_xh['valuestack'][$vscount-1]['type']=='ARRAY')\r
{\r
- $GLOBALS['_xh']['valuestack'][$vscount-1]['values'][] = $temp;\r
+ $xmlrpc->_xh['valuestack'][$vscount-1]['values'][] = $temp;\r
}\r
else\r
{\r
- $GLOBALS['_xh']['value'] = $temp;\r
+ $xmlrpc->_xh['value'] = $temp;\r
}\r
}\r
else\r
/// @todo this needs to treat correctly php-serialized objects,\r
/// since std deserializing is done by php_xmlrpc_decode,\r
/// which we will not be calling...\r
- if (isset($GLOBALS['_xh']['php_class']))\r
+ if (isset($xmlrpc->_xh['php_class']))\r
{\r
}\r
\r
// check if we are inside an array or struct:\r
// if value just built is inside an array, let's move it into array on the stack\r
- $vscount = count($GLOBALS['_xh']['valuestack']);\r
- if ($vscount && $GLOBALS['_xh']['valuestack'][$vscount-1]['type']=='ARRAY')\r
+ $vscount = count($xmlrpc->_xh['valuestack']);\r
+ if ($vscount && $xmlrpc->_xh['valuestack'][$vscount-1]['type']=='ARRAY')\r
{\r
- $GLOBALS['_xh']['valuestack'][$vscount-1]['values'][] = $GLOBALS['_xh']['value'];\r
+ $xmlrpc->_xh['valuestack'][$vscount-1]['values'][] = $xmlrpc->_xh['value'];\r
}\r
}\r
break;\r
case 'DOUBLE':\r
case 'DATETIME.ISO8601':\r
case 'BASE64':\r
- $GLOBALS['_xh']['vt']=strtolower($name);\r
+ $xmlrpc->_xh['vt']=strtolower($name);\r
/// @todo: optimization creep - remove the if/elseif cycle below\r
/// since the case() in which we are already did that\r
if ($name=='STRING')\r
{\r
- $GLOBALS['_xh']['value']=$GLOBALS['_xh']['ac'];\r
+ $xmlrpc->_xh['value']=$xmlrpc->_xh['ac'];\r
}\r
elseif ($name=='DATETIME.ISO8601')\r
{\r
- if (!preg_match('/^[0-9]{8}T[0-9]{2}:[0-9]{2}:[0-9]{2}$/', $GLOBALS['_xh']['ac']))\r
+ if (!preg_match('/^[0-9]{8}T[0-9]{2}:[0-9]{2}:[0-9]{2}$/', $xmlrpc->_xh['ac']))\r
{\r
- error_log('XML-RPC: invalid value received in DATETIME: '.$GLOBALS['_xh']['ac']);\r
+ error_log('XML-RPC: invalid value received in DATETIME: '.$xmlrpc->_xh['ac']);\r
}\r
- $GLOBALS['_xh']['vt']=$GLOBALS['xmlrpcDateTime'];\r
- $GLOBALS['_xh']['value']=$GLOBALS['_xh']['ac'];\r
+ $xmlrpc->_xh['vt']=$xmlrpc->xmlrpcDateTime;\r
+ $xmlrpc->_xh['value']=$xmlrpc->_xh['ac'];\r
}\r
elseif ($name=='BASE64')\r
{\r
/// @todo check for failure of base64 decoding / catch warnings\r
- $GLOBALS['_xh']['value']=base64_decode($GLOBALS['_xh']['ac']);\r
+ $xmlrpc->_xh['value']=base64_decode($xmlrpc->_xh['ac']);\r
}\r
elseif ($name=='BOOLEAN')\r
{\r
// spec never mentions them (see eg. Blogger api docs)\r
// NB: this simple checks helps a lot sanitizing input, ie no\r
// security problems around here\r
- if ($GLOBALS['_xh']['ac']=='1' || strcasecmp($GLOBALS['_xh']['ac'], 'true') == 0)\r
+ if ($xmlrpc->_xh['ac']=='1' || strcasecmp($xmlrpc->_xh['ac'], 'true') == 0)\r
{\r
- $GLOBALS['_xh']['value']=true;\r
+ $xmlrpc->_xh['value']=true;\r
}\r
else\r
{\r
// log if receiveing something strange, even though we set the value to false anyway\r
- if ($GLOBALS['_xh']['ac']!='0' && strcasecmp($GLOBALS['_xh']['ac'], 'false') != 0)\r
- error_log('XML-RPC: invalid value received in BOOLEAN: '.$GLOBALS['_xh']['ac']);\r
- $GLOBALS['_xh']['value']=false;\r
+ if ($xmlrpc->_xh['ac']!='0' && strcasecmp($xmlrpc->_xh['ac'], 'false') != 0)\r
+ error_log('XML-RPC: invalid value received in BOOLEAN: '.$xmlrpc->_xh['ac']);\r
+ $xmlrpc->_xh['value']=false;\r
}\r
}\r
elseif ($name=='DOUBLE')\r
// we have a DOUBLE\r
// we must check that only 0123456789-.<space> are characters here\r
// NOTE: regexp could be much stricter than this...\r
- if (!preg_match('/^[+-eE0123456789 \t.]+$/', $GLOBALS['_xh']['ac']))\r
+ if (!preg_match('/^[+-eE0123456789 \t.]+$/', $xmlrpc->_xh['ac']))\r
{\r
/// @todo: find a better way of throwing an error than this!\r
- error_log('XML-RPC: non numeric value received in DOUBLE: '.$GLOBALS['_xh']['ac']);\r
- $GLOBALS['_xh']['value']='ERROR_NON_NUMERIC_FOUND';\r
+ error_log('XML-RPC: non numeric value received in DOUBLE: '.$xmlrpc->_xh['ac']);\r
+ $xmlrpc->_xh['value']='ERROR_NON_NUMERIC_FOUND';\r
}\r
else\r
{\r
// it's ok, add it on\r
- $GLOBALS['_xh']['value']=(double)$GLOBALS['_xh']['ac'];\r
+ $xmlrpc->_xh['value']=(double)$xmlrpc->_xh['ac'];\r
}\r
}\r
else\r
{\r
// we have an I4/INT\r
// we must check that only 0123456789-<space> are characters here\r
- if (!preg_match('/^[+-]?[0123456789 \t]+$/', $GLOBALS['_xh']['ac']))\r
+ if (!preg_match('/^[+-]?[0123456789 \t]+$/', $xmlrpc->_xh['ac']))\r
{\r
/// @todo find a better way of throwing an error than this!\r
- error_log('XML-RPC: non numeric value received in INT: '.$GLOBALS['_xh']['ac']);\r
- $GLOBALS['_xh']['value']='ERROR_NON_NUMERIC_FOUND';\r
+ error_log('XML-RPC: non numeric value received in INT: '.$xmlrpc->_xh['ac']);\r
+ $xmlrpc->_xh['value']='ERROR_NON_NUMERIC_FOUND';\r
}\r
else\r
{\r
// it's ok, add it on\r
- $GLOBALS['_xh']['value']=(int)$GLOBALS['_xh']['ac'];\r
+ $xmlrpc->_xh['value']=(int)$xmlrpc->_xh['ac'];\r
}\r
}\r
- //$GLOBALS['_xh']['ac']=''; // is this necessary?\r
- $GLOBALS['_xh']['lv']=3; // indicate we've found a value\r
+ //$xmlrpc->_xh['ac']=''; // is this necessary?\r
+ $xmlrpc->_xh['lv']=3; // indicate we've found a value\r
break;\r
case 'NAME':\r
- $GLOBALS['_xh']['valuestack'][count($GLOBALS['_xh']['valuestack'])-1]['name'] = $GLOBALS['_xh']['ac'];\r
+ $xmlrpc->_xh['valuestack'][count($xmlrpc->_xh['valuestack'])-1]['name'] = $xmlrpc->_xh['ac'];\r
break;\r
case 'MEMBER':\r
- //$GLOBALS['_xh']['ac']=''; // is this necessary?\r
+ //$xmlrpc->_xh['ac']=''; // is this necessary?\r
// add to array in the stack the last element built,\r
// unless no VALUE was found\r
- if ($GLOBALS['_xh']['vt'])\r
+ if ($xmlrpc->_xh['vt'])\r
{\r
- $vscount = count($GLOBALS['_xh']['valuestack']);\r
- $GLOBALS['_xh']['valuestack'][$vscount-1]['values'][$GLOBALS['_xh']['valuestack'][$vscount-1]['name']] = $GLOBALS['_xh']['value'];\r
+ $vscount = count($xmlrpc->_xh['valuestack']);\r
+ $xmlrpc->_xh['valuestack'][$vscount-1]['values'][$xmlrpc->_xh['valuestack'][$vscount-1]['name']] = $xmlrpc->_xh['value'];\r
} else\r
error_log('XML-RPC: missing VALUE inside STRUCT in received xml');\r
break;\r
case 'DATA':\r
- //$GLOBALS['_xh']['ac']=''; // is this necessary?\r
- $GLOBALS['_xh']['vt']=null; // reset this to check for 2 data elements in a row - even if they're empty\r
+ //$xmlrpc->_xh['ac']=''; // is this necessary?\r
+ $xmlrpc->_xh['vt']=null; // reset this to check for 2 data elements in a row - even if they're empty\r
break;\r
case 'STRUCT':\r
case 'ARRAY':\r
// fetch out of stack array of values, and promote it to current value\r
- $curr_val = array_pop($GLOBALS['_xh']['valuestack']);\r
- $GLOBALS['_xh']['value'] = $curr_val['values'];\r
- $GLOBALS['_xh']['vt']=strtolower($name);\r
+ $curr_val = array_pop($xmlrpc->_xh['valuestack']);\r
+ $xmlrpc->_xh['value'] = $curr_val['values'];\r
+ $xmlrpc->_xh['vt']=strtolower($name);\r
if (isset($curr_val['php_class']))\r
{\r
- $GLOBALS['_xh']['php_class'] = $curr_val['php_class'];\r
+ $xmlrpc->_xh['php_class'] = $curr_val['php_class'];\r
}\r
break;\r
case 'PARAM':\r
// add to array of params the current value,\r
// unless no VALUE was found\r
- if ($GLOBALS['_xh']['vt'])\r
+ if ($xmlrpc->_xh['vt'])\r
{\r
- $GLOBALS['_xh']['params'][]=$GLOBALS['_xh']['value'];\r
- $GLOBALS['_xh']['pt'][]=$GLOBALS['_xh']['vt'];\r
+ $xmlrpc->_xh['params'][]=$xmlrpc->_xh['value'];\r
+ $xmlrpc->_xh['pt'][]=$xmlrpc->_xh['vt'];\r
}\r
else\r
error_log('XML-RPC: missing VALUE inside PARAM in received xml');\r
break;\r
case 'METHODNAME':\r
- $GLOBALS['_xh']['method']=preg_replace('/^[\n\r\t ]+/', '', $GLOBALS['_xh']['ac']);\r
+ $xmlrpc->_xh['method']=preg_replace('/^[\n\r\t ]+/', '', $xmlrpc->_xh['ac']);\r
break;\r
case 'NIL':\r
case 'EX:NIL':\r
- if ($GLOBALS['xmlrpc_null_extension'])\r
+ if ($xmlrpc->xmlrpc_null_extension)\r
{\r
- $GLOBALS['_xh']['vt']='null';\r
- $GLOBALS['_xh']['value']=null;\r
- $GLOBALS['_xh']['lv']=3;\r
+ $xmlrpc->_xh['vt']='null';\r
+ $xmlrpc->_xh['value']=null;\r
+ $xmlrpc->_xh['lv']=3;\r
break;\r
}\r
// drop through intentionally if nil extension not enabled\r
/// xml parser handler function for character data\r
function xmlrpc_cd($parser, $data)\r
{\r
+ $xmlrpc = Xmlrpc::instance();\r
// skip processing if xml fault already detected\r
- if ($GLOBALS['_xh']['isf'] < 2)\r
+ if ($xmlrpc->_xh['isf'] < 2)\r
{\r
// "lookforvalue==3" means that we've found an entire value\r
// and should discard any further character data\r
- if($GLOBALS['_xh']['lv']!=3)\r
+ if($xmlrpc->_xh['lv']!=3)\r
{\r
// G. Giunta 2006-08-23: useless change of 'lv' from 1 to 2\r
- //if($GLOBALS['_xh']['lv']==1)\r
+ //if($xmlrpc->_xh['lv']==1)\r
//{\r
// if we've found text and we're just in a <value> then\r
// say we've found a value\r
- //$GLOBALS['_xh']['lv']=2;\r
+ //$xmlrpc->_xh['lv']=2;\r
//}\r
// we always initialize the accumulator before starting parsing, anyway...\r
- //if(!@isset($GLOBALS['_xh']['ac']))\r
+ //if(!@isset($xmlrpc->_xh['ac']))\r
//{\r
- // $GLOBALS['_xh']['ac'] = '';\r
+ // $xmlrpc->_xh['ac'] = '';\r
//}\r
- $GLOBALS['_xh']['ac'].=$data;\r
+ $xmlrpc->_xh['ac'].=$data;\r
}\r
}\r
}\r
/// element start/end tag. In fact it only gets called on unknown entities...\r
function xmlrpc_dh($parser, $data)\r
{\r
+ $xmlrpc = Xmlrpc::instance();\r
// skip processing if xml fault already detected\r
- if ($GLOBALS['_xh']['isf'] < 2)\r
+ if ($xmlrpc->_xh['isf'] < 2)\r
{\r
if(substr($data, 0, 1) == '&' && substr($data, -1, 1) == ';')\r
{\r
// G. Giunta 2006-08-25: useless change of 'lv' from 1 to 2\r
- //if($GLOBALS['_xh']['lv']==1)\r
+ //if($xmlrpc->_xh['lv']==1)\r
//{\r
- // $GLOBALS['_xh']['lv']=2;\r
+ // $xmlrpc->_xh['lv']=2;\r
//}\r
- $GLOBALS['_xh']['ac'].=$data;\r
+ $xmlrpc->_xh['ac'].=$data;\r
}\r
}\r
return true;\r
*/\r
function xmlrpc_client($path, $server='', $port='', $method='')\r
{\r
+ $xmlrpc = Xmlrpc::instance();\r
+\r
// allow user to specify all params in $path\r
if($server == '' and $port == '' and $method == '')\r
{\r
$this->accepted_charset_encodings = array('UTF-8', 'ISO-8859-1', 'US-ASCII');\r
\r
// initialize user_agent string\r
- $this->user_agent = $GLOBALS['xmlrpcName'] . ' ' . $GLOBALS['xmlrpcVersion'];\r
+ $this->user_agent = $xmlrpc->xmlrpcName . ' ' . $xmlrpc->xmlrpcVersion;\r
}\r
\r
/**\r
$username='', $password='', $authtype=1, $proxyhost='',\r
$proxyport=0, $proxyusername='', $proxypassword='', $proxyauthtype=1)\r
{\r
+ $xmlrpc = Xmlrpc::instance();\r
+\r
if($port==0)\r
{\r
$port=80;\r
else\r
{\r
$this->errstr='Connect error: '.$this->errstr;\r
- $r=new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['http_error'], $this->errstr . ' (' . $this->errno . ')');\r
+ $r=new xmlrpcresp(0, $xmlrpc->xmlrpcerr['http_error'], $this->errstr . ' (' . $this->errno . ')');\r
return $r;\r
}\r
\r
{\r
fclose($fp);\r
$this->errstr='Write error';\r
- $r=new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['http_error'], $this->errstr);\r
+ $r=new xmlrpcresp(0, $xmlrpc->xmlrpcerr['http_error'], $this->errstr);\r
return $r;\r
}\r
else\r
$proxyhost='', $proxyport=0, $proxyusername='', $proxypassword='', $proxyauthtype=1, $method='https',\r
$keepalive=false, $key='', $keypass='')\r
{\r
+ $xmlrpc = Xmlrpc::instance();\r
+\r
if(!function_exists('curl_init'))\r
{\r
$this->errstr='CURL unavailable on this install';\r
- $r=new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['no_curl'], $GLOBALS['xmlrpcstr']['no_curl']);\r
+ $r=new xmlrpcresp(0, $xmlrpc->xmlrpcerr['no_curl'], $xmlrpc->xmlrpcstr['no_curl']);\r
return $r;\r
}\r
if($method == 'https')\r
((is_string($info) && strpos($info, 'OpenSSL') === null) || (is_array($info) && !isset($info['ssl_version']))))\r
{\r
$this->errstr='SSL unavailable on this install';\r
- $r=new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['no_ssl'], $GLOBALS['xmlrpcstr']['no_ssl']);\r
+ $r=new xmlrpcresp(0, $xmlrpc->xmlrpcerr['no_ssl'], $xmlrpc->xmlrpcstr['no_ssl']);\r
return $r;\r
}\r
}\r
if(!$result) /// @todo we should use a better check here - what if we get back '' or '0'?\r
{\r
$this->errstr='no response';\r
- $resp=new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['curl_fail'], $GLOBALS['xmlrpcstr']['curl_fail']. ': '. curl_error($curl));\r
+ $resp=new xmlrpcresp(0, $xmlrpc->xmlrpcerr['curl_fail'], $xmlrpc->xmlrpcstr['curl_fail']. ': '. curl_error($curl));\r
curl_close($curl);\r
if($keepalive)\r
{\r
}\r
$resp =& $msg->parseResponse($result, true, $this->return_type);\r
// if we got back a 302, we can not reuse the curl handle for later calls\r
- if($resp->faultCode() == $GLOBALS['xmlrpcerr']['http_error'] && $keepalive)\r
+ if($resp->faultCode() == $xmlrpc->xmlrpcerr['http_error'] && $keepalive)\r
{\r
curl_close($curl);\r
$this->xmlrpc_curl_handle = null;\r
*/\r
function multicall($msgs, $timeout=0, $method='', $fallback=true)\r
{\r
+ $xmlrpc = Xmlrpc::instance();\r
+\r
if ($method == '')\r
{\r
$method = $this->method;\r
}\r
else\r
{\r
- $result = new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['multicall_error'], $GLOBALS['xmlrpcstr']['multicall_error']);\r
+ $result = new xmlrpcresp(0, $xmlrpc->xmlrpcerr['multicall_error'], $xmlrpc->xmlrpcstr['multicall_error']);\r
}\r
}\r
}\r
*/\r
function serialize($charset_encoding='')\r
{\r
+ $xmlrpc = Xmlrpc::instance();\r
+\r
if ($charset_encoding != '')\r
$this->content_type = 'text/xml; charset=' . $charset_encoding;\r
else\r
$this->content_type = 'text/xml';\r
- if ($GLOBALS['xmlrpc_null_apache_encoding'])\r
+ if ($xmlrpc->xmlrpc_null_apache_encoding)\r
{\r
- $result = "<methodResponse xmlns:ex=\"".$GLOBALS['xmlrpc_null_apache_encoding_ns']."\">\n";\r
+ $result = "<methodResponse xmlns:ex=\"".$xmlrpc->xmlrpc_null_apache_encoding_ns."\">\n";\r
}\r
else\r
{\r
$result .= "<fault>\n" .\r
"<value>\n<struct><member><name>faultCode</name>\n<value><int>" . $this->errno .\r
"</int></value>\n</member>\n<member>\n<name>faultString</name>\n<value><string>" .\r
-xmlrpc_encode_entitites($this->errstr, $GLOBALS['xmlrpc_internalencoding'], $charset_encoding) . "</string></value>\n</member>\n" .\r
+xmlrpc_encode_entitites($this->errstr, $xmlrpc->xmlrpc_internalencoding, $charset_encoding) . "</string></value>\n</member>\n" .\r
"</struct>\n</value>\n</fault>";\r
}\r
else\r
*/\r
function &parseResponseHeaders(&$data, $headers_processed=false)\r
{\r
+ $xmlrpc = Xmlrpc::instance();\r
// Support "web-proxy-tunelling" connections for https through proxies\r
if(preg_match('/^HTTP\/1\.[0-1] 200 Connection established/', $data))\r
{\r
else\r
{\r
error_log('XML-RPC: '.__METHOD__.': HTTPS via proxy error, tunnel connection possibly failed');\r
- $r=new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['http_error'], $GLOBALS['xmlrpcstr']['http_error']. ' (HTTPS via proxy error, tunnel connection possibly failed)');\r
+ $r=new xmlrpcresp(0, $xmlrpc->xmlrpcerr['http_error'], $xmlrpc->xmlrpcstr['http_error']. ' (HTTPS via proxy error, tunnel connection possibly failed)');\r
return $r;\r
}\r
}\r
{\r
$errstr= substr($data, 0, strpos($data, "\n")-1);\r
error_log('XML-RPC: '.__METHOD__.': HTTP error, got response: ' .$errstr);\r
- $r=new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['http_error'], $GLOBALS['xmlrpcstr']['http_error']. ' (' . $errstr . ')');\r
+ $r=new xmlrpcresp(0, $xmlrpc->xmlrpcerr['http_error'], $xmlrpc->xmlrpcstr['http_error']. ' (' . $errstr . ')');\r
return $r;\r
}\r
\r
- $GLOBALS['_xh']['headers'] = array();\r
- $GLOBALS['_xh']['cookies'] = array();\r
+ $xmlrpc->_xh['headers'] = array();\r
+ $xmlrpc->_xh['cookies'] = array();\r
\r
// be tolerant to usage of \n instead of \r\n to separate headers and data\r
// (even though it is not valid http)\r
$header_name = strtolower(trim($arr[0]));\r
/// @todo some other headers (the ones that allow a CSV list of values)\r
/// do allow many values to be passed using multiple header lines.\r
- /// We should add content to $GLOBALS['_xh']['headers'][$header_name]\r
+ /// We should add content to $xmlrpc->_xh['headers'][$header_name]\r
/// instead of replacing it for those...\r
if ($header_name == 'set-cookie' || $header_name == 'set-cookie2')\r
{\r
{\r
// glue together all received cookies, using a comma to separate them\r
// (same as php does with getallheaders())\r
- if (isset($GLOBALS['_xh']['headers'][$header_name]))\r
- $GLOBALS['_xh']['headers'][$header_name] .= ', ' . trim($cookie);\r
+ if (isset($xmlrpc->_xh['headers'][$header_name]))\r
+ $xmlrpc->_xh['headers'][$header_name] .= ', ' . trim($cookie);\r
else\r
- $GLOBALS['_xh']['headers'][$header_name] = trim($cookie);\r
+ $xmlrpc->_xh['headers'][$header_name] = trim($cookie);\r
// parse cookie attributes, in case user wants to correctly honour them\r
// feature creep: only allow rfc-compliant cookie attributes?\r
// @todo support for server sending multiple time cookie with same name, but using different PATHs\r
if ($pos == 0)\r
{\r
$cookiename = $tag;\r
- $GLOBALS['_xh']['cookies'][$tag] = array();\r
- $GLOBALS['_xh']['cookies'][$cookiename]['value'] = urldecode($val);\r
+ $xmlrpc->_xh['cookies'][$tag] = array();\r
+ $xmlrpc->_xh['cookies'][$cookiename]['value'] = urldecode($val);\r
}\r
else\r
{\r
if ($tag != 'value')\r
{\r
- $GLOBALS['_xh']['cookies'][$cookiename][$tag] = $val;\r
+ $xmlrpc->_xh['cookies'][$cookiename][$tag] = $val;\r
}\r
}\r
}\r
}\r
else\r
{\r
- $GLOBALS['_xh']['headers'][$header_name] = trim($arr[1]);\r
+ $xmlrpc->_xh['headers'][$header_name] = trim($arr[1]);\r
}\r
}\r
elseif(isset($header_name))\r
{\r
/// @todo version1 cookies might span multiple lines, thus breaking the parsing above\r
- $GLOBALS['_xh']['headers'][$header_name] .= ' ' . trim($line);\r
+ $xmlrpc->_xh['headers'][$header_name] .= ' ' . trim($line);\r
}\r
}\r
\r
$data = substr($data, $bd);\r
\r
- if($this->debug && count($GLOBALS['_xh']['headers']))\r
+ if($this->debug && count($xmlrpc->_xh['headers']))\r
{\r
print '<PRE>';\r
- foreach($GLOBALS['_xh']['headers'] as $header => $value)\r
+ foreach($xmlrpc->_xh['headers'] as $header => $value)\r
{\r
print htmlentities("HEADER: $header: $value\n");\r
}\r
- foreach($GLOBALS['_xh']['cookies'] as $header => $value)\r
+ foreach($xmlrpc->_xh['cookies'] as $header => $value)\r
{\r
print htmlentities("COOKIE: $header={$value['value']}\n");\r
}\r
if(!$headers_processed)\r
{\r
// Decode chunked encoding sent by http 1.1 servers\r
- if(isset($GLOBALS['_xh']['headers']['transfer-encoding']) && $GLOBALS['_xh']['headers']['transfer-encoding'] == 'chunked')\r
+ if(isset($xmlrpc->_xh['headers']['transfer-encoding']) && $xmlrpc->_xh['headers']['transfer-encoding'] == 'chunked')\r
{\r
if(!$data = decode_chunked($data))\r
{\r
error_log('XML-RPC: '.__METHOD__.': errors occurred when trying to rebuild the chunked data received from server');\r
- $r = new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['dechunk_fail'], $GLOBALS['xmlrpcstr']['dechunk_fail']);\r
+ $r = new xmlrpcresp(0, $xmlrpc->xmlrpcerr['dechunk_fail'], $xmlrpc->xmlrpcstr['dechunk_fail']);\r
return $r;\r
}\r
}\r
\r
// Decode gzip-compressed stuff\r
// code shamelessly inspired from nusoap library by Dietrich Ayala\r
- if(isset($GLOBALS['_xh']['headers']['content-encoding']))\r
+ if(isset($xmlrpc->_xh['headers']['content-encoding']))\r
{\r
- $GLOBALS['_xh']['headers']['content-encoding'] = str_replace('x-', '', $GLOBALS['_xh']['headers']['content-encoding']);\r
- if($GLOBALS['_xh']['headers']['content-encoding'] == 'deflate' || $GLOBALS['_xh']['headers']['content-encoding'] == 'gzip')\r
+ $xmlrpc->_xh['headers']['content-encoding'] = str_replace('x-', '', $xmlrpc->_xh['headers']['content-encoding']);\r
+ if($xmlrpc->_xh['headers']['content-encoding'] == 'deflate' || $xmlrpc->_xh['headers']['content-encoding'] == 'gzip')\r
{\r
// if decoding works, use it. else assume data wasn't gzencoded\r
if(function_exists('gzinflate'))\r
{\r
- if($GLOBALS['_xh']['headers']['content-encoding'] == 'deflate' && $degzdata = @gzuncompress($data))\r
+ if($xmlrpc->_xh['headers']['content-encoding'] == 'deflate' && $degzdata = @gzuncompress($data))\r
{\r
$data = $degzdata;\r
if($this->debug)\r
print "<PRE>---INFLATED RESPONSE---[".strlen($data)." chars]---\n" . htmlentities($data) . "\n---END---</PRE>";\r
}\r
- elseif($GLOBALS['_xh']['headers']['content-encoding'] == 'gzip' && $degzdata = @gzinflate(substr($data, 10)))\r
+ elseif($xmlrpc->_xh['headers']['content-encoding'] == 'gzip' && $degzdata = @gzinflate(substr($data, 10)))\r
{\r
$data = $degzdata;\r
if($this->debug)\r
else\r
{\r
error_log('XML-RPC: '.__METHOD__.': errors occurred when trying to decode the deflated data received from server');\r
- $r = new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['decompress_fail'], $GLOBALS['xmlrpcstr']['decompress_fail']);\r
+ $r = new xmlrpcresp(0, $xmlrpc->xmlrpcerr['decompress_fail'], $xmlrpc->xmlrpcstr['decompress_fail']);\r
return $r;\r
}\r
}\r
else\r
{\r
error_log('XML-RPC: '.__METHOD__.': the server sent deflated data. Your php install must have the Zlib extension compiled in to support this.');\r
- $r = new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['cannot_decompress'], $GLOBALS['xmlrpcstr']['cannot_decompress']);\r
+ $r = new xmlrpcresp(0, $xmlrpc->xmlrpcerr['cannot_decompress'], $xmlrpc->xmlrpcstr['cannot_decompress']);\r
return $r;\r
}\r
}\r
*/\r
function &parseResponse($data='', $headers_processed=false, $return_type='xmlrpcvals')\r
{\r
+ $xmlrpc = Xmlrpc::instance();\r
+\r
if($this->debug)\r
{\r
//by maHo, replaced htmlspecialchars with htmlentities\r
if($data == '')\r
{\r
error_log('XML-RPC: '.__METHOD__.': no response received from server.');\r
- $r = new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['no_data'], $GLOBALS['xmlrpcstr']['no_data']);\r
+ $r = new xmlrpcresp(0, $xmlrpc->xmlrpcerr['no_data'], $xmlrpc->xmlrpcstr['no_data']);\r
return $r;\r
}\r
\r
- $GLOBALS['_xh']=array();\r
+ $xmlrpc->_xh=array();\r
\r
$raw_data = $data;\r
// parse the HTTP headers of the response, if present, and separate them from data\r
}\r
else\r
{\r
- $GLOBALS['_xh']['headers'] = array();\r
- $GLOBALS['_xh']['cookies'] = array();\r
+ $xmlrpc->_xh['headers'] = array();\r
+ $xmlrpc->_xh['cookies'] = array();\r
}\r
\r
if($this->debug)\r
if ($return_type == 'xml')\r
{\r
$r = new xmlrpcresp($data, 0, '', 'xml');\r
- $r->hdrs = $GLOBALS['_xh']['headers'];\r
- $r->_cookies = $GLOBALS['_xh']['cookies'];\r
+ $r->hdrs = $xmlrpc->_xh['headers'];\r
+ $r->_cookies = $xmlrpc->_xh['cookies'];\r
$r->raw_data = $raw_data;\r
return $r;\r
}\r
\r
// try to 'guestimate' the character encoding of the received response\r
- $resp_encoding = guess_encoding(@$GLOBALS['_xh']['headers']['content-type'], $data);\r
+ $resp_encoding = guess_encoding(@$xmlrpc->_xh['headers']['content-type'], $data);\r
\r
- $GLOBALS['_xh']['ac']='';\r
- //$GLOBALS['_xh']['qt']=''; //unused...\r
- $GLOBALS['_xh']['stack'] = array();\r
- $GLOBALS['_xh']['valuestack'] = array();\r
- $GLOBALS['_xh']['isf']=0; // 0 = OK, 1 for xmlrpc fault responses, 2 = invalid xmlrpc\r
- $GLOBALS['_xh']['isf_reason']='';\r
- $GLOBALS['_xh']['rt']=''; // 'methodcall or 'methodresponse'\r
+ $xmlrpc->_xh['ac']='';\r
+ //$xmlrpc->_xh['qt']=''; //unused...\r
+ $xmlrpc->_xh['stack'] = array();\r
+ $xmlrpc->_xh['valuestack'] = array();\r
+ $xmlrpc->_xh['isf']=0; // 0 = OK, 1 for xmlrpc fault responses, 2 = invalid xmlrpc\r
+ $xmlrpc->_xh['isf_reason']='';\r
+ $xmlrpc->_xh['rt']=''; // 'methodcall or 'methodresponse'\r
\r
// if response charset encoding is not known / supported, try to use\r
// the default encoding and parse the xml anyway, but log a warning...\r
//if (!is_valid_charset($resp_encoding, array('UTF-8', 'ISO-8859-1', 'US-ASCII')))\r
{\r
error_log('XML-RPC: '.__METHOD__.': invalid charset encoding of received response: '.$resp_encoding);\r
- $resp_encoding = $GLOBALS['xmlrpc_defencoding'];\r
+ $resp_encoding = $xmlrpc->xmlrpc_defencoding;\r
}\r
$parser = xml_parser_create($resp_encoding);\r
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, true);\r
// we use the broadest one, ie. utf8\r
// This allows to send data which is native in various charset,\r
// by extending xmlrpc_encode_entitites() and setting xmlrpc_internalencoding\r
- if (!in_array($GLOBALS['xmlrpc_internalencoding'], array('UTF-8', 'ISO-8859-1', 'US-ASCII')))\r
+ if (!in_array($xmlrpc->xmlrpc_internalencoding, array('UTF-8', 'ISO-8859-1', 'US-ASCII')))\r
{\r
xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, 'UTF-8');\r
}\r
else\r
{\r
- xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, $GLOBALS['xmlrpc_internalencoding']);\r
+ xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, $xmlrpc->xmlrpc_internalencoding);\r
}\r
\r
if ($return_type == 'phpvals')\r
xml_get_current_line_number($parser), xml_get_current_column_number($parser));\r
}\r
error_log($errstr);\r
- $r=new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['invalid_return'], $GLOBALS['xmlrpcstr']['invalid_return'].' ('.$errstr.')');\r
+ $r=new xmlrpcresp(0, $xmlrpc->xmlrpcerr['invalid_return'], $xmlrpc->xmlrpcstr['invalid_return'].' ('.$errstr.')');\r
xml_parser_free($parser);\r
if($this->debug)\r
{\r
print $errstr;\r
}\r
- $r->hdrs = $GLOBALS['_xh']['headers'];\r
- $r->_cookies = $GLOBALS['_xh']['cookies'];\r
+ $r->hdrs = $xmlrpc->_xh['headers'];\r
+ $r->_cookies = $xmlrpc->_xh['cookies'];\r
$r->raw_data = $raw_data;\r
return $r;\r
}\r
xml_parser_free($parser);\r
// second error check: xml well formed but not xml-rpc compliant\r
- if ($GLOBALS['_xh']['isf'] > 1)\r
+ if ($xmlrpc->_xh['isf'] > 1)\r
{\r
if ($this->debug)\r
{\r
/// @todo echo something for user?\r
}\r
\r
- $r = new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['invalid_return'],\r
- $GLOBALS['xmlrpcstr']['invalid_return'] . ' ' . $GLOBALS['_xh']['isf_reason']);\r
+ $r = new xmlrpcresp(0, $xmlrpc->xmlrpcerr['invalid_return'],\r
+ $xmlrpc->xmlrpcstr['invalid_return'] . ' ' . $xmlrpc->_xh['isf_reason']);\r
}\r
// third error check: parsing of the response has somehow gone boink.\r
// NB: shall we omit this check, since we trust the parsing code?\r
- elseif ($return_type == 'xmlrpcvals' && !is_object($GLOBALS['_xh']['value']))\r
+ elseif ($return_type == 'xmlrpcvals' && !is_object($xmlrpc->_xh['value']))\r
{\r
// something odd has happened\r
// and it's time to generate a client side error\r
// indicating something odd went on\r
- $r=new xmlrpcresp(0, $GLOBALS['xmlrpcerr']['invalid_return'],\r
- $GLOBALS['xmlrpcstr']['invalid_return']);\r
+ $r=new xmlrpcresp(0, $xmlrpc->xmlrpcerr['invalid_return'],\r
+ $xmlrpc->xmlrpcstr['invalid_return']);\r
}\r
else\r
{\r
{\r
print "<PRE>---PARSED---\n";\r
// somehow htmlentities chokes on var_export, and some full html string...\r
- //print htmlentitites(var_export($GLOBALS['_xh']['value'], true));\r
- print htmlspecialchars(var_export($GLOBALS['_xh']['value'], true));\r
+ //print htmlentitites(var_export($xmlrpc->_xh['value'], true));\r
+ print htmlspecialchars(var_export($xmlrpc->_xh['value'], true));\r
print "\n---END---</PRE>";\r
}\r
\r
- // note that using =& will raise an error if $GLOBALS['_xh']['st'] does not generate an object.\r
- $v =& $GLOBALS['_xh']['value'];\r
+ // note that using =& will raise an error if $xmlrpc->_xh['st'] does not generate an object.\r
+ $v =& $xmlrpc->_xh['value'];\r
\r
- if($GLOBALS['_xh']['isf'])\r
+ if($xmlrpc->_xh['isf'])\r
{\r
/// @todo we should test here if server sent an int and a string,\r
/// and/or coerce them into such...\r
}\r
}\r
\r
- $r->hdrs = $GLOBALS['_xh']['headers'];\r
- $r->_cookies = $GLOBALS['_xh']['cookies'];\r
+ $r->hdrs = $xmlrpc->_xh['headers'];\r
+ $r->_cookies = $xmlrpc->_xh['cookies'];\r
$r->raw_data = $raw_data;\r
return $r;\r
}\r
*/\r
function addScalar($val, $type='string')\r
{\r
- $typeof=@$GLOBALS['xmlrpcTypes'][$type];\r
+ $xmlrpc = Xmlrpc::instance();\r
+\r
+ $typeof = null;\r
+ if(isset($xmlrpc->xmlrpcTypes[$type])) {\r
+ $typeof = $xmlrpc->xmlrpcTypes[$type];\r
+ }\r
+\r
if($typeof!=1)\r
{\r
error_log("XML-RPC: ".__METHOD__.": not a scalar type ($type)");\r
// coerce booleans into correct values\r
// NB: we should either do it for datetimes, integers and doubles, too,\r
// or just plain remove this check, implemented on booleans only...\r
- if($type==$GLOBALS['xmlrpcBoolean'])\r
+ if($type==$xmlrpc->xmlrpcBoolean)\r
{\r
if(strcasecmp($val,'true')==0 || $val==1 || ($val==true && strcasecmp($val,'false')))\r
{\r
*/\r
function addArray($vals)\r
{\r
+ $xmlrpc = Xmlrpc::instance();\r
if($this->mytype==0)\r
{\r
- $this->mytype=$GLOBALS['xmlrpcTypes']['array'];\r
+ $this->mytype=$xmlrpc->xmlrpcTypes['array'];\r
$this->me['array']=$vals;\r
return 1;\r
}\r
*/\r
function addStruct($vals)\r
{\r
+ $xmlrpc = Xmlrpc::instance();\r
+\r
if($this->mytype==0)\r
{\r
- $this->mytype=$GLOBALS['xmlrpcTypes']['struct'];\r
+ $this->mytype=$xmlrpc->xmlrpcTypes['struct'];\r
$this->me['struct']=$vals;\r
return 1;\r
}\r
*/\r
function serializedata($typ, $val, $charset_encoding='')\r
{\r
+ $xmlrpc = Xmlrpc::instance();\r
$rs='';\r
- switch(@$GLOBALS['xmlrpcTypes'][$typ])\r
+\r
+ if(!isset($xmlrpc->xmlrpcTypes[$typ])) {\r
+ return $rs;\r
+ }\r
+\r
+ switch($xmlrpc->xmlrpcTypes[$typ])\r
{\r
case 1:\r
switch($typ)\r
{\r
- case $GLOBALS['xmlrpcBase64']:\r
+ case $xmlrpc->xmlrpcBase64:\r
$rs.="<${typ}>" . base64_encode($val) . "</${typ}>";\r
break;\r
- case $GLOBALS['xmlrpcBoolean']:\r
+ case $xmlrpc->xmlrpcBoolean:\r
$rs.="<${typ}>" . ($val ? '1' : '0') . "</${typ}>";\r
break;\r
- case $GLOBALS['xmlrpcString']:\r
+ case $xmlrpc->xmlrpcString:\r
// G. Giunta 2005/2/13: do NOT use htmlentities, since\r
// it will produce named html entities, which are invalid xml\r
- $rs.="<${typ}>" . xmlrpc_encode_entitites($val, $GLOBALS['xmlrpc_internalencoding'], $charset_encoding). "</${typ}>";\r
+ $rs.="<${typ}>" . xmlrpc_encode_entitites($val, $xmlrpc->xmlrpc_internalencoding, $charset_encoding). "</${typ}>";\r
break;\r
- case $GLOBALS['xmlrpcInt']:\r
- case $GLOBALS['xmlrpcI4']:\r
+ case $xmlrpc->xmlrpcInt:\r
+ case $xmlrpc->xmlrpcI4:\r
$rs.="<${typ}>".(int)$val."</${typ}>";\r
break;\r
- case $GLOBALS['xmlrpcDouble']:\r
+ case $xmlrpc->xmlrpcDouble:\r
// avoid using standard conversion of float to string because it is locale-dependent,\r
// and also because the xmlrpc spec forbids exponential notation.\r
// sprintf('%F') could be most likely ok but it fails eg. on 2e-14.\r
// but there is of course no limit in the number of decimal places to be used...\r
$rs.="<${typ}>".preg_replace('/\\.?0+$/','',number_format((double)$val, 128, '.', ''))."</${typ}>";\r
break;\r
- case $GLOBALS['xmlrpcDateTime']:\r
+ case $xmlrpc->xmlrpcDateTime:\r
if (is_string($val))\r
{\r
$rs.="<${typ}>${val}</${typ}>";\r
$rs.="<${typ}>${val}</${typ}>";\r
}\r
break;\r
- case $GLOBALS['xmlrpcNull']:\r
- if ($GLOBALS['xmlrpc_null_apache_encoding'])\r
+ case $xmlrpc->xmlrpcNull:\r
+ if ($xmlrpc->xmlrpc_null_apache_encoding)\r
{\r
$rs.="<ex:nil/>";\r
}\r
}\r
foreach($val as $key2 => $val2)\r
{\r
- $rs.='<member><name>'.xmlrpc_encode_entitites($key2, $GLOBALS['xmlrpc_internalencoding'], $charset_encoding)."</name>\n";\r
+ $rs.='<member><name>'.xmlrpc_encode_entitites($key2, $xmlrpc->xmlrpc_internalencoding, $charset_encoding)."</name>\n";\r
//$rs.=$this->serializeval($val2);\r
$rs.=$val2->serialize($charset_encoding);\r
$rs.="</member>\n";\r
*/\r
function scalartyp()\r
{\r
+ $xmlrpc = Xmlrpc::instance();\r
+\r
reset($this->me);\r
list($a,)=each($this->me);\r
- if($a==$GLOBALS['xmlrpcI4'])\r
+ if($a==$xmlrpc->xmlrpcI4)\r
{\r
- $a=$GLOBALS['xmlrpcInt'];\r
+ $a=$xmlrpc->xmlrpcInt;\r
}\r
return $a;\r
}\r
*/\r
function php_xmlrpc_encode($php_val, $options=array())\r
{\r
+ $xmlrpc = Xmlrpc::instance();\r
$type = gettype($php_val);\r
switch($type)\r
{\r
case 'string':\r
if (in_array('auto_dates', $options) && preg_match('/^[0-9]{8}T[0-9]{2}:[0-9]{2}:[0-9]{2}$/', $php_val))\r
- $xmlrpc_val = new xmlrpcval($php_val, $GLOBALS['xmlrpcDateTime']);\r
+ $xmlrpc_val = new xmlrpcval($php_val, $xmlrpc->xmlrpcDateTime);\r
else\r
- $xmlrpc_val = new xmlrpcval($php_val, $GLOBALS['xmlrpcString']);\r
+ $xmlrpc_val = new xmlrpcval($php_val, $xmlrpc->xmlrpcString);\r
break;\r
case 'integer':\r
- $xmlrpc_val = new xmlrpcval($php_val, $GLOBALS['xmlrpcInt']);\r
+ $xmlrpc_val = new xmlrpcval($php_val, $xmlrpc->xmlrpcInt);\r
break;\r
case 'double':\r
- $xmlrpc_val = new xmlrpcval($php_val, $GLOBALS['xmlrpcDouble']);\r
+ $xmlrpc_val = new xmlrpcval($php_val, $xmlrpc->xmlrpcDouble);\r
break;\r
// <G_Giunta_2001-02-29>\r
// Add support for encoding/decoding of booleans, since they are supported in PHP\r
case 'boolean':\r
- $xmlrpc_val = new xmlrpcval($php_val, $GLOBALS['xmlrpcBoolean']);\r
+ $xmlrpc_val = new xmlrpcval($php_val, $xmlrpc->xmlrpcBoolean);\r
break;\r
// </G_Giunta_2001-02-29>\r
case 'array':\r
}\r
if($ko)\r
{\r
- $xmlrpc_val = new xmlrpcval($arr, $GLOBALS['xmlrpcStruct']);\r
+ $xmlrpc_val = new xmlrpcval($arr, $xmlrpc->xmlrpcStruct);\r
}\r
else\r
{\r
- $xmlrpc_val = new xmlrpcval($arr, $GLOBALS['xmlrpcArray']);\r
+ $xmlrpc_val = new xmlrpcval($arr, $xmlrpc->xmlrpcArray);\r
}\r
break;\r
case 'object':\r
}\r
else if(is_a($php_val, 'DateTime'))\r
{\r
- $xmlrpc_val = new xmlrpcval($php_val->format('Ymd\TH:i:s'), $GLOBALS['xmlrpcStruct']);\r
+ $xmlrpc_val = new xmlrpcval($php_val->format('Ymd\TH:i:s'), $xmlrpc->xmlrpcStruct);\r
}\r
else\r
{\r
{\r
$arr[$k] = php_xmlrpc_encode($v, $options);\r
}\r
- $xmlrpc_val = new xmlrpcval($arr, $GLOBALS['xmlrpcStruct']);\r
+ $xmlrpc_val = new xmlrpcval($arr, $xmlrpc->xmlrpcStruct);\r
if (in_array('encode_php_objs', $options))\r
{\r
// let's save original class name into xmlrpcval:\r
case 'NULL':\r
if (in_array('extension_api', $options))\r
{\r
- $xmlrpc_val = new xmlrpcval('', $GLOBALS['xmlrpcString']);\r
+ $xmlrpc_val = new xmlrpcval('', $xmlrpc->xmlrpcString);\r
}\r
else if (in_array('null_extension', $options))\r
{\r
- $xmlrpc_val = new xmlrpcval('', $GLOBALS['xmlrpcNull']);\r
+ $xmlrpc_val = new xmlrpcval('', $xmlrpc->xmlrpcNull);\r
}\r
else\r
{\r
case 'resource':\r
if (in_array('extension_api', $options))\r
{\r
- $xmlrpc_val = new xmlrpcval((int)$php_val, $GLOBALS['xmlrpcInt']);\r
+ $xmlrpc_val = new xmlrpcval((int)$php_val, $xmlrpc->xmlrpcInt);\r
}\r
else\r
{\r
*/\r
function php_xmlrpc_decode_xml($xml_val, $options=array())\r
{\r
- $GLOBALS['_xh'] = array();\r
- $GLOBALS['_xh']['ac'] = '';\r
- $GLOBALS['_xh']['stack'] = array();\r
- $GLOBALS['_xh']['valuestack'] = array();\r
- $GLOBALS['_xh']['params'] = array();\r
- $GLOBALS['_xh']['pt'] = array();\r
- $GLOBALS['_xh']['isf'] = 0;\r
- $GLOBALS['_xh']['isf_reason'] = '';\r
- $GLOBALS['_xh']['method'] = false;\r
- $GLOBALS['_xh']['rt'] = '';\r
+ $xmlrpc = Xmlrpc::instance();\r
+\r
+ $xmlrpc->_xh = array();\r
+ $xmlrpc->_xh['ac'] = '';\r
+ $xmlrpc->_xh['stack'] = array();\r
+ $xmlrpc->_xh['valuestack'] = array();\r
+ $xmlrpc->_xh['params'] = array();\r
+ $xmlrpc->_xh['pt'] = array();\r
+ $xmlrpc->_xh['isf'] = 0;\r
+ $xmlrpc->_xh['isf_reason'] = '';\r
+ $xmlrpc->_xh['method'] = false;\r
+ $xmlrpc->_xh['rt'] = '';\r
/// @todo 'guestimate' encoding\r
$parser = xml_parser_create();\r
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, true);\r
// What if internal encoding is not in one of the 3 allowed?\r
// we use the broadest one, ie. utf8!\r
- if (!in_array($GLOBALS['xmlrpc_internalencoding'], array('UTF-8', 'ISO-8859-1', 'US-ASCII')))\r
+ if (!in_array($xmlrpc->xmlrpc_internalencoding, array('UTF-8', 'ISO-8859-1', 'US-ASCII')))\r
{\r
xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, 'UTF-8');\r
}\r
else\r
{\r
- xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, $GLOBALS['xmlrpc_internalencoding']);\r
+ xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, $xmlrpc->xmlrpc_internalencoding);\r
}\r
xml_set_element_handler($parser, 'xmlrpc_se_any', 'xmlrpc_ee');\r
xml_set_character_data_handler($parser, 'xmlrpc_cd');\r
return false;\r
}\r
xml_parser_free($parser);\r
- if ($GLOBALS['_xh']['isf'] > 1) // test that $GLOBALS['_xh']['value'] is an obj, too???\r
+ if ($xmlrpc->_xh['isf'] > 1) // test that $xmlrpc->_xh['value'] is an obj, too???\r
{\r
- error_log($GLOBALS['_xh']['isf_reason']);\r
+ error_log($xmlrpc->_xh['isf_reason']);\r
return false;\r
}\r
- switch ($GLOBALS['_xh']['rt'])\r
+ switch ($xmlrpc->_xh['rt'])\r
{\r
case 'methodresponse':\r
- $v =& $GLOBALS['_xh']['value'];\r
- if ($GLOBALS['_xh']['isf'] == 1)\r
+ $v =& $xmlrpc->_xh['value'];\r
+ if ($xmlrpc->_xh['isf'] == 1)\r
{\r
$vc = $v->structmem('faultCode');\r
$vs = $v->structmem('faultString');\r
}\r
return $r;\r
case 'methodcall':\r
- $m = new xmlrpcmsg($GLOBALS['_xh']['method']);\r
- for($i=0; $i < count($GLOBALS['_xh']['params']); $i++)\r
+ $m = new xmlrpcmsg($xmlrpc->_xh['method']);\r
+ for($i=0; $i < count($xmlrpc->_xh['params']); $i++)\r
{\r
- $m->addParam($GLOBALS['_xh']['params'][$i]);\r
+ $m->addParam($xmlrpc->_xh['params'][$i]);\r
}\r
return $m;\r
case 'value':\r
- return $GLOBALS['_xh']['value'];\r
+ return $xmlrpc->_xh['value'];\r
default:\r
return false;\r
}\r
*/\r
function guess_encoding($httpheader='', $xmlchunk='', $encoding_prefs=null)\r
{\r
+ $xmlrpc = Xmlrpc::instance();\r
+\r
// discussion: see http://www.yale.edu/pclt/encoding/\r
// 1 - test if encoding is specified in HTTP HEADERS\r
\r
// Both RFC 2616 (HTTP 1.1) and 1945 (HTTP 1.0) clearly state that for text/xxx content types\r
// this should be the standard. And we should be getting text/xml as request and response.\r
// BUT we have to be backward compatible with the lib, which always used UTF-8 as default...\r
- return $GLOBALS['xmlrpc_defencoding'];\r
+ return $xmlrpc->xmlrpc_defencoding;\r
}\r
}\r
\r