Может ли Zend_Soap_Client установить собственный пользовательский агент?

У меня есть 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'));

в тестах.


person Alexey    schedule 09.10.2009    source источник


Ответы (1)


Это возможно, но это немного сложнее, чем просто установить параметр. Ключом является контекст потока. Требуется функция 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);

ИЗМЕНИТЬ:

Поскольку пользовательский агент контекста потока, похоже, переопределяется, другой вариант - использовать параметр 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 по умолчанию, когда пользовательский объект не зарегистрирован.

person Stefan Gehrig    schedule 09.10.2009
comment
Спасибо за ваш ответ! К сожалению, у меня есть $_SERVER['HTTP_USER_AGENT'] => PHP-SOAP/5.2.6-3ubuntu4.2, даже если user_agent определен через stream_context_create (я пробовал оба ваших случая). Я предполагаю, что это потому, что: строка заголовка Дополнительные заголовки, которые будут отправлены во время запроса. Значения в этом параметре переопределяют другие значения (такие как User-agent:, Host: и Authentication:). Может быть, Zend добавляет опцию заголовка, но я не уверен - person Alexey; 12.10.2009
comment
Привет Алексей, я добавил еще один вариант, вы можете попробовать. Кажется, что пользовательский агент, переданный через контекст потока, переопределяется самим SoapClient. - person Stefan Gehrig; 12.10.2009
comment
Еще раз спасибо! Я понял, что параметр ['http']['user_agent'] не влияет на собственный php SoapClient (так что Zend_Soap_Client сам по себе не является причиной). Я не уверен, является ли это желаемым поведением или нет, но в любом случае я думаю, что имеет смысл просто сообщить команде Zend и спросить о включении опции конструкции Zend_Soap_Client 'user_agent' (потому что это будет работать нормально - я проверил). В любом случае, спасибо за ваше решение - оно работает, даже если кажется не таким красивым! - person Alexey; 12.10.2009
comment
Моя окончательная проверка (без Zend): $opts = array('http' =› array( 'user_agent' =› 'testing') ); $context = stream_context_create($opts); $client = new SoapClient($wsdl, array( 'context_stream' => $context // не изменяет user-agent //'user_agent' => 'testing' // раскомментируйте - работайте как надо! ) ); ... Итак, я понятия не имею, почему Zend запретил эту опцию. - person Alexey; 12.10.2009
comment
Это было исправлено в r18569 магистрали Zend Framework и станет частью следующих выпусков Framework (1.9.5 или 1.10.0). - person Stefan Gehrig; 16.10.2009