Может ли Zend_Soap_Client установить пользовательский агент пользователя? - PullRequest
0 голосов
/ 09 октября 2009

У меня есть Zend_Soap_Server. Это должно быть проверено. Одна проблема - юнит-тестирование и режимы разработки должны работать с разными базами данных. Это можно сделать через .htaccess:

SetEnvIfNoCase User-Agent (.*) APPLICATION_ENV=development
SetEnvIfNoCase User-Agent testing APPLICATION_ENV=testing

Для меня это будет нормально, я использую Zend_Soap_Client для разработки / производства и добавляю дополнительный параметр для тестирования. Особых изменений в исходном коде для поддержки тестирования нет. Проблема - я не могу установить пользовательский агент для ( Zend_Soap_Client Кажется, этот параметр не поддерживается или не задокументирован. Я пытался сделать то же самое через mod_rewrite и добавив

new Zend_Soap_Client('...?wsdl&testing');

но для этого требуется изменить Zend_Soap_Server для поддержки тестирования Query_String, в противном случае действия мыла не отражаются при «тестировании» вне wsdl. На мой взгляд, это нехорошо.

Я согласен, что это больше связано с приемочным тестированием, а не с единичным тестом (у меня есть тесты для таких классов, как $server->setClass('classWS')), но в любом случае он мне нужен независимо от терминологии.

Итак, что бы хорошо для меня работало, это что-то вроде:

new Zend_Soap_Client($wsdl, array('useragent' => 'testing'));

в тестах.

1 Ответ

2 голосов
/ 09 октября 2009

Это возможно, но это немного сложнее, чем просто установка опции. Ключ - контекст потока . Обязательная функция: stream_context_create(). Пожалуйста, обратите внимание на «Параметры контекста HTTP» .

$context = stream_context_create(array(
    'http' => array(
        'user_agent' => 'testing'
    )
);
$client = new Zend_Soap_Client($wsdl, array('stream_context' => $context));

// or set option after instatiation
$client->setStreamContext($context);

EDIT:

Поскольку пользовательский агент потокового контекста кажется переопределенным, другой вариант - использовать user_agent -опцию SoapClient. Но это немного сложнее, так как эта опция не доступна Zend_Soap_Client.

$client = new Zend_Soap_Client($wsdl);
$options = array_merge($client->getOptions(), array(
    'trace'      => true,
    'user_agent' => 'testing'
));
$soapClient = new Zend_Soap_Client_Common(array($client, '_doRequest'), $wsdl, $options);
$client->setSoapClient($soapClient);

Приведенный выше код является более или менее выдержкой того, что происходит в Zend_Soap_Client::_initSoapClientObject(), который инициализирует значение по умолчанию SoapClient, когда пользовательский объект не зарегистрирован.

...