Zend_XmlRpc_Client在主机名中加下下划线

时间:2011-08-04 20:04:06

标签: php zend-framework url xml-rpc hostname

遇到Zend的问题,因为它抛出错误。我相信它是由于主机名中的下划线,因为Zend对URL进行了一些验证。

我有一个Python客户端,它具有相同的基本功能,并且按预期工作。

想知道PHP是否有解决方法

错误:

Fatal error: Uncaught exception 'Zend_Uri_Exception' with message 'Invalid URI supplied' in /usr/share/php/libzend-framework-php/Zend/Uri/Http.php:156
Stack trace:
#0 /usr/share/php/libzend-framework-php/Zend/Uri.php(143): Zend_Uri_Http->__construct('http', '//local_server_f...')
#1 /usr/share/php/libzend-framework-php/Zend/Http/Client.php(270): Zend_Uri::factory('http://local_ser...')
#2 /usr/share/php/libzend-framework-php/Zend/XmlRpc/Client.php(266): Zend_Http_Client->setUri('http://local_ser...')
#3 /usr/share/php/libzend-framework-php/Zend/XmlRpc/Client.php(361): Zend_XmlRpc_Client->doRequest(Object(Zend_XmlRpc_Request))
#4 /usr/share/php/libzend-framework-php/Zend/XmlRpc/Client/ServerProxy.php(93): Zend_XmlRpc_Client->call('system.multical...', Array)
#5 [internal function]: Zend_XmlRpc_Client_ServerProxy->__call('multicall', Array)
#6 /path/to/xmlrpc.client.php(21): Zend_XmlRpc_Client_ServerProxy->multicall(Array)
#7 {main}
  thrown in /usr/share/php/libzend-framework-php/Zend/Uri/Http.php on line 156

PHP:

ini_set("include_path", "/usr/share/php/libzend-framework-php");
require_once('Zend/XmlRpc/Client.php');

$server = new Zend_XmlRpc_Client('http://local_server_foo/xmlrpc.server.php');

// Get the HTTP Client used by the XMLRPC client and Increase the HTTP timeout
$server->getHttpClient()->setConfig(array('timeout'=>30)); 

$client = $server->getProxy(); 

$request = array(
    array(
        'methodName' => 'system.listMethods', 
        'params'     => array() 
    )
);

try {
    $response = $client->system->multicall($request); 
    echo print_r($response,true);
} catch (Zend_XmlRpc_Client_HttpException $e) {
    echo 'HTTP Exception: '."\n";
    echo $e->getCode();
    echo $e->getMessage();
} catch (Zend_XmlRpc_Client_FaultException $e) {
    echo 'Fault Exception: '."\n";
    echo $e->getCode();
    echo $e->getMessage();
}

Python(这可行):

#!/usr/bin/python

import xmlrpclib

servAddr = "http://local_server_foo/xmlrpc.server.php"

client = xmlrpclib.ServerProxy(servAddr)

print

methods = client.system.listMethods()
for m in methods:
    print m + "\tHelp Documentation: " + client.system.methodHelp(m)
    print

2 个答案:

答案 0 :(得分:1)

我刚刚检查了1.11.9版,但没有人抱怨过;也许我应该最终提交错误报告。我自己修复/更新缺少下划线的Zend_Validate_Hostname类,如下所示。它位于isValid()方法中,具体取决于您在第621行(1.11.2)到655(1.11.9)的版本。

旧行:

$regexLocal = '/^(([a-zA-Z0-9\x2d]{1,63}\x2e)*[a-zA-Z0-9\x2d]{1,63}){1,254}$/';
$status = @preg_match($regexLocal, $value);

新行:请注意更改x5f

$regexLocal = '/^(([a-zA-Z0-9\x2d\x5f]{1,63}\x2e)*[a-zA-Z0-9\x2d]{1,63}){1,254}$/';
$status = @preg_match($regexLocal, $value);

UDPATE 让我们改进一下:

正如@Just H在他的回答中指出的那样,不允许使用下划线,但它们仍然被广泛使用。让我们把这归咎于IBM及后来的微软使用NetBIOS,为什么下划线(尽管不被允许)在本地主机名中被“使用”。

作为一名前服务器工程师,我在大公司看到过很多内部网,他们都在主机名中大量使用下划线。 OS / 2和Windows管理员在DNS命名方案中不知不觉地使用了它们。这就是所有浏览器都支持它的原因,所有的Web服务器都支持它。

答案 1 :(得分:1)

来自http://en.wikipedia.org/wiki/Hostname(链接到相关RFC):

  

协议授权的互联网标准(征求意见)   组件主机名标签可能只包含ASCII字母'a'   通过'z'(以不区分大小写的方式),数字'0'到   '9'和连字符(' - ')。主机名的原始规范   RFC 952,要求标签不能以数字或带数字开头   连字符,不得以连字符结尾。但是,随后   规范(RFC 1123)允许主机名标签开头   数字。没有其他符号,标点字符或空格   允许的。

     

虽然主机名可能不包含其他字符,例如   下划线字符(_),其他DNS名称可能包含   下划线。[3] DomainKeys和服务记录等系统使用   强调作为一种手段,以确保他们的特殊性质不是   与主机名混淆。例如,_http._sctp.www.example.com   指定支持SCTP的Web服务器主机的服务指针(www)   在域example.com中。

主机名中有下划线无效,Zend Framework验证器工作正常。