2009-10-09 2 views
0

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

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'); 
.

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

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

Итак, что будет работать нормально для меня это что-то вроде:

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

в испытаниях.

ответ

2

Возможно, но это немного сложнее, чем просто установка опции. Ключ представляет собой контекст . Требуемая функция: stream_context_create() - пожалуйста, также взгляните на "HTTP context options".

$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 -Option самого 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, когда нет пользовательского объекта не зарегистрирован.

+0

Спасибо за ваш ответ! К сожалению, у меня есть $ _SERVER ['HTTP_USER_AGENT'] => "PHP-SOAP/5.2.6-3ubuntu4.2", даже если user_agent определен через stream_context_create (я пробовал оба ваших случая). Мое предположение, потому что: строка заголовка Дополнительные заголовки, которые будут отправлены во время запроса. Значения в этой опции переопределяют другие значения (такие как User-agent:, Host :, и Authentication :). Может быть, Zend добавляет параметр заголовка, но я не уверен – Alexey

+0

Привет, Алексей, я добавил еще один вариант, который вы можете попробовать. Кажется, что пользовательский агент, прошедший через контекст потока, получает избыточность самим «SoapClient». –

+0

Еще раз спасибо! Я понял, что опция ['http'] ['user_agent'] не влияет на собственный php SoapClient (так что Zend_Soap_Client сам по себе не является причиной). Я не уверен, что это желаемое поведение или нет, но в любом случае я думаю, что мне нужно просто сообщить команде Zend и спросить о том, чтобы включить параметр конструкции user_agent Zend_Soap_Client (потому что он будет работать нормально - я проверил). Во всяком случае, спасибо за ваше решение - он работает, даже если кажется не очень красивым! – Alexey

Смежные вопросы