2009-10-09 5 views
0

J'ai Zend_Soap_Server. Cela devrait être testé. Un problème - les tests unitaires et les modes de développement devraient fonctionner avec différentes bases de données. Il peut se faire via .htaccess:Est-ce que Zend_Soap_Client peut définir un user-agent personnalisé?

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

Il fonctionnerait très bien pour moi, j'utilise Zend_Soap_Client tout comme pour le mode de développement/production, et ajoutez paramètre supplémentaire pour les tests. Il n'y a pas de changements spéciaux dans le code source pour tester le support. La question - je ne peux pas définir agent utilisateur personnalisé pour (Zend_Soap_Client Il semble que ce paramètre est pas pris en charge ou non documenté j'ai essayé de faire la même chose par l'intermédiaire mod_rewrite et en ajoutant

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

mais il faut changer Zend_Soap_Server pour supporter testing Query_String, sinon les actions soap ne sont pas reflétées avec 'testing' en dehors de wsdl, ce qui n'est pas bon à mon avis

Je suis d'accord c'est un peu plus lié aux tests d'acceptation, pas unité (j'ai des tests pour des classes telles que $server->setClass('classWS')), mais de toute façon, j'en ai besoin indépendamment de la terminologie

Alors, ce qui fonctionne très bien pour moi est quelque chose comme:

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

dans les tests.

Répondre

2

C'est possible mais c'est un peu plus compliqué que de simplement définir une option. La clé est un contexte de flux . La fonction requise est stream_context_create() - veuillez également regarder "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:

Comme le contexte de flux de l'agent utilisateur semble obtenir une autre option est substituée à utiliser le user_agent -option de SoapClient lui-même. Mais c'est un peu plus compliqué car cette option n'est pas exposée par 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); 

Le code ci-dessus est plus ou moins un extrait de ce qui se passe dans Zend_Soap_Client::_initSoapClientObject() initialisant la valeur par défaut SoapClient lorsque aucun objet personnalisé est enregistré.

+0

Merci pour votre réponse! Malheureusement, j'ai $ _SERVER ['HTTP_USER_AGENT'] => "PHP-SOAP/5.2.6-3ubuntu4.2" même si user_agent est défini via stream_context_create (j'ai essayé vos deux cas). Je suppose, c'est parce que: header string En-têtes supplémentaires à envoyer lors de la demande. Les valeurs de cette option remplacent les autres valeurs (telles que User-agent :, Host: et Authentication :). Peut être Zend ajoute l'option d'en-tête, mais je ne suis pas sûr – Alexey

+0

Bonjour Alexey, j'ai ajouté une autre option que vous pouvez essayer. Il semble que l'utilisateur-agent transmis via un contexte de flux soit surchargé par le 'SoapClient' lui-même. –

+0

Merci encore! J'ai réalisé que l'option ['http'] ['user_agent'] n'a pas d'impact sur le php SoapClient natif (donc, Zend_Soap_Client n'est pas une raison en soi). Je ne suis pas sûr est-ce que le comportement souhaité ou non, mais je pense qu'il est logique de simplement signaler à l'équipe de Zend et d'activer l'option de construction 'user_agent' Zend_Soap_Client (parce que cela fonctionnerait bien - j'ai vérifié). Quoi qu'il en soit, merci pour votre solution - ça marche même si ça ne semble pas si joli!Mon – Alexey

Questions connexes