X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=src%2FServer.php;h=e859c7b2ddd9860279e283543acc475e5aeb93f8;hb=b337d292eb5b5656d27a2fc9ab6796be300c59a3;hp=d5134baa4e4667cfd00899fca1dda1f82f75632f;hpb=f9a321ddc732d3f41184d2e968fd9d221ab3b6d5;p=plcapi.git diff --git a/src/Server.php b/src/Server.php index d5134ba..e859c7b 100644 --- a/src/Server.php +++ b/src/Server.php @@ -11,6 +11,10 @@ use PhpXmlRpc\Helper\XMLParser; */ class Server { + protected static $logger; + protected static $parser; + protected static $charsetEncoder; + /** * Defines how functions in dmap will be invoked: either using an xmlrpc request object * or plain php values. @@ -95,6 +99,45 @@ class Server protected static $_xmlrpcs_occurred_errors = ''; protected static $_xmlrpcs_prev_ehandler = ''; + public function getLogger() + { + if (self::$logger === null) { + self::$logger = Logger::instance(); + } + return self::$logger; + } + + public static function setLogger($logger) + { + self::$logger = $logger; + } + + public function getParser() + { + if (self::$parser === null) { + self::$parser = new XMLParser(); + } + return self::$parser; + } + + public static function setParser($parser) + { + self::$parser = $parser; + } + + public function getCharsetEncoder() + { + if (self::$charsetEncoder === null) { + self::$charsetEncoder = Charset::instance(); + } + return self::$charsetEncoder; + } + + public function setCharsetEncoder($charsetEncoder) + { + self::$charsetEncoder = $charsetEncoder; + } + /** * @param array[] $dispatchMap the dispatch map with definition of exposed services * Array keys are the names of the method names. @@ -194,7 +237,7 @@ class Server $out .= "\n"; } if (static::$_xmlrpc_debuginfo != '') { - $out .= "\n"; + $out .= "\n"; // NB: a better solution MIGHT be to use CDATA, but we need to insert it // into return payload AFTER the beginning tag //$out .= "', ']_]_>', static::$_xmlrpc_debuginfo) . "\n]]>\n"; @@ -292,7 +335,7 @@ class Server header('Content-Length: ' . (int)strlen($payload)); } } else { - Logger::instance()->errorLog('XML-RPC: ' . __METHOD__ . ': http headers already sent before response is fully generated. Check for php warning or error messages'); + $this->getLogger()->errorLog('XML-RPC: ' . __METHOD__ . ': http headers already sent before response is fully generated. Check for php warning or error messages'); } print $payload; @@ -392,7 +435,7 @@ class Server // check if $_SERVER is populated: it might have been disabled via ini file // (this is true even when in CLI mode) if (count($_SERVER) == 0) { - Logger::instance()->errorLog('XML-RPC: ' . __METHOD__ . ': cannot parse request headers as $_SERVER is not populated'); + $this->getLogger()->errorLog('XML-RPC: ' . __METHOD__ . ': cannot parse request headers as $_SERVER is not populated'); } if ($this->debug > 1) { @@ -513,7 +556,7 @@ class Server if (extension_loaded('mbstring')) { $data = mb_convert_encoding($data, 'UTF-8', $reqEncoding); } else { - Logger::instance()->errorLog('XML-RPC: ' . __METHOD__ . ': invalid charset encoding of received request: ' . $reqEncoding); + $this->getLogger()->errorLog('XML-RPC: ' . __METHOD__ . ': invalid charset encoding of received request: ' . $reqEncoding); } } } @@ -524,13 +567,14 @@ class Server // This allows to send data which is native in various charset, // by extending xmlrpc_encode_entities() and setting xmlrpc_internalencoding if (!in_array(PhpXmlRpc::$xmlrpc_internalencoding, array('UTF-8', 'ISO-8859-1', 'US-ASCII'))) { + /// @todo emit a warning $options = array(XML_OPTION_TARGET_ENCODING => 'UTF-8'); } else { $options = array(XML_OPTION_TARGET_ENCODING => PhpXmlRpc::$xmlrpc_internalencoding); } - $xmlRpcParser = new XMLParser($options); - $xmlRpcParser->parse($data, $this->functions_parameters_type, XMLParser::ACCEPT_REQUEST); + $xmlRpcParser = $this->getParser(); + $xmlRpcParser->parse($data, $this->functions_parameters_type, XMLParser::ACCEPT_REQUEST, $options); if ($xmlRpcParser->_xh['isf'] > 2) { // (BC) we return XML error as a faultCode preg_match('/^XML error ([0-9]+)/', $xmlRpcParser->_xh['isf_reason'], $matches); @@ -642,7 +686,7 @@ class Server // verify that function to be invoked is in fact callable if (!is_callable($func)) { - Logger::instance()->errorLog("XML-RPC: " . __METHOD__ . ": function '$funcName' registered as method handler is not callable"); + $this->getLogger()->errorLog("XML-RPC: " . __METHOD__ . ": function '$funcName' registered as method handler is not callable"); return new Response( 0, PhpXmlRpc::$xmlrpcerr['server_error'], @@ -665,7 +709,7 @@ class Server $r = call_user_func($func, $req); } if (!is_a($r, 'PhpXmlRpc\Response')) { - Logger::instance()->errorLog("XML-RPC: " . __METHOD__ . ": function '$funcName' registered as method handler does not return an xmlrpc response object but a " . gettype($r)); + $this->getLogger()->errorLog("XML-RPC: " . __METHOD__ . ": function '$funcName' registered as method handler does not return an xmlrpc response object but a " . gettype($r)); if (is_a($r, 'PhpXmlRpc\Value')) { $r = new Response($r); } else { @@ -772,7 +816,13 @@ class Server return (strpos($methName, "system.") === 0); } - /* Functions that implement system.XXX methods of xmlrpc servers */ + /** + * @return array[] + */ + public function getDispatchMap() + { + return $this->dmap; + } /** * @return array[] @@ -819,6 +869,8 @@ class Server ); } + /* Functions that implement system.XXX methods of xmlrpc servers */ + /** * @return array[] */ @@ -1118,7 +1170,10 @@ class Server // The previous error handler was the default: all we should do is log error // to the default error log (if level high enough) if (ini_get('log_errors') && (intval(ini_get('error_reporting')) & $errCode)) { - Logger::instance()->errorLog($errString); + if (self::$logger === null) { + self::$logger = Logger::instance(); + } + self::$logger->errorLog($errString); } } else { // Pass control on to previous error handler, trying to avoid loops...