Подчеркивание Zend_XmlRpc_Client в имени хоста - PullRequest
2 голосов
/ 05 августа 2011

Возникла проблема с 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 ]

1 голос
/ 05 августа 2011

С 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 (www) в домене example.com.

Неверное подчеркивание в имени хоста, и валидатор Zend Framework работает правильно.

1 голос
/ 05 августа 2011

Я только что проверил в версии 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, а затем на Microsoft с NetBIOS, почему подчеркивания, хотя и не разрешены, «используются» в именах локальных хостов.

Как бывший серверный инженер, я видел много Интранет в крупных компаниях, и все они свободно использовали подчеркивания в именах хостов. Администраторы OS / 2 и Windows по незнанию использовали их в схеме именования DNS. Вот почему все браузеры поддерживают его, все веб-серверы поддерживают.

...