Короткая версия
Я хочу расширить SoapClient
, чтобы он делал это внутренне при доступе к WSDL:
curl -L -E /location/of/cert.pem -c /tmp/location/of/cookie.jar https://web-service-provider/servicename?wsdl
Длинная версия
У меня естьSOAP-запрос похож на этот:
$serviceUrl = 'https://service-url';
$wsdl = $serviceUrl . '?wsdl';
$proxyServiceUrl = 'http://localhost/myproxy.php?url=$serviceUrl';
$proxyWsdl = 'http://localhost/myproxy.php?url=$wsdl';
$options = array(
'cache_wsdl' => WSDL_CACHE_NONE,
'encoding' => 'utf-8',
'soap_version' => SOAP_1_1,
'exceptions' => true,
'trace' => true,
'location' => $proxyServiceUrl
);
$client = new SoapClient($proxyWsdl, $options);
$params = array( /* */ );
$client->someOperation($params);
Как видите, все довольно стандартно, кроме прокси-бита.
Причина прокси
Я написал прокси-сервер, чтобы выполнить требование поставщика веб-служб о том, что все конечные точки, включая WSDL, должны обрабатываться через систему аутентификации, называемую siteminder.
Функция прокси довольно проста, если она написанав командной строке linux curl это будет примерно так:
curl -L -E /location/of/cert.pem -c /tmp/location/of/cookie.jar https://web-service-provider/servicename?wsdl
Если быть точным:
* Follow all redirections
* specify location of .pem file (and password)
* specify location of cookie jar
Это все отлично работает:)
НО недавно поставщик услуг решил изменить свой WSDL.
Теперь он импортирует файлы схемы (.xsd
), что не так уж и плохо, за исключением того, что это относительно WSDL.
Относительно файла WSDL означает, что синтаксический анализатор SoapClient
теперь ищет файлы схемы из местоположения прокси.ОШИБКА, не могу найти!
Подробнее об этой проблеме здесь:
php SoapClient завершается ошибкой при передаче wsdl с относительными схемами путей
Итак, мой вопрос:
Как мне переписать SoapClient
(конечно, расширив его), чтобы все равно проходить аутентификацию на уровне сайта, но без необходимости проходить через этот дополнительный прокси?
Мои первоначальные мысли таковы, что каким-то образом мне нужно переписать функцию доступа к URI (если она существует), но без особого документирования в этой области я не уверен, с чего начать.
В качестве альтернативы, я мог бы иметьвзломать SoapServer
как-нибудь.
Буду признателен за любую помощь, которую я могу получить, включая указатели на любую документацию по внутренним компонентам SoapClient
.