|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2006-03-06 13:50 UTC] ilya at iponweb dot net
Description:
------------
When calling SoapServer::handle() it exits after processing the SOAP request if request handler returns a SoapFault object. It makes impossible to do any work on the SOAP server side after processing requests if they result in SoapFault.
I belive exactly the same issue was reported in bug report #31993 but for some reason it was closed without actually fixing the problem in the soap extension. I could reproduce the problem with PHP 5.1.1 and with PHP snapshot 5.1-200603061130.
The test code demostrates this problem. It is a simple soap server with two remotly callable functions: test1 and test2. The first of them simply returns a string, the second returns a soap fault object. The server is supposed to write a string to a log file after processing a request. If you call remotly test1 function then you can see the string in the log, if you call remotly test2 function then the log file is empty.
Reproduce code:
---------------
<?php
$server = new SoapServer(null, array('uri' => "http://test-uri/"));
$h = fopen("/tmp/soap.log", "w");
$server->addFunction(array('test1', 'test2'));
$server->handle();
fputs($h, 'TEST');
fclose($h);
function test1() {
return "test1";
}
function test2() {
return new SoapFault("test2", "test2");
}
?>
Expected result:
----------------
A log message in file /tmp/soap.log
Actual result:
--------------
Nothing when calling remotly 'test2' function.
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Fri Oct 24 16:00:02 2025 UTC |
I am still having this problem. I don't think this is solved I am using PHP/5.3.3-1ubuntu9.3 When using SoapServer in WSDL-mode and let it handle a request which does not match the wsdl I get a SOAP-ENV:Fault directly in my soap-client (AND sometimes a stack-trace! which is really problematic). I am not able to intercept this fault-response (let alone the stacktrace) in php (with try/catch and ob_get_clean) class SoapServerAdapter implements SoapProcessor { /** * The soapServer instance * * @var SoapServer */ protected $soapServer; /** * @param SoapServer $soapServer */ public function __construct(SoapServer $soapServer) { $this->soapServer = $soapServer; } /* * Call the configured soap server, return the generated response. */ public function process(sfWebRequest $request) { ob_start(); $this->soapServer->handle($request->getContent()); $responseMessage = ob_get_clean(); return 'intercepted with ob_get: '.$responseMessage; } } public function handle(sfWebRequest $request) { $soapServer = new SoapServer($this->wsdl); $soapProcessor = new SoapProcessor($soapServer); try { $response = $soapProcessor->process($request); echo $response; } catch (Exception $e) { // TODO: handle errors, like 404 die('unforntunately I never get here!); } }Regarding the fatal Error, this happens specifically when calling a procedure, not defined in the wsdl (although I sometimes do get a soap-env:fault in return). Restarting apache solves the fatal, however it should not happen at all of course! Ps. I want to catch these soap-Faults because I want to add WS-A and WS-S headers and want to do some logging afterwards. A strack trace of the fatal: Fatal error: Procedure 'NonExistingProcedureFromSoapRequestMessage' not present in /home/leree/workspace/trunk/symfony/plugins/soSoapServerPlugin/lib/WebService/new/soSoapServerAdapter.php on line 28 Call Stack: 0.0000 636712 1. {main}() /home/leree/workspace/trunk/symfony/web/services_dev.php:0 0.0270 3826776 2. sfContext->dispatch() /home/leree/workspace/trunk/symfony/web/services_dev.php:15 0.0270 3826856 3. soSoapController->dispatch() /home/leree/workspace/trunk/symfony/lib/vendor/symfony/lib/util/sfContext.class.php:170 0.0345 4159040 4. soSoapTrafficLogInterceptor->process() /home/leree/workspace/trunk/symfony/plugins/soSoapServerPlugin/lib/controller/soSoapController.class.php:34 0.0348 4159792 5. soSoapWsaInterceptor->process() /home/leree/workspace/trunk/symfony/plugins/soSoapServerPlugin/lib/WebService/new/soSoapTrafficLogInterceptor.php:18 0.0354 4160744 6. soSoapAdapterResolver->process() /home/leree/workspace/trunk/symfony/plugins/soSoapServerPlugin/lib/WebService/new/soSoapWsaInterceptor.php:51 0.0354 4160880 7. soSoapServerAdapter->process() /home/leree/workspace/trunk/symfony/plugins/soSoapServerPlugin/lib/WebService/new/soSoapAdapterResolver.php:30 0.0354 4202736 8. SoapServer->handle() /home/leree/workspace/trunk/symfony/plugins/soSoapServerPlugin/lib/WebService/new/soSoapServerAdapter.php:28 line 28 of this soapServerAdapter is the line where I call: $this->soapServer->handle($request->getContent()); wrapped in the ob_start/ob_get_clean functions