Test With Legacy bundle

This commit is contained in:
Ghislain Loaec 2018-04-06 10:12:08 +02:00
parent 9312e4af6a
commit ae746087e6
15 changed files with 183 additions and 201 deletions

View File

@ -13,45 +13,27 @@
namespace BeSimple\SoapBundle;
use BeSimple\SoapCommon\Cache as BaseCache;
use BeSimple\SoapCommon\SoapOptions\SoapOptions;
use Exception;
/**
* @author Francis Besset <francis.besset@gmail.com>
*/
class Cache
{
public function __construct(SoapOptions $soapOptions)
public function __construct($cacheDisabled, $type, $directory, $lifetime = null, $limit = null)
{
if ($soapOptions->isWsdlCached()) {
$isEnabled = (bool)$soapOptions->isWsdlCached() ? BaseCache::ENABLED : BaseCache::DISABLED;
$isEnabled = (Boolean) $cacheDisabled ? BaseCache::DISABLED : BaseCache::ENABLED;
BaseCache::setEnabled($isEnabled);
BaseCache::setType($soapOptions->getWsdlCacheType());
BaseCache::setDirectory($soapOptions->getWsdlCacheDir());
} else {
BaseCache::setEnabled(BaseCache::DISABLED);
BaseCache::setType(SoapOptions::SOAP_CACHE_TYPE_NONE);
BaseCache::setDirectory(null);
}
BaseCache::setType($type);
BaseCache::setDirectory($directory);
if (null !== $lifetime) {
BaseCache::setLifetime($lifetime);
}
public function validateSettings(SoapOptions $soapOptions)
{
if ($soapOptions->isWsdlCached()) {
if (BaseCache::isEnabled() !== true) {
throw new Exception('WSDL cache could not be set');
}
if ($soapOptions->getWsdlCacheType() !== (int)BaseCache::getType()) {
throw new Exception('WSDL cache type could not be set, ini settings is: '.BaseCache::getType());
}
if ($soapOptions->getWsdlCacheDir() !== BaseCache::getDirectory()) {
throw new Exception('WSDL cache dir could not be set, real dir is: '.BaseCache::getDirectory());
}
} else {
if (BaseCache::isEnabled() !== false) {
throw new Exception('WSDL cache could not be turned off');
}
if (null !== $limit) {
BaseCache::setLimit($limit);
}
}
}

View File

@ -16,11 +16,10 @@ use BeSimple\SoapBundle\Handler\ExceptionHandler;
use BeSimple\SoapBundle\Soap\SoapRequest;
use BeSimple\SoapBundle\Soap\SoapResponse;
use BeSimple\SoapServer\SoapServerBuilder;
use Symfony\Component\Debug\Exception\FlattenException;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerAwareTrait;
use Symfony\Component\DependencyInjection\ContainerAware;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\FlattenException;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpKernel\Log\DebugLoggerInterface;
@ -29,10 +28,8 @@ use Symfony\Component\HttpKernel\Log\DebugLoggerInterface;
* @author Christian Kerl <christian-kerl@web.de>
* @author Francis Besset <francis.besset@gmail.com>
*/
class SoapWebServiceController implements ContainerAwareInterface
class SoapWebServiceController extends ContainerAware
{
use ContainerAwareTrait;
/**
* @var \SoapServer
*/
@ -67,7 +64,7 @@ class SoapWebServiceController implements ContainerAwareInterface
$this->serviceBinder = $webServiceContext->getServiceBinder();
$this->soapRequest = SoapRequest::createFromHttpRequest($this->container->get('request_stack')->getCurrentRequest());
$this->soapRequest = SoapRequest::createFromHttpRequest($this->container->get('request'));
$this->soapServer = $webServiceContext
->getServerBuilder()
->withSoapVersion11()
@ -141,8 +138,8 @@ class SoapWebServiceController implements ContainerAwareInterface
$request->query->remove('_besimple_soap_fault');
}
$server = SoapServerBuilder::createWithDefaults(__DIR__.'/../Handler/wsdl/exception.wsdl')
->withWsdl()
$server = SoapServerBuilder::createWithDefaults()
->withWsdl(__DIR__.'/../Handler/wsdl/exception.wsdl')
->withWsdlCacheNone()
->withHandler($handler)
->build()

View File

@ -12,7 +12,7 @@ namespace BeSimple\SoapBundle\Converter;
use BeSimple\SoapBundle\Soap\SoapRequest;
use BeSimple\SoapBundle\Soap\SoapResponse;
use BeSimple\SoapBundle\Util\StringUtility;
use BeSimple\SoapBundle\Util\String;
use BeSimple\SoapCommon\Converter\TypeConverterInterface;
/**
@ -40,7 +40,7 @@ class XopIncludeTypeConverter implements TypeConverterInterface
$ref = $include->getAttribute('href');
if (StringUtility::startsWith($ref, 'cid:')) {
if (String::startsWith($ref, 'cid:')) {
$cid = urldecode(substr($ref, 4));
return $request->getSoapAttachments()->get($cid)->getContent();

View File

@ -14,8 +14,6 @@ namespace BeSimple\SoapBundle\DependencyInjection;
use BeSimple\SoapCommon\Cache;
use BeSimple\SoapCommon\SoapOptions\SoapOptions;
use Carpages\Core\Entity\ContactPhone;
use Symfony\Component\Config\Definition\Processor;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\DependencyInjection\ContainerBuilder;
@ -43,7 +41,6 @@ class BeSimpleSoapExtension extends Extension
$loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
$loader->load('request.xml');
$loader->load('soap.xml');
$loader->load('loaders.xml');
$loader->load('converters.xml');
@ -57,7 +54,7 @@ class BeSimpleSoapExtension extends Extension
$this->registerCacheConfiguration($config['cache'], $container, $loader);
if (!empty($config['clients'])) {
$this->registerClientConfiguration($config, $container, $loader);
$this->registerClientConfiguration($config['clients'], $container, $loader);
}
$container->setParameter('besimple.soap.definition.dumper.options.stylesheet', $config['wsdl_dumper']['stylesheet']);
@ -72,9 +69,11 @@ class BeSimpleSoapExtension extends Extension
private function registerCacheConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader)
{
$loader->load('soap.xml');
$config['type'] = $this->getCacheType($config['type']);
foreach (array('type', 'file') as $key) {
foreach (array('type', 'lifetime', 'limit') as $key) {
$container->setParameter('besimple.soap.cache.'.$key, $config[$key]);
}
}
@ -83,33 +82,22 @@ class BeSimpleSoapExtension extends Extension
{
$loader->load('client.xml');
foreach ($config['clients'] as $client => $options) {
$soapClientOpts = new DefinitionDecorator('besimple.soap.client_options');
$soapOpts = new DefinitionDecorator('besimple.soap.options');
foreach ($config as $client => $options) {
$definition = new DefinitionDecorator('besimple.soap.client.builder');
$container->setDefinition(sprintf('besimple.soap.client.builder.%s', $client), $definition);
$soapClientOptsService = sprintf('besimple.soap.client_options.%s', $client);
$soapOptsService = sprintf('besimple.soap.options.%s', $client);
$definition->replaceArgument(0, $options['wsdl']);
// configure SoapClient
$definition = new DefinitionDecorator('besimple.soap.client');
$defOptions = $container
->getDefinition('besimple.soap.client.builder')
->getArgument(1);
$container->setDefinition(
sprintf('besimple.soap.client.%s', $client),
$definition
);
$container->setDefinition(
$soapClientOptsService,
$soapClientOpts
);
$container->setDefinition(
$soapOptsService,
$soapOpts
);
foreach (array('cache_type', 'user_agent') as $key) {
if (isset($options[$key])) {
$defOptions[$key] = $options[$key];
}
}
$definition->replaceArgument(0, new Reference($soapClientOptsService));
$definition->replaceArgument(1, new Reference($soapOptsService));
// configure proxy
$proxy = $options['proxy'];
if (false !== $proxy['host']) {
if (null !== $proxy['auth']) {
@ -120,58 +108,49 @@ class BeSimpleSoapExtension extends Extension
}
}
$proxy = $this->createClientProxy($client, $proxy, $container);
$soapClientOpts->setFactory([
'%besimple.soap.client_options_builder.class%',
'createWithProxy'
]);
$soapClientOpts->setArgument(0, new Reference($proxy));
$definition->addMethodCall('withProxy', array(
$proxy['host'], $proxy['port'],
$proxy['login'], $proxy['password'],
$proxy['auth']
));
}
// configure SoapOptions for client
$classMap = $this->createClientClassMap($client, $options['classmap'], $container);
$soapOpts->replaceArgument(0, $config['cache']['file']);
$soapOpts->replaceArgument(1, new Reference($classMap));
$soapOpts->replaceArgument(2, $this->getCacheType($config['cache']['type']));
if ($config['cache']['version'] == SoapOptions::SOAP_VERSION_1_1) {
$soapOpts->setFactory([
'%besimple.soap.options_builder.class%',
'createWithClassMapV11'
]);
if (isset($defOptions['cache_type'])) {
$defOptions['cache_type'] = $this->getCacheType($defOptions['cache_type']);
}
$definition->replaceArgument(1, $defOptions);
$classmap = $this->createClientClassmap($client, $options['classmap'], $container);
$definition->replaceArgument(2, new Reference($classmap));
$this->createClient($client, $container);
}
}
private function createClientClassMap($client, array $classmap, ContainerBuilder $container)
private function createClientClassmap($client, array $classmap, ContainerBuilder $container)
{
$definition = new DefinitionDecorator('besimple.soap.classmap');
$container->setDefinition(sprintf('besimple.soap.classmap.%s', $client), $definition);
if (!empty($classmap)) {
$definition->setMethodCalls(array(
array('__construct', array($classmap)),
array('set', array($classmap)),
));
}
return sprintf('besimple.soap.classmap.%s', $client);
}
private function createClientProxy($client, array $proxy, ContainerBuilder $container)
private function createClient($client, ContainerBuilder $container)
{
$definition = new DefinitionDecorator('besimple.soap.client.proxy');
$container->setDefinition(sprintf('besimple.soap.client.proxy.%s', $client), $definition);
$definition = new DefinitionDecorator('besimple.soap.client');
$container->setDefinition(sprintf('besimple.soap.client.%s', $client), $definition);
if ( ! empty($proxy)) {
$definition->replaceArgument(0, $proxy['host']);
$definition->replaceArgument(1, $proxy['port']);
$definition->replaceArgument(2, $proxy['login']);
$definition->replaceArgument(3, $proxy['password']);
$definition->replaceArgument(4, $proxy['auth']);
}
return sprintf('besimple.soap.client.proxy.%s', $client);
$definition->setFactory(array(
new Reference(sprintf('besimple.soap.client.builder.%s', $client)),
'build'
));
}
private function createWebServiceContext(array $config, ContainerBuilder $container)

View File

@ -64,10 +64,6 @@ class Configuration
->thenInvalid(sprintf('The cache type has to be either %s', implode(', ', $this->cacheTypes)))
->end()
->end()
->scalarNode('version')->defaultNull()->end()
->scalarNode('encoding')->defaultNull()->end()
->scalarNode('keepalive')->defaultNull()->end()
->scalarNode('file')->defaultNull()->end()
->scalarNode('lifetime')->defaultNull()->end()
->scalarNode('limit')->defaultNull()->end()
->end()

View File

@ -12,9 +12,9 @@
namespace BeSimple\SoapBundle\Handler;
use SoapFault;
use Symfony\Component\Debug\Exception\FlattenException;
use BeSimple\SoapServer\Exception\ReceiverSoapFault;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\FlattenException;
/**
* @author Francis Besset <francis.besset@gmail.com>
@ -44,8 +44,7 @@ class ExceptionHandler
$code = $this->exception->getStatusCode();
throw new SoapFault(
'receiver',
throw new ReceiverSoapFault(
isset(Response::$statusTexts[$code]) ? Response::$statusTexts[$code] : '',
null,
$this->details

View File

@ -4,26 +4,26 @@
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
<parameters>
<parameter key="besimple.soap.client.builder.class">BeSimple\SoapClient\SoapClientBuilder</parameter>
<parameter key="besimple.soap.client.class">BeSimple\SoapClient\SoapClient</parameter>
<parameter key="besimple.soap.client.proxy.class">BeSimple\SoapClient\SoapServerProxy\SoapServerProxy</parameter>
<parameter key="besimple.soap.client.builder.class">BeSimple\SoapBundle\Soap\SoapClientBuilder</parameter>
<parameter key="besimple.soap.classmap.class">BeSimple\SoapCommon\Classmap</parameter>
</parameters>
<services>
<service id="besimple.soap.client" class="%besimple.soap.client.class%" abstract="true">
<factory class="%besimple.soap.client.builder.class%" method="build" />
<argument type="service" id="besimple.soap.client_options" />
<argument type="service" id="besimple.soap.options" /> <!-- hack to load besimple cache configuration -->
<service id="besimple.soap.client.builder" class="%besimple.soap.client.builder.class%" abstract="true">
<argument /> <!-- wsdl URI -->
<argument type="collection">
<argument key="debug">%kernel.debug%</argument>
</argument>
<argument type="service" id="besimple.soap.classmap" />
<argument type="service" id="besimple.soap.converter.collection" />
<argument type="service" id="besimple.soap.cache" /> <!-- hack to load besimple cache configuration -->
</service>
<service id="besimple.soap.client.proxy" class="%besimple.soap.client.proxy.class%" abstract="true">
<argument id="$host" />
<argument id="$port" />
<argument id="$login" />
<argument id="$password" />
<argument id="$authenticationType" />
<service id="besimple.soap.client" class="%besimple.soap.client.builder.class%" abstract="true">
<factory class="besimple.soap.client.builder" method="build" />
</service>
<service id="besimple.soap.classmap" class="%besimple.soap.classmap.class%" abstract="true" />
</services>
</container>

View File

@ -4,13 +4,13 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd">
<route id="_webservice_call" path="/{webservice}">
<route id="_webservice_call" pattern="/{webservice}">
<default key="_controller">BeSimpleSoapBundle:SoapWebService:Call</default>
<default key="_format">xml</default>
<requirement key="_method">POST</requirement>
</route>
<route id="_webservice_definition" path="/{webservice}">
<route id="_webservice_definition" pattern="/{webservice}">
<default key="_controller">BeSimpleSoapBundle:SoapWebService:Definition</default>
<default key="_format">xml</default>
<requirement key="_method">GET</requirement>

View File

@ -4,28 +4,17 @@
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
<parameters>
<parameter key="besimple.soap.classmap.class">BeSimple\SoapCommon\ClassMap</parameter>
<parameter key="besimple.soap.client_options.class">BeSimple\SoapClient\SoapOptions\SoapClientOptions</parameter>
<parameter key="besimple.soap.client_options_builder.class">BeSimple\SoapClient\SoapClientOptionsBuilder</parameter>
<parameter key="besimple.soap.options.class">BeSimple\SoapCommon\SoapOptions\SoapOptions</parameter>
<parameter key="besimple.soap.options_builder.class">BeSimple\SoapCommon\SoapOptionsBuilder</parameter>
<parameter key="besimple.soap.cache.dir">%kernel.cache_dir%</parameter>
<parameter key="besimple.soap.cache.class">BeSimple\SoapBundle\Cache</parameter>
<parameter key="besimple.soap.cache.dir">%kernel.cache_dir%/besimple/soap</parameter>
</parameters>
<services>
<service id="besimple.soap.client_options" class="%besimple.soap.client_options.class%" abstract="true">
<!-- call the static method -->
<factory class="%besimple.soap.client_options_builder.class%" method="createWithDefaults" />
</service>
<service id="besimple.soap.classmap" class="%besimple.soap.classmap.class%" abstract="true" />
<service id="besimple.soap.options" class="%besimple.soap.options.class%" abstract="true">
<factory class="%besimple.soap.options_builder.class%" method="createWithClassMap" />
<argument>%besimple.soap.cache.file%</argument>
<argument type="service" id="besimple.soap.classmap" />
<service id="besimple.soap.cache" class="%besimple.soap.cache.class%">
<argument>%kernel.debug%</argument>
<argument>%besimple.soap.cache.type%</argument>
<argument>%besimple.soap.cache.dir%</argument>
<argument>%besimple.soap.cache.dir%/cache</argument>
<argument>%besimple.soap.cache.lifetime%</argument>
<argument>%besimple.soap.cache.limit%</argument>
</service>
</services>

View File

@ -15,7 +15,7 @@
<parameter key="besimple.soap.binder.request_header.documentwrapped.class">BeSimple\SoapBundle\ServiceBinding\DocumentLiteralWrappedRequestHeaderMessageBinder</parameter>
<parameter key="besimple.soap.binder.response.documentwrapped.class">BeSimple\SoapBundle\ServiceBinding\DocumentLiteralWrappedResponseMessageBinder</parameter>
<parameter key="besimple.soap.type.repository.class">BeSimple\SoapCommon\Definition\Type\TypeRepository</parameter>
<parameter key="besimple.soap.server.classmap.class">BeSimple\SoapCommon\ClassMap</parameter>
<parameter key="besimple.soap.server.classmap.class">BeSimple\SoapServer\Classmap</parameter>
</parameters>
<services>

View File

@ -7,7 +7,7 @@ Pre-existent Type
+------------------------------------------------+-----------------+
| Php Type | Value Type |
+================================================+=================+
| BeSimple\\SoapCommon\\Type\\KeyValue\\StringUtility | StringUtility |
| BeSimple\\SoapCommon\\Type\\KeyValue\\String | String |
+------------------------------------------------+-----------------+
| BeSimple\\SoapCommon\\Type\\KeyValue\\Boolean | Boolean |
+------------------------------------------------+-----------------+
@ -34,7 +34,7 @@ Controller
{
/**
* @Soap\Method("returnAssocArray")
* @Soap\Result(phpType = "BeSimple\SoapCommon\Type\KeyValue\StringUtility[]")
* @Soap\Result(phpType = "BeSimple\SoapCommon\Type\KeyValue\String[]")
*/
public function assocArrayOfStringAction()
{
@ -46,8 +46,8 @@ Controller
/**
* @Soap\Method("sendAssocArray")
* @Soap\Param("assocArray", phpType = "BeSimple\SoapCommon\Type\KeyValue\StringUtility[]")
* @Soap\Result(phpType = "BeSimple\SoapCommon\Type\KeyValue\StringUtility[]")
* @Soap\Param("assocArray", phpType = "BeSimple\SoapCommon\Type\KeyValue\String[]")
* @Soap\Result(phpType = "BeSimple\SoapCommon\Type\KeyValue\String[]")
*/
public function sendAssocArrayOfStringAction(array $assocArray)
{

View File

@ -1,36 +0,0 @@
<?php
namespace BeSimple\SoapBundle\Soap;
class SoapAttachmentList
{
private $soapAttachments;
/**
* @param SoapAttachment[] $soapAttachments
*/
public function __construct(array $soapAttachments = [])
{
$this->soapAttachments = $soapAttachments;
}
public function hasSoapAttachments()
{
return $this->soapAttachments !== null && count($this->soapAttachments) > 0;
}
public function getSoapAttachments()
{
return $this->soapAttachments;
}
public function getSoapAttachmentIds()
{
$ids = [];
foreach ($this->getSoapAttachments() as $soapAttachment) {
$ids[] = $soapAttachment->getId();
}
return $ids;
}
}

View File

@ -0,0 +1,77 @@
<?php
namespace BeSimple\SoapBundle\Soap;
use BeSimple\SoapCommon\Classmap;
use BeSimple\SoapCommon\Converter\TypeConverterCollection;
use BeSimple\SoapClient\SoapClientBuilder as BaseSoapClientBuilder;
class SoapClientBuilder extends BaseSoapClientBuilder
{
protected $soapClient;
public function __construct($wsdl, array $options, Classmap $classmap = null, TypeConverterCollection $converters = null)
{
parent::__construct();
$this->checkOptions($options);
$this
->withWsdl($wsdl)
->withTrace($options['debug'])
;
if (isset($options['user_agent'])) {
$this->withUserAgent($options['user_agent']);
}
if (isset($options['cache_type'])) {
$this->withWsdlCache($options['cache_type']);
}
if ($classmap) {
$this->withClassmap($classmap);
}
if ($converters) {
$this->withTypeConverters($converters);
}
}
public function build()
{
if (!$this->soapClient) {
$this->soapClient = parent::build();
}
return $this->soapClient;
}
protected function checkOptions(array $options)
{
$checkOptions = array(
'debug' => false,
'cache_type' => null,
'exceptions' => true,
'user_agent' => 'BeSimpleSoap',
);
// check option names and live merge, if errors are encountered Exception will be thrown
$invalid = array();
$isInvalid = false;
foreach ($options as $key => $value) {
if (!array_key_exists($key, $checkOptions)) {
$isInvalid = true;
$invalid[] = $key;
}
}
if ($isInvalid) {
throw new \InvalidArgumentException(sprintf(
'The "%s" class does not support the following options: "%s".',
get_class($this),
implode('\', \'', $invalid)
));
}
}
}

View File

@ -11,11 +11,11 @@
namespace BeSimple\SoapBundle\Util;
/**
* StringUtility provides utility methods for strings.
* String provides utility methods for strings.
*
* @author Christian Kerl <christian-kerl@web.de>
*/
class StringUtility
class String
{
/**
* Checks if a string starts with a given string.

View File

@ -13,8 +13,6 @@ namespace BeSimple\SoapBundle;
use BeSimple\SoapBundle\ServiceBinding\ServiceBinder;
use BeSimple\SoapCommon\Converter\TypeConverterCollection;
use BeSimple\SoapCommon\SoapOptionsBuilder;
use BeSimple\SoapServer\SoapServerOptionsBuilder;
use BeSimple\SoapWsdl\Dumper\Dumper;
use BeSimple\SoapServer\SoapServerBuilder;
use Symfony\Component\Config\ConfigCache;
@ -46,7 +44,7 @@ class WebServiceContext
if (null === $this->serviceDefinition) {
$cache = new ConfigCache(sprintf('%s/%s.definition.php', $this->options['cache_dir'], $this->options['name']), $this->options['debug']);
if ($cache->isFresh()) {
$this->serviceDefinition = include $cache->getPath();
$this->serviceDefinition = include (string) $cache;
} else {
if (!$this->loader->supports($this->options['resource'], $this->options['resource_type'])) {
throw new \LogicException(sprintf('Cannot load "%s" (%s)', $this->options['resource'], $this->options['resource_type']));
@ -84,7 +82,7 @@ class WebServiceContext
$cache->write($dumper->dump());
}
return $cache->getPath();
return (string) $cache;
}
public function getServiceBinder()
@ -104,14 +102,15 @@ class WebServiceContext
public function getServerBuilder()
{
if (null === $this->serverBuilder) {
$soapServerBuilder = new SoapServerBuilder();
$this->serverBuilder = $soapServerBuilder->build(
SoapServerOptionsBuilder::createWithDefaults(),
SoapOptionsBuilder::createWithClassMap(
$this->getWsdlFile(),
$this->getServiceDefinition()->getTypeRepository()->getClassmap()
)
);
$this->serverBuilder = SoapServerBuilder::createWithDefaults()
->withWsdl($this->getWsdlFile())
->withClassmap($this->getServiceDefinition()->getTypeRepository()->getClassmap())
->withTypeConverters($this->converters)
;
if (null !== $this->options['cache_type']) {
$this->serverBuilder->withWsdlCache($this->options['cache_type']);
}
}
return $this->serverBuilder;