Compare commits
156 Commits
Author | SHA1 | Date | |
---|---|---|---|
1fa5c8a15e | |||
813dd52d70 | |||
8a40d23a94 | |||
5d335f2ca9 | |||
9d6468d0a6 | |||
9786f291b0 | |||
750db6692b | |||
|
9f7b7f40b8 | ||
|
87947a1e7b | ||
e024833d48 | |||
fc44014790 | |||
7ba9c4048c | |||
f0733bd671 | |||
f5e1be09de | |||
df3d75047f | |||
87350704d3 | |||
85f86469ab | |||
e1a35d1e1e | |||
30850d7a01 | |||
77403fcfbb | |||
dc63ba20e4 | |||
dad2b76165 | |||
a1695680ae | |||
95706abbd7 | |||
6d5f9ff9e5 | |||
914acccf1d | |||
0c94185907 | |||
aa0b750f47 | |||
|
cc83e1e6db | ||
|
412e7f16c9 | ||
|
729a2bc8df | ||
|
b8bf76aeb9 | ||
|
a3d691261c | ||
|
6cf62100a4 | ||
|
2e9dc9a34d | ||
|
95a91bb8bb | ||
|
ec0004ea36 | ||
|
00101ff7fb | ||
|
ef81da77ea | ||
|
54e9e0ed05 | ||
|
679b44ba13 | ||
|
a7a49b793a | ||
|
d1f5c1f674 | ||
|
fea1093bed | ||
|
9fc58e4388 | ||
|
a7c610b767 | ||
|
2b8f75b4ae | ||
|
6718703ba5 | ||
|
f9f47b913d | ||
|
ca4991a9f6 | ||
|
cdf77dacd8 | ||
|
7802a0d19f | ||
|
c4118855de | ||
|
2771991fc0 | ||
|
ceb69d97c3 | ||
|
19326bccdd | ||
|
22bde386ab | ||
|
2d36e5f060 | ||
|
873dc0ae08 | ||
|
0e24ffe23d | ||
|
d0f53bc806 | ||
|
0cb00e71b5 | ||
|
cc888bf168 | ||
|
bb95a6cb45 | ||
|
3f2a99adf6 | ||
|
ad93b5ca49 | ||
|
cdeab44c2c | ||
|
e046be22eb | ||
|
b10b5431e5 | ||
|
408d88f164 | ||
|
0e4034a093 | ||
|
fd64676312 | ||
|
4d66d072ec | ||
|
735f6a5826 | ||
|
498012697d | ||
|
b96b65cc49 | ||
|
0748b23630 | ||
|
63111261e7 | ||
|
2b91f94b8d | ||
|
1af0828b15 | ||
|
0ca2fe1fd5 | ||
|
fd923e032e | ||
|
e32514abe4 | ||
|
7322bfefd0 | ||
|
e232b1d8b9 | ||
|
1b87b4d212 | ||
|
ae746087e6 | ||
|
9312e4af6a | ||
|
c3da1d545a | ||
|
ad2bd7bc7a | ||
|
e58927469c | ||
|
45cce3a41c | ||
|
e6beef5a80 | ||
|
69a7005c35 | ||
|
073028f160 | ||
|
a9f11beb83 | ||
|
7ab8771989 | ||
|
d68c25daad | ||
|
6e117940a3 | ||
|
0c47f5a8d4 | ||
|
75a0489cce | ||
|
de5d6a2647 | ||
|
6970b7bbef | ||
|
b650254d54 | ||
|
668f2dd258 | ||
|
a8bc834077 | ||
|
f74e4b08ce | ||
|
dcd5ff5234 | ||
|
7bd8481a4e | ||
|
c82288d641 | ||
|
bb20882ade | ||
|
2264e329a1 | ||
|
b9e36b4900 | ||
|
d495f22413 | ||
|
8db9b374e4 | ||
|
f669c18c7f | ||
|
524d1f3fd7 | ||
|
ecffdc18fd | ||
|
b45202f40a | ||
|
ab83642f06 | ||
|
564005da93 | ||
|
311f9e6d08 | ||
|
e67d5aa84b | ||
|
d3023b1a5a | ||
|
21d705bbfa | ||
|
0e2c33faf8 | ||
|
cf6e147c26 | ||
|
f276a30a47 | ||
|
4edc46e67f | ||
|
a76526a5b6 | ||
|
baf32c1350 | ||
|
5c0bf914e3 | ||
|
01d10b89fd | ||
|
e1b50ce914 | ||
|
68b41acc46 | ||
|
30a9707c59 | ||
|
aee034791e | ||
|
00ddf149b0 | ||
|
476813e9bb | ||
|
f57239ad0d | ||
|
10caf27da3 | ||
|
51d1abab48 | ||
|
1224f5f40f | ||
|
f4a4619fe6 | ||
|
052ab20d67 | ||
|
dd7b6904b6 | ||
|
c4d993585f | ||
|
bd1fbf9cfc | ||
|
5fbcfb3e22 | ||
|
84c37b1d24 | ||
|
8d033f9afc | ||
|
bf494a42b5 | ||
|
969709cae5 | ||
|
155aa029ce | ||
|
3c0f731086 | ||
|
374c64538a |
3
.gitignore
vendored
3
.gitignore
vendored
@ -1,3 +1,6 @@
|
||||
/vendor/
|
||||
composer.lock
|
||||
composer.phar
|
||||
phpunit.xml
|
||||
.idea
|
||||
.php_cs.cache
|
||||
|
12
.travis.yml
12
.travis.yml
@ -1,16 +1,16 @@
|
||||
language: php
|
||||
|
||||
php:
|
||||
- 5.3
|
||||
- 5.4
|
||||
- 5.5
|
||||
- 5.6
|
||||
- 7.0
|
||||
- 7.1
|
||||
|
||||
env:
|
||||
- SYMFONY_VERSION=2.6.*
|
||||
- SYMFONY_VERSION="dev-master symfony/debug:~2.7@dev symfony/http-kernel:~2.7@dev"
|
||||
- SYMFONY_VERSION=2.8.*
|
||||
- SYMFONY_VERSION="dev-master symfony/debug:~2.8@dev symfony/http-kernel:~2.8@dev"
|
||||
|
||||
before_script:
|
||||
- phpenv config-add myphp.ini
|
||||
- composer self-update
|
||||
- composer require symfony/framework-bundle:${SYMFONY_VERSION} --no-update
|
||||
- composer update --no-interaction --prefer-source
|
||||
@ -22,4 +22,4 @@ script:
|
||||
|
||||
matrix:
|
||||
allow_failures:
|
||||
- env: SYMFONY_VERSION="dev-master symfony/debug:~2.7@dev symfony/http-kernel:~2.7@dev"
|
||||
- env: SYMFONY_VERSION="dev-master symfony/debug:~2.8@dev symfony/http-kernel:~2.8@dev"
|
||||
|
154
README.md
154
README.md
@ -1,56 +1,146 @@
|
||||
# BeSimpleSoap
|
||||
# BeSimpleSoap (Symfony 3.4 / 4.x)
|
||||
|
||||
Build SOAP and WSDL based web services
|
||||
This fork provides the BeSimpleSoap bundle, updated to be compatible with Symfony 3.4 and 4.x (as well as with PHP 7.0-7.4).
|
||||
|
||||
We forked the official [BeSimpleSoap](https://github.com/BeSimple/BeSimpleSoap) repository in order to sucessfully maintain some of our projects.
|
||||
|
||||
We now have integrated changes and fixes from sub-forks (thank you guys!), and we should be up to date now :)
|
||||
|
||||
This fork is maintained by people from [Cadoles](https://www.cadoles.com/).
|
||||
|
||||
# Contributing
|
||||
|
||||
We do welcome pull requests :) please include tests if you can.
|
||||
|
||||
Running tests can be done by running `php vendor/bin/phpunit`.
|
||||
|
||||
# Installation
|
||||
|
||||
If you do not yet have composer, follow instructions on the [Composer website](https://getcomposer.org/download/) to install it.
|
||||
|
||||
Then just running:
|
||||
|
||||
```
|
||||
$ composer require cadoles/soap
|
||||
```
|
||||
|
||||
should be enough to get you up and running.
|
||||
|
||||
# Components
|
||||
|
||||
BeSimpleSoap consists of five components ...
|
||||
|
||||
## BeSimpleSoapBundle
|
||||
|
||||
The BeSimpleSoapBundle is a Symfony2 bundle to build WSDL and SOAP based web services.
|
||||
For further information see the [README](https://github.com/BeSimple/BeSimpleSoap/blob/master/src/BeSimple/SoapBundle/README.md).
|
||||
|
||||
## BeSimpleSoapClient
|
||||
|
||||
The BeSimpleSoapClient is a component that extends the native PHP SoapClient with further features like SwA, MTOM and WS-Security.
|
||||
For further information see the [README](https://github.com/BeSimple/BeSimpleSoap/blob/master/src/BeSimple/SoapClient/README.md).
|
||||
|
||||
## BeSimpleSoapCommon
|
||||
|
||||
The BeSimpleSoapCommon component contains functionylity shared by both the server and client implementations.
|
||||
For further information see the [README](https://github.com/BeSimple/BeSimpleSoap/blob/master/src/BeSimple/SoapCommon/README.md).
|
||||
|
||||
**Refactored** BeSimpleSoapClient is a component that extends the native PHP SoapClient with further features like SwA and WS-Security.
|
||||
|
||||
## BeSimpleSoapServer
|
||||
|
||||
The BeSimpleSoapServer is a component that extends the native PHP SoapServer with further features like SwA, MTOM and WS-Security.
|
||||
For further information see the [README](https://github.com/BeSimple/BeSimpleSoap/blob/master/src/BeSimple/SoapServer/README.md).
|
||||
**Refactored** BeSimpleSoapServer is a component that extends the native PHP SoapServer with further features like SwA and WS-Security.
|
||||
|
||||
## BeSimpleSoapCommon
|
||||
|
||||
**Refactored** BeSimpleSoapCommon component contains functionality shared by both the server and client implementations.
|
||||
|
||||
## BeSimpleSoapWsdl
|
||||
|
||||
For further information see the [README](https://github.com/BeSimple/BeSimpleSoap/blob/master/src/BeSimple/SoapWsdl/README.md).
|
||||
**Untouched!**
|
||||
The component is not affected by refactoring so it should work properly.
|
||||
For further information see the original [README](https://github.com/BeSimple/BeSimpleSoap/blob/master/src/BeSimple/SoapWsdl/README.md).
|
||||
|
||||
# Installation
|
||||
## BeSimpleSoapBundle
|
||||
|
||||
If you do not yet have composer, install it like this:
|
||||
**Unsupported!**
|
||||
The BeSimpleSoapBundle is a Symfony2 bundle to build WSDL and SOAP based web services.
|
||||
For further information see the the original [README](https://github.com/BeSimple/BeSimpleSoap/blob/master/src/BeSimple/SoapBundle/README.md).
|
||||
*Will not work since the Symfony libraries were removed and usages of other components were not refactored. Feel free to fork this repository and fix it!*
|
||||
|
||||
```sh
|
||||
curl -s http://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin
|
||||
# How to use
|
||||
|
||||
You can investigate the unit tests dir ``tests`` in order to get a clue.
|
||||
Forget about associative arrays, vague configurations, multiple extension and silent errors!
|
||||
This may look a bit more complex at the first sight,
|
||||
but it will guide you to configure and set up your client or server properly.
|
||||
|
||||
## Example of soap client call
|
||||
|
||||
```php
|
||||
$soapClientBuilder = new SoapClientBuilder();
|
||||
$soapClient = $soapClientBuilder->build(
|
||||
SoapClientOptionsBuilder::createWithDefaults(),
|
||||
SoapOptionsBuilder::createWithDefaults('http://path/to/wsdlfile.wsdl')
|
||||
);
|
||||
$myRequest = new MyRequest();
|
||||
$myRequest->attribute = 'string value';
|
||||
$soapResponse = $soapClient->soapCall('myMethod', [$myRequest]);
|
||||
|
||||
var_dump($soapResponse); // Contains Response, Attachments
|
||||
```
|
||||
|
||||
Create a `composer.json` file:
|
||||
### Something wrong?!
|
||||
|
||||
```json
|
||||
Turn on the tracking and catch `SoapFaultWithTracingData` exception to get some sweets :)
|
||||
|
||||
```php
|
||||
try {
|
||||
$soapResponse = $soapClient->soapCall('myMethod', [$myRequest]);
|
||||
} catch (SoapFaultWithTracingData $fault) {
|
||||
var_dump($fault->getSoapResponseTracingData()->getLastRequest());
|
||||
}
|
||||
```
|
||||
In this example, a ``MyRequest`` object has been used to describe request.
|
||||
Using a ClassMap, you help SoapClient to turn it into XML request.
|
||||
|
||||
## Example of soap server handling
|
||||
|
||||
Starting a SOAP server is a bit more complex.
|
||||
I recommend you to inspect SoapServer unit tests for inspiration.
|
||||
|
||||
```php
|
||||
$dummyService = new DummyService();
|
||||
$classMap = new ClassMap();
|
||||
foreach ($dummyService->getClassMap() as $type => $className) {
|
||||
$classMap->add($type, $className);
|
||||
}
|
||||
$soapServerBuilder = new SoapServerBuilder();
|
||||
$soapServerOptions = SoapServerOptionsBuilder::createWithDefaults($dummyService);
|
||||
$soapOptions = SoapOptionsBuilder::createWithClassMap($dummyService->getWsdlPath(), $classMap);
|
||||
$soapServer = $soapServerBuilder->build($soapServerOptions, $soapOptions);
|
||||
|
||||
$request = $soapServer->createRequest(
|
||||
$dummyService->getEndpoint(),
|
||||
'DummyService.dummyServiceMethod',
|
||||
'text/xml;charset=UTF-8',
|
||||
'<received><soap><request><here /></request></soap></received>'
|
||||
);
|
||||
$response = $soapServer->handleRequest($request);
|
||||
|
||||
var_dump($response); // Contains Response, Attachments
|
||||
```
|
||||
|
||||
In this example, a ``DummyService`` service has been used to handle request.
|
||||
Using a service can help you create coherent SoapServer endpoints.
|
||||
Service can hold an endpoint URL, WSDL path and a class map as associative array.
|
||||
You can hold a class map as ``ClassMap`` object directly in the ``DummyService`` instead of array.
|
||||
|
||||
In the service you should describe SOAP methods from given WSDL.
|
||||
In the example, the dummyServiceMethod is called.
|
||||
The method will receive request object and return response object that are matched according to the class map.
|
||||
|
||||
See a simplified implementation of ``dummyServiceMethod`` to get a clue:
|
||||
|
||||
```php
|
||||
/**
|
||||
* @param DummyServiceRequest $dummyServiceRequest
|
||||
* @return DummyServiceResponse
|
||||
*/
|
||||
public function dummyServiceMethod(DummyServiceRequest $dummyServiceRequest)
|
||||
{
|
||||
"require": {
|
||||
"besimple/soap": "0.2.*@dev"
|
||||
}
|
||||
$response = new DummyServiceResponse();
|
||||
$response->status = true;
|
||||
|
||||
return $response;
|
||||
}
|
||||
```
|
||||
|
||||
Now you are ready to install the library:
|
||||
|
||||
```sh
|
||||
php /usr/local/bin/composer.phar install
|
||||
```
|
||||
For further information and getting inspiration for your implementation, see the unit tests in ``tests`` dir.
|
@ -1,8 +1,9 @@
|
||||
{
|
||||
"name": "tuscanicz/soap",
|
||||
"name": "cadoles/soap",
|
||||
"type": "library",
|
||||
"description": "A fork of the abandoned besimple/soap package with added support for Symfony 3.0",
|
||||
"keywords": ["soap", "soap server", "soap client"],
|
||||
"description": "Build and consume SOAP and WSDL based web services",
|
||||
"keywords": ["soap"],
|
||||
"homepage": "https://github.com/Cadoles/BeSimpleSoap",
|
||||
"license": "MIT",
|
||||
"authors": [
|
||||
{
|
||||
@ -16,40 +17,37 @@
|
||||
{
|
||||
"name": "Andreas Schamberger",
|
||||
"email": "mail@andreass.net"
|
||||
},
|
||||
{
|
||||
"name": "Petr Bechyně",
|
||||
"email": "petr.bechyne@vodafone.com"
|
||||
}
|
||||
],
|
||||
"require": {
|
||||
"php": ">=5.3.0",
|
||||
"php": ">=7.0",
|
||||
"ext-soap": "*",
|
||||
"ext-curl": "*",
|
||||
"ass/xmlsecurity": "~1.0",
|
||||
"symfony/framework-bundle": "~2.6|~3.0",
|
||||
"symfony/twig-bundle": "~2.6|~3.0",
|
||||
"zendframework/zend-mime": "2.1.*"
|
||||
"symfony/framework-bundle": "~3.4|~4.0",
|
||||
"symfony/twig-bundle": "~3.4|~4.0",
|
||||
"laminas/laminas-mime": "~2.1"
|
||||
},
|
||||
"replace": {
|
||||
"besimple/soap-bundle": "self.version",
|
||||
"besimple/soap-client": "self.version",
|
||||
"besimple/soap-common": "self.version",
|
||||
"besimple/soap-server": "self.version",
|
||||
"besimple/soap-wsdl": "self.version"
|
||||
"besimple/soap-wsdl": "self.version",
|
||||
"cocciagialla/soap": "self.version"
|
||||
},
|
||||
"require-dev": {
|
||||
"ext-mcrypt": "*",
|
||||
"mikey179/vfsStream": "~1.0",
|
||||
"mikey179/vfsstream": "~1.6.5",
|
||||
"symfony/filesystem": "~2.3",
|
||||
"symfony/process": "~2.3"
|
||||
"symfony/process": "~2.3",
|
||||
"phpunit/phpunit": "^5.7"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-0": { "BeSimple\\": "src/" }
|
||||
},
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "0.4-dev"
|
||||
"dev-master": "5.2.0-dev"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
1
src/BeSimple/SoapBundle/.gitignore
vendored
1
src/BeSimple/SoapBundle/.gitignore
vendored
@ -1,3 +1,4 @@
|
||||
vendor/
|
||||
composer.lock
|
||||
phpunit.xml
|
||||
.idea/
|
||||
|
@ -15,15 +15,17 @@ namespace BeSimple\SoapBundle\Controller;
|
||||
use BeSimple\SoapBundle\Handler\ExceptionHandler;
|
||||
use BeSimple\SoapBundle\Soap\SoapRequest;
|
||||
use BeSimple\SoapBundle\Soap\SoapResponse;
|
||||
use BeSimple\SoapBundle\WebServiceContext;
|
||||
use BeSimple\SoapServer\SoapServerBuilder;
|
||||
use Symfony\Component\Debug\Exception\FlattenException;
|
||||
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
|
||||
use Symfony\Component\DependencyInjection\ContainerAwareTrait;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
use Symfony\Component\Debug\Exception\FlattenException;
|
||||
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
|
||||
use Symfony\Component\HttpKernel\HttpKernelInterface;
|
||||
use Symfony\Component\HttpKernel\Log\DebugLoggerInterface;
|
||||
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
|
||||
|
||||
/**
|
||||
* @author Christian Kerl <christian-kerl@web.de>
|
||||
@ -56,19 +58,20 @@ class SoapWebServiceController implements ContainerAwareInterface
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
private $headers = array();
|
||||
private $headers = [];
|
||||
|
||||
/**
|
||||
* @return \BeSimple\SoapBundle\Soap\SoapResponse
|
||||
*/
|
||||
public function callAction($webservice)
|
||||
{
|
||||
$webServiceContext = $this->getWebServiceContext($webservice);
|
||||
/** @var WebServiceContext $webServiceContext */
|
||||
$webServiceContext = $this->getWebServiceContext($webservice);
|
||||
|
||||
$this->serviceBinder = $webServiceContext->getServiceBinder();
|
||||
|
||||
$this->soapRequest = SoapRequest::createFromHttpRequest($this->container->get('request_stack')->getCurrentRequest());
|
||||
$this->soapServer = $webServiceContext
|
||||
$this->soapServer = $webServiceContext
|
||||
->getServerBuilder()
|
||||
->withSoapVersion11()
|
||||
->withHandler($this)
|
||||
@ -86,19 +89,26 @@ class SoapWebServiceController implements ContainerAwareInterface
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Symfony\Component\HttpFoundation\Response
|
||||
* @return Response
|
||||
*/
|
||||
public function definitionAction($webservice)
|
||||
{
|
||||
$routeName = $webservice.'_webservice_call';
|
||||
$result = $this->container->get('router')->getRouteCollection()->get($routeName);
|
||||
if (null === $result) {
|
||||
$routeName = '_webservice_call';
|
||||
}
|
||||
|
||||
$response = new Response($this->getWebServiceContext($webservice)->getWsdlFileContent(
|
||||
$this->container->get('router')->generate(
|
||||
'_webservice_call',
|
||||
array('webservice' => $webservice),
|
||||
true
|
||||
$routeName,
|
||||
['webservice' => $webservice],
|
||||
UrlGeneratorInterface::ABSOLUTE_URL
|
||||
)
|
||||
));
|
||||
|
||||
$request = $this->container->get('request');
|
||||
/** @var Request $request */
|
||||
$request = $this->container->get('request_stack')->getCurrentRequest();
|
||||
$query = $request->query;
|
||||
if ($query->has('wsdl') || $query->has('WSDL')) {
|
||||
$request->setRequestFormat('wsdl');
|
||||
@ -124,14 +134,14 @@ class SoapWebServiceController implements ContainerAwareInterface
|
||||
throw new \LogicException(sprintf('The parameter "%s" is required in Request::$query parameter bag to generate the SoapFault.', '_besimple_soap_webservice'), null, $e);
|
||||
}
|
||||
|
||||
$view = 'TwigBundle:Exception:'.($this->container->get('kernel')->isDebug() ? 'exception' : 'error').'.txt.twig';
|
||||
$view = '@Twig/Exception/'.($this->container->get('kernel')->isDebug() ? 'exception' : 'error').'.txt.twig';
|
||||
$code = $exception->getStatusCode();
|
||||
$details = $this->container->get('templating')->render($view, array(
|
||||
$details = $this->container->get('twig')->render($view, [
|
||||
'status_code' => $code,
|
||||
'status_text' => isset(Response::$statusTexts[$code]) ? Response::$statusTexts[$code] : '',
|
||||
'exception' => $exception,
|
||||
'logger' => $logger,
|
||||
));
|
||||
'exception' => $exception,
|
||||
'logger' => $logger,
|
||||
]);
|
||||
|
||||
$handler = new ExceptionHandler($exception, $details);
|
||||
if ($soapFault = $request->query->get('_besimple_soap_fault')) {
|
||||
@ -141,8 +151,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()
|
||||
@ -165,8 +175,8 @@ class SoapWebServiceController implements ContainerAwareInterface
|
||||
* This method gets called once for every SOAP header the \SoapServer received
|
||||
* and afterwards once for the called SOAP operation.
|
||||
*
|
||||
* @param string $method The SOAP header or SOAP operation name
|
||||
* @param array $arguments
|
||||
* @param string $method The SOAP header or SOAP operation name
|
||||
* @param array $arguments
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
@ -223,7 +233,7 @@ class SoapWebServiceController implements ContainerAwareInterface
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the SoapResponse
|
||||
* Set the SoapResponse.
|
||||
*
|
||||
* @param Response $response A response to check and set
|
||||
*
|
||||
@ -240,7 +250,7 @@ class SoapWebServiceController implements ContainerAwareInterface
|
||||
return $this->soapResponse = $response;
|
||||
}
|
||||
|
||||
private function getWebServiceContext($webservice)
|
||||
protected function getWebServiceContext($webservice)
|
||||
{
|
||||
$context = sprintf('besimple.soap.context.%s', $webservice);
|
||||
|
||||
|
@ -48,7 +48,7 @@ class TypeRepository
|
||||
|
||||
public function fixTypeInformation(ServiceDefinition $definition)
|
||||
{
|
||||
foreach($definition->getAllTypes() as $type) {
|
||||
foreach ($definition->getAllTypes() as $type) {
|
||||
$phpType = $type->getPhpType();
|
||||
$xmlType = $type->getXmlType();
|
||||
|
||||
|
@ -12,7 +12,7 @@ namespace BeSimple\SoapBundle\Converter;
|
||||
|
||||
use BeSimple\SoapBundle\Soap\SoapRequest;
|
||||
use BeSimple\SoapBundle\Soap\SoapResponse;
|
||||
use BeSimple\SoapBundle\Util\String;
|
||||
use BeSimple\SoapBundle\Util\BsString;
|
||||
use BeSimple\SoapCommon\Converter\TypeConverterInterface;
|
||||
|
||||
/**
|
||||
@ -40,7 +40,7 @@ class XopIncludeTypeConverter implements TypeConverterInterface
|
||||
|
||||
$ref = $include->getAttribute('href');
|
||||
|
||||
if (String::startsWith($ref, 'cid:')) {
|
||||
if (BsString::startsWith($ref, 'cid:')) {
|
||||
$cid = urldecode(substr($ref, 4));
|
||||
|
||||
return $request->getSoapAttachments()->get($cid)->getContent();
|
||||
|
@ -17,10 +17,11 @@ use BeSimple\SoapCommon\Cache;
|
||||
use Symfony\Component\Config\Definition\Processor;
|
||||
use Symfony\Component\Config\FileLocator;
|
||||
use Symfony\Component\DependencyInjection\ContainerBuilder;
|
||||
use Symfony\Component\DependencyInjection\DefinitionDecorator;
|
||||
use Symfony\Component\DependencyInjection\ChildDefinition;
|
||||
use Symfony\Component\DependencyInjection\Reference;
|
||||
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
|
||||
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
|
||||
use Symfony\Component\HttpKernel\Kernel;
|
||||
|
||||
/**
|
||||
* BeSimpleSoapExtension.
|
||||
@ -59,7 +60,7 @@ class BeSimpleSoapExtension extends Extension
|
||||
|
||||
$container->setParameter('besimple.soap.definition.dumper.options.stylesheet', $config['wsdl_dumper']['stylesheet']);
|
||||
|
||||
foreach($config['services'] as $name => $serviceConfig) {
|
||||
foreach ($config['services'] as $name => $serviceConfig) {
|
||||
$serviceConfig['name'] = $name;
|
||||
$this->createWebServiceContext($serviceConfig, $container);
|
||||
}
|
||||
@ -80,17 +81,21 @@ class BeSimpleSoapExtension extends Extension
|
||||
|
||||
private function registerClientConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader)
|
||||
{
|
||||
$loader->load('client.xml');
|
||||
if (3 === Kernel::MAJOR_VERSION) {
|
||||
$loader->load('client3.xml');
|
||||
} else {
|
||||
$loader->load('client.xml');
|
||||
}
|
||||
|
||||
foreach ($config as $client => $options) {
|
||||
$definition = new DefinitionDecorator('besimple.soap.client.builder');
|
||||
$definition = new ChildDefinition('besimple.soap.client.builder');
|
||||
$container->setDefinition(sprintf('besimple.soap.client.builder.%s', $client), $definition);
|
||||
|
||||
$definition->replaceArgument(0, $options['wsdl']);
|
||||
|
||||
$defOptions = $container
|
||||
->getDefinition('besimple.soap.client.builder')
|
||||
->getArgument(1);
|
||||
->getDefinition('besimple.soap.client.builder')
|
||||
->getArgument(1);
|
||||
|
||||
foreach (array('cache_type', 'user_agent') as $key) {
|
||||
if (isset($options[$key])) {
|
||||
@ -130,7 +135,7 @@ class BeSimpleSoapExtension extends Extension
|
||||
|
||||
private function createClientClassmap($client, array $classmap, ContainerBuilder $container)
|
||||
{
|
||||
$definition = new DefinitionDecorator('besimple.soap.classmap');
|
||||
$definition = new ChildDefinition('besimple.soap.classmap');
|
||||
$container->setDefinition(sprintf('besimple.soap.classmap.%s', $client), $definition);
|
||||
|
||||
if (!empty($classmap)) {
|
||||
@ -144,13 +149,18 @@ class BeSimpleSoapExtension extends Extension
|
||||
|
||||
private function createClient($client, ContainerBuilder $container)
|
||||
{
|
||||
$definition = new DefinitionDecorator('besimple.soap.client');
|
||||
$definition = new ChildDefinition('besimple.soap.client');
|
||||
$container->setDefinition(sprintf('besimple.soap.client.%s', $client), $definition);
|
||||
|
||||
$definition->setFactory(array(
|
||||
new Reference(sprintf('besimple.soap.client.builder.%s', $client)),
|
||||
'build'
|
||||
));
|
||||
if (Kernel::MAJOR_VERSION >= 3) {
|
||||
$definition->setFactory(array(
|
||||
new Reference(sprintf('besimple.soap.client.builder.%s', $client)),
|
||||
'build'
|
||||
));
|
||||
$definition->setPublic(true);
|
||||
} else {
|
||||
$definition->setFactoryService(sprintf('besimple.soap.client.builder.%s', $client));
|
||||
}
|
||||
}
|
||||
|
||||
private function createWebServiceContext(array $config, ContainerBuilder $container)
|
||||
@ -159,7 +169,7 @@ class BeSimpleSoapExtension extends Extension
|
||||
unset($config['binding']);
|
||||
|
||||
$contextId = 'besimple.soap.context.'.$config['name'];
|
||||
$definition = new DefinitionDecorator('besimple.soap.context.'.$bindingSuffix);
|
||||
$definition = new ChildDefinition('besimple.soap.context.'.$bindingSuffix);
|
||||
$container->setDefinition($contextId, $definition);
|
||||
|
||||
if (isset($config['cache_type'])) {
|
||||
@ -168,6 +178,7 @@ class BeSimpleSoapExtension extends Extension
|
||||
|
||||
$options = $container
|
||||
->getDefinition('besimple.soap.context.'.$bindingSuffix)
|
||||
->setPublic(true)
|
||||
->getArgument(2);
|
||||
|
||||
$definition->replaceArgument(2, array_merge($options, $config));
|
||||
|
@ -96,8 +96,12 @@ class Configuration
|
||||
->info('proxy configuration')
|
||||
->addDefaultsIfNotSet()
|
||||
->beforeNormalization()
|
||||
->ifTrue(function ($v) { return !is_array($v); })
|
||||
->then(function ($v) { return array('host' => null === $v ? false : $v); })
|
||||
->ifTrue(function ($v) {
|
||||
return !is_array($v);
|
||||
})
|
||||
->then(function ($v) {
|
||||
return array('host' => null === $v ? false : $v);
|
||||
})
|
||||
->end()
|
||||
->children()
|
||||
->scalarNode('host')->defaultFalse()->end()
|
||||
|
@ -20,7 +20,7 @@
|
||||
</service>
|
||||
|
||||
<service id="besimple.soap.client" class="%besimple.soap.client.builder.class%" abstract="true">
|
||||
<factory class="besimple.soap.client.builder" method="build" />
|
||||
<factory service="besimple.soap.client.builder" method="build" />
|
||||
</service>
|
||||
|
||||
<service id="besimple.soap.classmap" class="%besimple.soap.classmap.class%" abstract="true" />
|
||||
|
29
src/BeSimple/SoapBundle/Resources/config/client3.xml
Normal file
29
src/BeSimple/SoapBundle/Resources/config/client3.xml
Normal file
@ -0,0 +1,29 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<container xmlns="http://symfony.com/schema/dic/services"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
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\SoapBundle\Soap\SoapClientBuilder</parameter>
|
||||
<parameter key="besimple.soap.classmap.class">BeSimple\SoapCommon\Classmap</parameter>
|
||||
</parameters>
|
||||
|
||||
<services>
|
||||
<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" class="%besimple.soap.client.builder.class%" abstract="true">
|
||||
<factory service="besimple.soap.client.builder" method="build" />
|
||||
</service>
|
||||
|
||||
<service id="besimple.soap.classmap" class="%besimple.soap.classmap.class%" abstract="true" />
|
||||
</services>
|
||||
|
||||
</container>
|
@ -1,18 +1,16 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
|
||||
<routes xmlns="http://symfony.com/schema/routing"
|
||||
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">
|
||||
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" path="/{webservice}" methods="POST">
|
||||
<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" path="/{webservice}" methods="GET">
|
||||
<default key="_controller">BeSimpleSoapBundle:SoapWebService:Definition</default>
|
||||
<default key="_format">xml</default>
|
||||
<requirement key="_method">GET</requirement>
|
||||
</route>
|
||||
</routes>
|
||||
|
@ -19,7 +19,7 @@
|
||||
</parameters>
|
||||
|
||||
<services>
|
||||
<service id="besimple.soap.response" class="%besimple.soap.response.class%" />
|
||||
<service id="besimple.soap.response" class="%besimple.soap.response.class%" public="true" />
|
||||
|
||||
<service id="besimple.soap.response.listener" class="%besimple.soap.response.listener.class%">
|
||||
<tag name="kernel.event_listener" event="kernel.view" method="onKernelView" />
|
||||
@ -96,6 +96,14 @@
|
||||
<argument>dateTime</argument>
|
||||
<argument>xsd:dateTime</argument>
|
||||
</call>
|
||||
<call method="addType">
|
||||
<argument>base64Binary</argument>
|
||||
<argument>xsd:base64Binary</argument>
|
||||
</call>
|
||||
<call method="addType">
|
||||
<argument>hexBinary</argument>
|
||||
<argument>xsd:hexBinary</argument>
|
||||
</call>
|
||||
</service>
|
||||
</services>
|
||||
|
||||
|
@ -0,0 +1,33 @@
|
||||
<?php
|
||||
/*
|
||||
* This file is part of the BeSimpleSoapBundle.
|
||||
*
|
||||
* (c) Christian Kerl <christian-kerl@web.de>
|
||||
*
|
||||
* This source file is subject to the MIT license that is bundled
|
||||
* with this source code in the file LICENSE.
|
||||
*/
|
||||
|
||||
namespace BeSimple\SoapBundle\ServiceBinding;
|
||||
|
||||
use BeSimple\SoapBundle\ServiceDefinition\Method;
|
||||
use BeSimple\SoapCommon\Definition\Type\TypeRepository;
|
||||
|
||||
/**
|
||||
* @author Francis Besset <francis.besset@gmail.com>
|
||||
*/
|
||||
class DocumentLiteralWrappedRequestHeaderMessageBinder extends DocumentLiteralWrappedRequestMessageBinder
|
||||
{
|
||||
private $header;
|
||||
|
||||
public function setHeader($header)
|
||||
{
|
||||
$this->header = $header;
|
||||
}
|
||||
|
||||
public function processMessage(Method $messageDefinition, $message, TypeRepository $typeRepository)
|
||||
{
|
||||
$headerDefinition = $messageDefinition->getHeaders()->get($this->header);
|
||||
return [];
|
||||
}
|
||||
}
|
@ -11,25 +11,26 @@
|
||||
namespace BeSimple\SoapBundle\ServiceBinding;
|
||||
|
||||
use BeSimple\SoapBundle\ServiceDefinition\Method;
|
||||
use BeSimple\SoapCommon\Definition\Type\TypeRepository;
|
||||
|
||||
/**
|
||||
* @author Christian Kerl <christian-kerl@web.de>
|
||||
*/
|
||||
class DocumentLiteralWrappedRequestMessageBinder implements MessageBinderInterface
|
||||
{
|
||||
public function processMessage(Method $messageDefinition, $message)
|
||||
public function processMessage(Method $messageDefinition, $message, TypeRepository $typeRepository)
|
||||
{
|
||||
if(count($message) > 1) {
|
||||
if (count($message) > 1) {
|
||||
throw new \InvalidArgumentException();
|
||||
}
|
||||
|
||||
$result = array();
|
||||
$result = array();
|
||||
$message = $message[0];
|
||||
|
||||
foreach($messageDefinition->getArguments() as $argument) {
|
||||
$result[$argument->getName()] = $message->{$argument->getName()};
|
||||
foreach ($messageDefinition->getInput()->all() as $argument) {
|
||||
$result[$argument->getName()] = $message;
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -11,17 +11,15 @@
|
||||
namespace BeSimple\SoapBundle\ServiceBinding;
|
||||
|
||||
use BeSimple\SoapBundle\ServiceDefinition\Method;
|
||||
use BeSimple\SoapCommon\Definition\Type\TypeRepository;
|
||||
|
||||
/**
|
||||
* @author Christian Kerl <christian-kerl@web.de>
|
||||
*/
|
||||
class DocumentLiteralWrappedResponseMessageBinder implements MessageBinderInterface
|
||||
{
|
||||
public function processMessage(Method $messageDefinition, $message)
|
||||
public function processMessage(Method $messageDefinition, $message, TypeRepository $typeRepository)
|
||||
{
|
||||
$result = new \stdClass();
|
||||
$result->{$messageDefinition->getName().'Result'} = $message;
|
||||
|
||||
return $result;
|
||||
return $message;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -24,5 +24,5 @@ interface MessageBinderInterface
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
function processMessage(Method $messageDefinition, $message, TypeRepository $typeRepository);
|
||||
public function processMessage(Method $messageDefinition, $message, TypeRepository $typeRepository);
|
||||
}
|
||||
|
@ -32,7 +32,10 @@ class RpcLiteralResponseMessageBinder implements MessageBinderInterface
|
||||
{
|
||||
$this->typeRepository = $typeRepository;
|
||||
|
||||
return $this->processType($messageDefinition->getOutput()->get('return')->getType(), $message);
|
||||
$parts = $messageDefinition->getOutput()->all();
|
||||
$part = array_shift($parts);
|
||||
|
||||
return $this->processType($part->getType(), $message);
|
||||
}
|
||||
|
||||
private function processType($phpType, $message)
|
||||
|
@ -44,7 +44,8 @@ class ServiceBinder
|
||||
* @param MessageBinderInterface $requestMessageBinder
|
||||
* @param MessageBinderInterface $responseMessageBinder
|
||||
*/
|
||||
public function __construct(Definition $definition, MessageBinderInterface $requestHeaderMessageBinder, MessageBinderInterface $requestMessageBinder, MessageBinderInterface $responseMessageBinder) {
|
||||
public function __construct(Definition $definition, MessageBinderInterface $requestHeaderMessageBinder, MessageBinderInterface $requestMessageBinder, MessageBinderInterface $responseMessageBinder)
|
||||
{
|
||||
$this->definition = $definition;
|
||||
|
||||
$this->requestHeaderMessageBinder = $requestHeaderMessageBinder;
|
||||
|
@ -18,6 +18,7 @@ class ComplexType extends Configuration
|
||||
private $name;
|
||||
private $value;
|
||||
private $isNillable = false;
|
||||
private $minOccurs = 1;
|
||||
|
||||
public function getName()
|
||||
{
|
||||
@ -34,6 +35,11 @@ class ComplexType extends Configuration
|
||||
return $this->isNillable;
|
||||
}
|
||||
|
||||
public function getIsNillable()
|
||||
{
|
||||
return $this->isNillable;
|
||||
}
|
||||
|
||||
public function setName($name)
|
||||
{
|
||||
$this->name = $name;
|
||||
@ -49,8 +55,23 @@ class ComplexType extends Configuration
|
||||
$this->isNillable = (bool) $isNillable;
|
||||
}
|
||||
|
||||
public function setIsNillable($isNillable)
|
||||
{
|
||||
$this->isNillable = (bool) $isNillable;
|
||||
}
|
||||
|
||||
public function setMinOccurs($minOccurs)
|
||||
{
|
||||
$this->minOccurs = $minOccurs;
|
||||
}
|
||||
|
||||
public function getMinOccurs()
|
||||
{
|
||||
return $this->minOccurs;
|
||||
}
|
||||
|
||||
public function getAliasName()
|
||||
{
|
||||
return 'complextype';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -22,5 +22,5 @@ interface ConfigurationInterface
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function getAliasName();
|
||||
}
|
||||
public function getAliasName();
|
||||
}
|
||||
|
@ -19,4 +19,4 @@ class Header extends Param
|
||||
{
|
||||
return 'header';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -42,4 +42,4 @@ class Method extends Configuration
|
||||
{
|
||||
return 'method';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -53,4 +53,4 @@ class Param extends Configuration implements TypedElementInterface
|
||||
{
|
||||
return 'param';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -42,4 +42,4 @@ class Result extends Configuration implements TypedElementInterface
|
||||
{
|
||||
return 'result';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -12,8 +12,8 @@ namespace BeSimple\SoapBundle\ServiceDefinition\Annotation;
|
||||
|
||||
interface TypedElementInterface
|
||||
{
|
||||
function getPhpType();
|
||||
function getXmlType();
|
||||
function setPhpType($phpType);
|
||||
function setXmlType($xmlType);
|
||||
}
|
||||
public function getPhpType();
|
||||
public function getXmlType();
|
||||
public function setPhpType($phpType);
|
||||
public function setXmlType($xmlType);
|
||||
}
|
||||
|
@ -20,6 +20,7 @@ class ComplexType
|
||||
private $name;
|
||||
private $value;
|
||||
private $isNillable = false;
|
||||
private $minOccurs = 1;
|
||||
|
||||
public function getName()
|
||||
{
|
||||
@ -50,4 +51,14 @@ class ComplexType
|
||||
{
|
||||
$this->isNillable = (bool) $isNillable;
|
||||
}
|
||||
|
||||
public function setMinOccurs($minOccurs)
|
||||
{
|
||||
$this->minOccurs = $minOccurs;
|
||||
}
|
||||
|
||||
public function getMinOccurs()
|
||||
{
|
||||
return $this->minOccurs;
|
||||
}
|
||||
}
|
||||
|
@ -96,6 +96,7 @@ class AnnotationClassLoader extends Loader
|
||||
}
|
||||
|
||||
$serviceReturn = $annotation->getPhpType();
|
||||
$serviceXmlReturn = $annotation->getXmlType();
|
||||
}
|
||||
}
|
||||
|
||||
@ -116,7 +117,11 @@ class AnnotationClassLoader extends Loader
|
||||
throw new \LogicException(sprintf('@Soap\Result non-existent for "%s".', $method->getName()));
|
||||
}
|
||||
|
||||
$serviceMethod->setOutput($this->loadType($serviceReturn));
|
||||
if (!isset($serviceXmlReturn) || !$serviceXmlReturn) {
|
||||
$serviceXmlReturn = 'return';
|
||||
}
|
||||
|
||||
$serviceMethod->setOutput($this->loadType($serviceReturn), $serviceXmlReturn);
|
||||
|
||||
$definition->addMethod($serviceMethod);
|
||||
}
|
||||
@ -133,7 +138,7 @@ class AnnotationClassLoader extends Loader
|
||||
*/
|
||||
private function getController(\ReflectionClass $class, \ReflectionMethod $method, Annotation\Method $annotation)
|
||||
{
|
||||
if(null !== $annotation->getService()) {
|
||||
if (null !== $annotation->getService()) {
|
||||
return $annotation->getService() . ':' . $method->name;
|
||||
} else {
|
||||
return $class->name . '::' . $method->name;
|
||||
@ -155,7 +160,7 @@ class AnnotationClassLoader extends Loader
|
||||
$loaded = $complexTypeResolver->load($phpType);
|
||||
$complexType = new ComplexType($phpType, isset($loaded['alias']) ? $loaded['alias'] : $phpType);
|
||||
foreach ($loaded['properties'] as $name => $property) {
|
||||
$complexType->add($name, $this->loadType($property->getValue()), $property->isNillable());
|
||||
$complexType->add($name, $this->loadType($property->getValue()), $property->isNillable(), $property->getMinOccurs());
|
||||
}
|
||||
|
||||
$this->typeRepository->addComplexType($complexType);
|
||||
|
@ -24,7 +24,7 @@ use BeSimple\SoapBundle\Util\Collection;
|
||||
*/
|
||||
class AnnotationComplexTypeLoader extends AnnotationClassLoader
|
||||
{
|
||||
private $aliasClass = 'BeSimple\SoapBundle\ServiceDefinition\Annotation\Alias';
|
||||
private $aliasClass = 'BeSimple\SoapBundle\ServiceDefinition\Annotation\Alias';
|
||||
private $complexTypeClass = 'BeSimple\SoapBundle\ServiceDefinition\Annotation\ComplexType';
|
||||
|
||||
/**
|
||||
@ -43,7 +43,7 @@ class AnnotationComplexTypeLoader extends AnnotationClassLoader
|
||||
throw new \InvalidArgumentException(sprintf('Class "%s" does not exist.', $class));
|
||||
}
|
||||
|
||||
$annotations = array();
|
||||
$annotations = [];
|
||||
|
||||
$class = new \ReflectionClass($class);
|
||||
if ($alias = $this->reader->getClassAnnotation($class, $this->aliasClass)) {
|
||||
@ -59,6 +59,7 @@ class AnnotationComplexTypeLoader extends AnnotationClassLoader
|
||||
$propertyComplexType->setValue($complexType->getValue());
|
||||
$propertyComplexType->setNillable($complexType->isNillable());
|
||||
$propertyComplexType->setName($property->getName());
|
||||
$propertyComplexType->setMinOccurs($complexType->getMinOccurs());
|
||||
$annotations['properties']->add($propertyComplexType);
|
||||
}
|
||||
}
|
||||
@ -72,7 +73,7 @@ class AnnotationComplexTypeLoader extends AnnotationClassLoader
|
||||
* @param mixed $resource A resource
|
||||
* @param string $type The resource type
|
||||
*
|
||||
* @return Boolean True if this class supports the given resource, false otherwise
|
||||
* @return bool True if this class supports the given resource, false otherwise
|
||||
*/
|
||||
public function supports($resource, $type = null)
|
||||
{
|
||||
|
@ -12,7 +12,7 @@ namespace BeSimple\SoapBundle\Soap;
|
||||
|
||||
use BeSimple\SoapBundle\Util\Collection;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Zend\Mime\Message;
|
||||
use Laminas\Mime\Message;
|
||||
|
||||
/**
|
||||
* SoapRequest.
|
||||
@ -69,7 +69,7 @@ class SoapRequest extends Request
|
||||
*/
|
||||
public function getSoapMessage()
|
||||
{
|
||||
if(null === $this->soapMessage) {
|
||||
if (null === $this->soapMessage) {
|
||||
$this->soapMessage = $this->initializeSoapMessage();
|
||||
}
|
||||
|
||||
@ -88,12 +88,12 @@ class SoapRequest extends Request
|
||||
|
||||
protected function initializeSoapMessage()
|
||||
{
|
||||
if($this->server->has('CONTENT_TYPE')) {
|
||||
if ($this->server->has('CONTENT_TYPE')) {
|
||||
$type = $this->splitContentTypeHeader($this->server->get('CONTENT_TYPE'));
|
||||
|
||||
switch($type['_type']) {
|
||||
switch ($type['_type']) {
|
||||
case 'multipart/related':
|
||||
if($type['type'] == 'application/xop+xml') {
|
||||
if ($type['type'] == 'application/xop+xml') {
|
||||
return $this->initializeMtomSoapMessage($type, $this->getContent());
|
||||
} else {
|
||||
//log error
|
||||
@ -114,7 +114,7 @@ class SoapRequest extends Request
|
||||
|
||||
protected function initializeMtomSoapMessage(array $contentTypeHeader, $content)
|
||||
{
|
||||
if(!isset($contentTypeHeader['start']) || !isset($contentTypeHeader['start-info']) || !isset($contentTypeHeader['boundary'])) {
|
||||
if (!isset($contentTypeHeader['start']) || !isset($contentTypeHeader['start-info']) || !isset($contentTypeHeader['boundary'])) {
|
||||
throw new \InvalidArgumentException();
|
||||
}
|
||||
|
||||
@ -129,11 +129,11 @@ class SoapRequest extends Request
|
||||
|
||||
// TODO: add more checks to achieve full compatibility to MTOM spec
|
||||
// http://www.w3.org/TR/soap12-mtom/
|
||||
if($rootPart->id != $soapMimePartId || $rootPartType['_type'] != 'application/xop+xml' || $rootPartType['type'] != $soapMimePartType) {
|
||||
if ($rootPart->id != $soapMimePartId || $rootPartType['_type'] != 'application/xop+xml' || $rootPartType['type'] != $soapMimePartType) {
|
||||
throw new \InvalidArgumentException();
|
||||
}
|
||||
|
||||
foreach($mimeParts as $mimePart) {
|
||||
foreach ($mimeParts as $mimePart) {
|
||||
$this->soapAttachments->add(new SoapAttachment(
|
||||
$mimePart->id,
|
||||
$mimePart->type,
|
||||
@ -153,7 +153,7 @@ class SoapRequest extends Request
|
||||
|
||||
$result['_type'] = array_shift($parts);
|
||||
|
||||
foreach($parts as $part) {
|
||||
foreach ($parts as $part) {
|
||||
list($key, $value) = explode('=', trim($part), 2);
|
||||
|
||||
$result[$key] = trim($value, '"');
|
||||
|
@ -21,7 +21,7 @@ class Assert
|
||||
|
||||
public static function thatArgument($name, $condition, $message = self::ARGUMENT_INVALID)
|
||||
{
|
||||
if(!$condition) {
|
||||
if (!$condition) {
|
||||
throw new \InvalidArgumentException(sprintf($message, $name));
|
||||
}
|
||||
}
|
||||
|
@ -15,7 +15,7 @@ namespace BeSimple\SoapBundle\Util;
|
||||
*
|
||||
* @author Christian Kerl <christian-kerl@web.de>
|
||||
*/
|
||||
class String
|
||||
class BsString
|
||||
{
|
||||
/**
|
||||
* Checks if a string starts with a given string.
|
||||
@ -27,7 +27,7 @@ class String
|
||||
*/
|
||||
public static function startsWith($str, $substr)
|
||||
{
|
||||
if(is_string($str) && is_string($substr) && strlen($str) >= strlen($substr)) {
|
||||
if (is_string($str) && is_string($substr) && strlen($str) >= strlen($substr)) {
|
||||
return $substr == substr($str, 0, strlen($substr));
|
||||
}
|
||||
}
|
||||
@ -42,8 +42,8 @@ class String
|
||||
*/
|
||||
public static function endsWith($str, $substr)
|
||||
{
|
||||
if(is_string($str) && is_string($substr) && strlen($str) >= strlen($substr)) {
|
||||
if (is_string($str) && is_string($substr) && strlen($str) >= strlen($substr)) {
|
||||
return $substr == substr($str, strlen($str) - strlen($substr));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -62,4 +62,4 @@ class Collection implements \IteratorAggregate, \Countable
|
||||
{
|
||||
return new \ArrayIterator($this->elements);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -68,10 +68,10 @@ class WebServiceContext
|
||||
|
||||
public function getWsdlFile($endpoint = null)
|
||||
{
|
||||
$file = sprintf ('%s/%s.%s.wsdl', $this->options['cache_dir'], $this->options['name'], md5($endpoint));
|
||||
$file = sprintf('%s/%s.%s.wsdl', $this->options['cache_dir'], $this->options['name'], md5($endpoint));
|
||||
$cache = new ConfigCache($file, $this->options['debug']);
|
||||
|
||||
if(!$cache->isFresh()) {
|
||||
if (!$cache->isFresh()) {
|
||||
$definition = $this->getServiceDefinition();
|
||||
|
||||
if ($endpoint) {
|
||||
|
@ -22,16 +22,16 @@
|
||||
"require": {
|
||||
"php": ">=5.3.0",
|
||||
"ext-soap": "*",
|
||||
"besimple/soap-common": "0.3.*",
|
||||
"besimple/soap-wsdl": "0.3.*",
|
||||
"besimple/soap-common": "0.2.*",
|
||||
"besimple/soap-wsdl": "0.2.*",
|
||||
"ass/xmlsecurity": "~1.0",
|
||||
"symfony/framework-bundle": "~2.6",
|
||||
"symfony/twig-bundle": "~2.6",
|
||||
"symfony/framework-bundle": "~2.0|~3.0",
|
||||
"symfony/twig-bundle": "~2.0|~3.0",
|
||||
"zendframework/zend-mime": "2.1.*"
|
||||
},
|
||||
"suggest": {
|
||||
"besimple/soap-client": "0.3.*",
|
||||
"besimple/soap-server": "0.3.*"
|
||||
"besimple/soap-client": "0.2.*",
|
||||
"besimple/soap-server": "0.2.*"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-0": { "BeSimple\\SoapBundle": "" }
|
||||
@ -39,7 +39,7 @@
|
||||
"target-dir": "BeSimple/SoapBundle",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "0.3-dev"
|
||||
"dev-master": "0.2-dev"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -50,7 +50,6 @@ class Curl
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @todo: do not use options as Array
|
||||
* @param array $options Options array from SoapClient constructor
|
||||
* @param int $followLocationMaxRedirects Redirection limit for Location header
|
||||
*/
|
||||
@ -78,9 +77,8 @@ class Curl
|
||||
if (isset($options['compression']) && !($options['compression'] & SOAP_COMPRESSION_ACCEPT)) {
|
||||
curl_setopt($this->ch, CURLOPT_ENCODING, 'identity');
|
||||
}
|
||||
if (isset($options['connection_timeout'])) {
|
||||
curl_setopt($this->ch, CURLOPT_CONNECTTIMEOUT, $options['connection_timeout']);
|
||||
}
|
||||
|
||||
curl_setopt($this->ch, CURLOPT_CONNECTTIMEOUT, 10);
|
||||
|
||||
if (isset($options['proxy_host'])) {
|
||||
if (false !== $options['proxy_host']) {
|
||||
@ -168,7 +166,6 @@ class Curl
|
||||
private function execManualRedirect($redirects = 0)
|
||||
{
|
||||
if ($redirects > $this->followLocationMaxRedirects) {
|
||||
|
||||
// TODO Redirection limit reached, aborting
|
||||
return false;
|
||||
}
|
||||
@ -194,7 +191,7 @@ class Curl
|
||||
if (!isset($url['path'])) {
|
||||
$url['path'] = $lastUrl['path'];
|
||||
}
|
||||
$newUrl = $url['scheme'] . '://' . $url['host'] . $url['path'] . ($url['query'] ? '?' . $url['query'] : '');
|
||||
$newUrl = $url['scheme'].'://'.$url['host'].$url['path'].($url['query'] ? '?'.$url['query'] : '');
|
||||
curl_setopt($this->ch, CURLOPT_URL, $newUrl);
|
||||
|
||||
return $this->execManualRedirect($redirects++);
|
||||
@ -206,7 +203,7 @@ class Curl
|
||||
|
||||
/**
|
||||
* Error code mapping from cURL error codes to PHP ext/soap error messages
|
||||
* (where applicable)
|
||||
* (where applicable).
|
||||
*
|
||||
* http://curl.haxx.se/libcurl/c/libcurl-errors.html
|
||||
*
|
||||
@ -252,7 +249,6 @@ class Curl
|
||||
$errorCodeMapping = $this->getErrorCodeMapping();
|
||||
$errorNumber = curl_errno($this->ch);
|
||||
if (isset($errorCodeMapping[$errorNumber])) {
|
||||
|
||||
return $errorCodeMapping[$errorNumber];
|
||||
}
|
||||
|
||||
|
@ -15,8 +15,7 @@ namespace BeSimple\SoapClient;
|
||||
use BeSimple\SoapCommon\Helper;
|
||||
use BeSimple\SoapCommon\Converter\MtomTypeConverter;
|
||||
use BeSimple\SoapCommon\Converter\SwaTypeConverter;
|
||||
use BeSimple\SoapCommon\SoapOptions\SoapOptions;
|
||||
use BeSimple\SoapCommon\SoapRequest;
|
||||
use BeSimple\SoapCommon\SoapMessage;
|
||||
|
||||
/**
|
||||
* Extended SoapClient that uses a a cURL wrapper for all underlying HTTP
|
||||
@ -28,7 +27,12 @@ use BeSimple\SoapCommon\SoapRequest;
|
||||
*/
|
||||
class SoapClient extends \SoapClient
|
||||
{
|
||||
protected $soapVersion;
|
||||
/**
|
||||
* Soap version.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
protected $soapVersion = SOAP_1_1;
|
||||
|
||||
/**
|
||||
* Tracing enabled?
|
||||
@ -82,24 +86,37 @@ class SoapClient extends \SoapClient
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param SoapClientOptions $soapClientOptions
|
||||
* @param SoapOptions $soapOptions
|
||||
* @param string $wsdl WSDL file
|
||||
* @param array(string=>mixed) $options Options array
|
||||
*/
|
||||
public function __construct(SoapClientOptions $soapClientOptions, SoapOptions $soapOptions)
|
||||
public function __construct($wsdl, array $options = array())
|
||||
{
|
||||
// tracing enabled: store last request/response header and body
|
||||
if (isset($options['trace']) && $options['trace'] === true) {
|
||||
$this->tracingEnabled = true;
|
||||
}
|
||||
// store SOAP version
|
||||
if (isset($options['soap_version'])) {
|
||||
$this->soapVersion = $options['soap_version'];
|
||||
}
|
||||
|
||||
$this->curl = new Curl($options);
|
||||
|
||||
if (isset($options['extra_options'])) {
|
||||
unset($options['extra_options']);
|
||||
}
|
||||
|
||||
$wsdlFile = $this->loadWsdl($wsdl, $options);
|
||||
// TODO $wsdlHandler = new WsdlHandler($wsdlFile, $this->soapVersion);
|
||||
$this->soapKernel = new SoapKernel();
|
||||
$this->soapVersion = $soapOptions->getSoapVersion();
|
||||
$this->tracingEnabled = $soapClientOptions->getTrace();
|
||||
|
||||
// @todo: refactor SoapClient: do not use $options as array
|
||||
$options = $this->configureMime($soapOptions->toArray());
|
||||
|
||||
// @todo: refactor SoapClient: do not use $options as array
|
||||
$this->curl = new Curl($soapClientOptions->toArray());
|
||||
|
||||
// @todo: refactor SoapClient: do not use $options as array
|
||||
$wsdlFile = $this->loadWsdl($soapOptions->getWsdlFile(), $soapOptions->toArray());
|
||||
|
||||
// set up type converter and mime filter
|
||||
$this->configureMime($options);
|
||||
// we want the exceptions option to be set
|
||||
$options['exceptions'] = true;
|
||||
// disable obsolete trace option for native SoapClient as we need to do our own tracing anyways
|
||||
$options['trace'] = false;
|
||||
// disable WSDL caching as we handle WSDL caching for remote URLs ourself
|
||||
$options['cache_wsdl'] = WSDL_CACHE_NONE;
|
||||
parent::__construct($wsdlFile, $options);
|
||||
}
|
||||
|
||||
@ -174,7 +191,6 @@ class SoapClient extends \SoapClient
|
||||
* Custom request method to be able to modify the SOAP messages.
|
||||
* $oneWay parameter is not used at the moment.
|
||||
*
|
||||
* @todo: refactor SoapClient: refactoring starts from here
|
||||
* @param string $request Request string
|
||||
* @param string $location Location
|
||||
* @param string $action SOAP action
|
||||
@ -292,9 +308,16 @@ class SoapClient extends \SoapClient
|
||||
return $this->soapKernel;
|
||||
}
|
||||
|
||||
private function configureMime(array $options)
|
||||
/**
|
||||
* Configure filter and type converter for SwA/MTOM.
|
||||
*
|
||||
* @param array &$options SOAP constructor options array.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
private function configureMime(array &$options)
|
||||
{
|
||||
if (Helper::ATTACHMENTS_TYPE_BASE64 !== $options['attachment_type']) {
|
||||
if (isset($options['attachment_type']) && Helper::ATTACHMENTS_TYPE_BASE64 !== $options['attachment_type']) {
|
||||
// register mime filter in SoapKernel
|
||||
$mimeFilter = new MimeFilter($options['attachment_type']);
|
||||
$this->soapKernel->registerFilter($mimeFilter);
|
||||
@ -315,16 +338,14 @@ class SoapClient extends \SoapClient
|
||||
$options['typemap'][] = array(
|
||||
'type_name' => $converter->getTypeName(),
|
||||
'type_ns' => $converter->getTypeNamespace(),
|
||||
'from_xml' => function($input) use ($converter) {
|
||||
'from_xml' => function ($input) use ($converter) {
|
||||
return $converter->convertXmlToPhp($input);
|
||||
},
|
||||
'to_xml' => function($input) use ($converter) {
|
||||
'to_xml' => function ($input) use ($converter) {
|
||||
return $converter->convertPhpToXml($input);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
return $options;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -359,4 +380,4 @@ class SoapClient extends \SoapClient
|
||||
|
||||
return $cacheFileName;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -12,22 +12,237 @@
|
||||
|
||||
namespace BeSimple\SoapClient;
|
||||
|
||||
use BeSimple\SoapCommon\SoapOptions\SoapOptions;
|
||||
use BeSimple\SoapCommon\AbstractSoapBuilder;
|
||||
use BeSimple\SoapCommon\Helper;
|
||||
|
||||
/**
|
||||
* Provides a SoapClient instance.
|
||||
* Fluent interface builder for SoapClient instance.
|
||||
*
|
||||
* @author Francis Besset <francis.besset@gmail.com>
|
||||
* @author Christian Kerl <christian-kerl@web.de>
|
||||
* @author Petr Bechyně <petr.bechyne@vodafone.com>
|
||||
*/
|
||||
class SoapClientBuilder
|
||||
class SoapClientBuilder extends AbstractSoapBuilder
|
||||
{
|
||||
public function build(SoapClientOptions $soapClientOptions, SoapOptions $soapOptions)
|
||||
/**
|
||||
* Authentication options.
|
||||
*
|
||||
* @var array(string=>mixed)
|
||||
*/
|
||||
protected $soapOptionAuthentication = array();
|
||||
|
||||
/**
|
||||
* Create new instance with default options.
|
||||
*
|
||||
* @return \BeSimple\SoapClient\SoapClientBuilder
|
||||
*/
|
||||
public static function createWithDefaults()
|
||||
{
|
||||
return new SoapClient(
|
||||
$soapClientOptions,
|
||||
$soapOptions
|
||||
return parent::createWithDefaults()
|
||||
->withUserAgent('BeSimpleSoap');
|
||||
}
|
||||
|
||||
/**
|
||||
* Finally returns a SoapClient instance.
|
||||
*
|
||||
* @return \BeSimple\SoapClient\SoapClient
|
||||
*/
|
||||
public function build()
|
||||
{
|
||||
$this->validateOptions();
|
||||
|
||||
return new SoapClient($this->wsdl, $this->getSoapOptions());
|
||||
}
|
||||
|
||||
/**
|
||||
* Get final array of SOAP options.
|
||||
*
|
||||
* @return array(string=>mixed)
|
||||
*/
|
||||
public function getSoapOptions()
|
||||
{
|
||||
return parent::getSoapOptions() + $this->soapOptionAuthentication;
|
||||
}
|
||||
|
||||
/**
|
||||
* Configure option 'trace'.
|
||||
*
|
||||
* @param boolean $trace Enable/Disable
|
||||
*
|
||||
* @return \BeSimple\SoapClient\SoapClientBuilder
|
||||
*/
|
||||
public function withTrace($trace = true)
|
||||
{
|
||||
$this->soapOptions['trace'] = $trace;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Configure option 'exceptions'.
|
||||
*
|
||||
* @param boolean $exceptions Enable/Disable
|
||||
*
|
||||
* @return \BeSimple\SoapClient\SoapClientBuilder
|
||||
*/
|
||||
public function withExceptions($exceptions = true)
|
||||
{
|
||||
$this->soapOptions['exceptions'] = $exceptions;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Configure option 'user_agent'.
|
||||
*
|
||||
* @param string $userAgent User agent string
|
||||
*
|
||||
* @return \BeSimple\SoapClient\SoapClientBuilder
|
||||
*/
|
||||
public function withUserAgent($userAgent)
|
||||
{
|
||||
$this->soapOptions['user_agent'] = $userAgent;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Enable gzip compression.
|
||||
*
|
||||
* @return \BeSimple\SoapClient\SoapClientBuilder
|
||||
*/
|
||||
public function withCompressionGzip()
|
||||
{
|
||||
$this->soapOptions['compression'] = SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Enable deflate compression.
|
||||
*
|
||||
* @return \BeSimple\SoapClient\SoapClientBuilder
|
||||
*/
|
||||
public function withCompressionDeflate()
|
||||
{
|
||||
$this->soapOptions['compression'] = SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_DEFLATE;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Configure basic authentication
|
||||
*
|
||||
* @param string $username Username
|
||||
* @param string $password Password
|
||||
*
|
||||
* @return \BeSimple\SoapClient\SoapClientBuilder
|
||||
*/
|
||||
public function withBasicAuthentication($username, $password)
|
||||
{
|
||||
$this->soapOptionAuthentication = array(
|
||||
'authentication' => SOAP_AUTHENTICATION_BASIC,
|
||||
'login' => $username,
|
||||
'password' => $password,
|
||||
);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Configure digest authentication.
|
||||
*
|
||||
* @param string $certificate Certificate
|
||||
* @param string $passphrase Passphrase
|
||||
*
|
||||
* @return \BeSimple\SoapClient\SoapClientBuilder
|
||||
*/
|
||||
public function withDigestAuthentication($certificate, $passphrase = null)
|
||||
{
|
||||
$this->soapOptionAuthentication = array(
|
||||
'authentication' => SOAP_AUTHENTICATION_DIGEST,
|
||||
'local_cert' => $certificate,
|
||||
);
|
||||
|
||||
if ($passphrase) {
|
||||
$this->soapOptionAuthentication['passphrase'] = $passphrase;
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Configure proxy.
|
||||
*
|
||||
* @param string $host Host
|
||||
* @param int $port Port
|
||||
* @param string $login Login
|
||||
* @param string $password Password
|
||||
* @param int $auth Authentication method
|
||||
*
|
||||
* @return \BeSimple\SoapClient\SoapClientBuilder
|
||||
*/
|
||||
public function withProxy($host, $port, $login = null, $password = null, $auth = null)
|
||||
{
|
||||
$this->soapOptions['proxy_host'] = $host;
|
||||
$this->soapOptions['proxy_port'] = $port;
|
||||
|
||||
if ($login) {
|
||||
$this->soapOptions['proxy_login'] = $login;
|
||||
$this->soapOptions['proxy_password'] = $password;
|
||||
|
||||
if ($auth) {
|
||||
if (!in_array($auth, array(\CURLAUTH_BASIC, \CURLAUTH_NTLM), true)) {
|
||||
throw new \InvalidArgumentException('Invalid authentication method: CURLAUTH_BASIC or CURLAUTH_NTLM constants are availables.');
|
||||
}
|
||||
|
||||
$this->soapOptions['proxy_auth'] = $auth;
|
||||
}
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* SOAP attachment type Base64.
|
||||
*
|
||||
* @return \BeSimple\SoapServer\SoapServerBuilder
|
||||
*/
|
||||
public function withBase64Attachments()
|
||||
{
|
||||
$this->options['attachment_type'] = Helper::ATTACHMENTS_TYPE_BASE64;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* SOAP attachment type SwA.
|
||||
*
|
||||
* @return \BeSimple\SoapServer\SoapServerBuilder
|
||||
*/
|
||||
public function withSwaAttachments()
|
||||
{
|
||||
$this->options['attachment_type'] = Helper::ATTACHMENTS_TYPE_SWA;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* SOAP attachment type MTOM.
|
||||
*
|
||||
* @return \BeSimple\SoapServer\SoapServerBuilder
|
||||
*/
|
||||
public function withMtomAttachments()
|
||||
{
|
||||
$this->options['attachment_type'] = Helper::ATTACHMENTS_TYPE_MTOM;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate options.
|
||||
*/
|
||||
protected function validateOptions()
|
||||
{
|
||||
$this->validateWsdl();
|
||||
}
|
||||
}
|
||||
|
@ -1,35 +0,0 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the BeSimpleSoapBundle.
|
||||
*
|
||||
* (c) Christian Kerl <christian-kerl@web.de>
|
||||
* (c) Francis Besset <francis.besset@gmail.com>
|
||||
*
|
||||
* This source file is subject to the MIT license that is bundled
|
||||
* with this source code in the file LICENSE.
|
||||
*/
|
||||
|
||||
namespace BeSimple\SoapClient;
|
||||
|
||||
use BeSimple\SoapCommon\SoapOptions\SoapOptions;
|
||||
|
||||
/**
|
||||
* Provides a SoapClient instance.
|
||||
*
|
||||
* @author Francis Besset <francis.besset@gmail.com>
|
||||
* @author Christian Kerl <christian-kerl@web.de>
|
||||
* @author Petr Bechyně <petr.bechyne@vodafone.com>
|
||||
*/
|
||||
class SoapClientOptionsBuilder
|
||||
{
|
||||
public static function createWithDefaults()
|
||||
{
|
||||
return new SoapClientOptions(
|
||||
SoapClientOptions::SOAP_CLIENT_TRACE_OFF,
|
||||
SoapClientOptions::SOAP_CLIENT_EXCEPTIONS_ON,
|
||||
'BeSimpleSoap',
|
||||
SoapClientOptions::SOAP_CLIENT_COMPRESSION_NONE
|
||||
);
|
||||
}
|
||||
}
|
@ -1,107 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace BeSimple\SoapClient;
|
||||
|
||||
use BeSimple\SoapClient\SoapServerAuthentication\SoapServerAuthenticationInterface;
|
||||
use BeSimple\SoapClient\SoapServerProxy\SoapServerProxy;
|
||||
|
||||
class SoapClientOptions
|
||||
{
|
||||
const SOAP_CLIENT_TRACE_ON = true;
|
||||
const SOAP_CLIENT_TRACE_OFF = false;
|
||||
const SOAP_CLIENT_EXCEPTIONS_ON = true;
|
||||
const SOAP_CLIENT_EXCEPTIONS_OFF = false;
|
||||
const SOAP_CLIENT_COMPRESSION_NONE = null;
|
||||
const SOAP_CLIENT_COMPRESSION_GZIP = SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP;
|
||||
const SOAP_CLIENT_COMPRESSION_DEFLATE = SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_DEFLATE;
|
||||
|
||||
private $trace;
|
||||
private $exceptions;
|
||||
private $userAgent;
|
||||
private $compression;
|
||||
private $authentication;
|
||||
private $proxy;
|
||||
|
||||
/**
|
||||
* @param bool $trace = SoapClientOptions::SOAP_CLIENT_TRACE_ON|SoapClientOptions::SOAP_CLIENT_TRACE_OFF
|
||||
* @param bool $exceptions = SoapClientOptions::SOAP_CLIENT_EXCEPTIONS_ON|SoapClientOptions::SOAP_CLIENT_EXCEPTIONS_OFF
|
||||
* @param string $userAgent
|
||||
* @param int $compression = SoapClientOptions::SOAP_CLIENT_COMPRESSION_NONE|SoapClientOptions::SOAP_CLIENT_COMPRESSION_GZIP|SoapClientOptions::SOAP_CLIENT_COMPRESSION_DEFLATE
|
||||
* @param SoapServerAuthenticationInterface $authentication = null
|
||||
* @param SoapServerProxy $proxy = null
|
||||
*/
|
||||
public function __construct($trace, $exceptions, $userAgent, $compression = null, SoapServerAuthenticationInterface $authentication = null, SoapServerProxy $proxy = null)
|
||||
{
|
||||
$this->trace = $trace;
|
||||
$this->exceptions = $exceptions;
|
||||
$this->userAgent = $userAgent;
|
||||
$this->compression = $compression;
|
||||
$this->authentication = $authentication;
|
||||
$this->proxy = $proxy;
|
||||
}
|
||||
|
||||
public function getTrace()
|
||||
{
|
||||
return $this->trace;
|
||||
}
|
||||
|
||||
public function getExceptions()
|
||||
{
|
||||
return $this->exceptions;
|
||||
}
|
||||
|
||||
public function getUserAgent()
|
||||
{
|
||||
return $this->userAgent;
|
||||
}
|
||||
|
||||
public function hasCompression()
|
||||
{
|
||||
return $this->compression !== self::SOAP_CLIENT_COMPRESSION_NONE;
|
||||
}
|
||||
|
||||
public function getCompression()
|
||||
{
|
||||
return $this->compression;
|
||||
}
|
||||
|
||||
public function hasAuthentication()
|
||||
{
|
||||
return $this->authentication !== null;
|
||||
}
|
||||
|
||||
public function hasProxy()
|
||||
{
|
||||
return $this->proxy !== null;
|
||||
}
|
||||
|
||||
public function getAuthentication()
|
||||
{
|
||||
return $this->authentication;
|
||||
}
|
||||
|
||||
public function getProxy()
|
||||
{
|
||||
return $this->proxy;
|
||||
}
|
||||
|
||||
public function toArray()
|
||||
{
|
||||
$optionsAsArray = [
|
||||
'trace' => $this->getTrace(),
|
||||
'exceptions' => $this->getExceptions(),
|
||||
'user_agent' => $this->getUserAgent(),
|
||||
];
|
||||
if ($this->hasCompression()) {
|
||||
$optionsAsArray['compression'] = $this->getCompression();
|
||||
}
|
||||
if ($this->hasAuthentication()) {
|
||||
$optionsAsArray += $this->getAuthentication()->toArray();
|
||||
}
|
||||
if ($this->hasProxy()) {
|
||||
$optionsAsArray += $this->getProxy()->toArray();
|
||||
}
|
||||
|
||||
return $optionsAsArray;
|
||||
}
|
||||
}
|
@ -1,39 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace BeSimple\SoapClient\SoapServerAuthentication;
|
||||
|
||||
class SoapServerAuthenticationBasic implements SoapServerAuthenticationInterface
|
||||
{
|
||||
private $login;
|
||||
private $password;
|
||||
|
||||
public function __construct($login, $password)
|
||||
{
|
||||
$this->login = $login;
|
||||
$this->password = $password;
|
||||
}
|
||||
|
||||
public function getAuthentication()
|
||||
{
|
||||
return \SOAP_AUTHENTICATION_BASIC;
|
||||
}
|
||||
|
||||
public function getLogin()
|
||||
{
|
||||
return $this->login;
|
||||
}
|
||||
|
||||
public function getPassword()
|
||||
{
|
||||
return $this->password;
|
||||
}
|
||||
|
||||
public function toArray()
|
||||
{
|
||||
return [
|
||||
'authentication' => $this->getAuthentication(),
|
||||
'login' => $this->getLogin(),
|
||||
'password' => $this->getPassword(),
|
||||
];
|
||||
}
|
||||
}
|
@ -1,52 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace BeSimple\SoapClient\SoapServerAuthentication;
|
||||
|
||||
class SoapServerAuthenticationDigest implements SoapServerAuthenticationInterface
|
||||
{
|
||||
private $localCert;
|
||||
private $passPhrase;
|
||||
|
||||
/**
|
||||
* @param string $localCert
|
||||
* @param string $passPhrase = null
|
||||
*/
|
||||
public function __construct($localCert, $passPhrase = null)
|
||||
{
|
||||
$this->localCert = $localCert;
|
||||
$this->passPhrase = $passPhrase;
|
||||
}
|
||||
|
||||
public function getLocalCert()
|
||||
{
|
||||
return $this->localCert;
|
||||
}
|
||||
|
||||
public function hasPassPhrase()
|
||||
{
|
||||
return $this->passPhrase !== null;
|
||||
}
|
||||
|
||||
public function getPassPhrase()
|
||||
{
|
||||
return $this->passPhrase;
|
||||
}
|
||||
|
||||
public function getAuthentication()
|
||||
{
|
||||
return \SOAP_AUTHENTICATION_DIGEST;
|
||||
}
|
||||
|
||||
public function toArray()
|
||||
{
|
||||
$authenticationAsArray = [
|
||||
'authentication' => $this->getAuthentication(),
|
||||
'local_cert' => $this->getLocalCert()
|
||||
];
|
||||
if ($this->hasPassPhrase()) {
|
||||
$authenticationAsArray['passphrase'] = $this->getPassPhrase();
|
||||
}
|
||||
|
||||
return $authenticationAsArray;
|
||||
}
|
||||
}
|
@ -1,16 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace BeSimple\SoapClient\SoapServerAuthentication;
|
||||
|
||||
interface SoapServerAuthenticationInterface
|
||||
{
|
||||
/**
|
||||
* @return int
|
||||
*/
|
||||
public function getAuthentication();
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function toArray();
|
||||
}
|
@ -1,84 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace BeSimple\SoapClient\SoapServerProxy;
|
||||
|
||||
class SoapServerProxy
|
||||
{
|
||||
const PROXY_AUTHENTICATION_TYPE_NONE = null;
|
||||
const PROXY_AUTHENTICATION_TYPE_BASIC = \CURLAUTH_BASIC;
|
||||
const PROXY_AUTHENTICATION_TYPE_NTLM = \CURLAUTH_NTLM;
|
||||
|
||||
private $host;
|
||||
private $port;
|
||||
private $login;
|
||||
private $password;
|
||||
private $authenticationType;
|
||||
|
||||
/**
|
||||
* @param string $host
|
||||
* @param int $port
|
||||
* @param string $login = null
|
||||
* @param string $password = null
|
||||
* @param int $authenticationType = null|SoapServerProxy::PROXY_AUTHENTICATION_TYPE_BASIC|SoapServerProxy::PROXY_AUTHENTICATION_TYPE_NTLM
|
||||
*/
|
||||
public function __construct($host, $port, $login = null, $password = null, $authenticationType = null)
|
||||
{
|
||||
$this->host = $host;
|
||||
$this->port = $port;
|
||||
$this->login = $login;
|
||||
$this->password = $password;
|
||||
$this->authenticationType = $authenticationType;
|
||||
}
|
||||
|
||||
public function getHost()
|
||||
{
|
||||
return $this->host;
|
||||
}
|
||||
|
||||
public function getPort()
|
||||
{
|
||||
return $this->port;
|
||||
}
|
||||
|
||||
public function hasCredentials()
|
||||
{
|
||||
return $this->login !== null;
|
||||
}
|
||||
|
||||
public function getLogin()
|
||||
{
|
||||
return $this->login;
|
||||
}
|
||||
|
||||
public function getPassword()
|
||||
{
|
||||
return $this->password;
|
||||
}
|
||||
|
||||
public function hasAuthenticationType()
|
||||
{
|
||||
return $this->authenticationType !== self::PROXY_AUTHENTICATION_TYPE_NONE;
|
||||
}
|
||||
|
||||
public function getAuthenticationType()
|
||||
{
|
||||
return $this->authenticationType;
|
||||
}
|
||||
|
||||
public function toArray()
|
||||
{
|
||||
$proxyAsArray = [
|
||||
'proxy_host' => $this->getHost(),
|
||||
'proxy_port' => $this->getPort(),
|
||||
];
|
||||
if ($this->hasCredentials()) {
|
||||
$proxyAsArray['proxy_login'] = $this->getLogin();
|
||||
$proxyAsArray['proxy_password'] = $this->getPassword();
|
||||
}
|
||||
if ($this->hasAuthenticationType()) {
|
||||
$proxyAsArray['proxy_auth'] = $this->getAuthenticationType();
|
||||
}
|
||||
|
||||
return $proxyAsArray;
|
||||
}
|
||||
}
|
48
src/BeSimple/SoapClient/SoapRequest.php
Normal file
48
src/BeSimple/SoapClient/SoapRequest.php
Normal file
@ -0,0 +1,48 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the BeSimpleSoapClient.
|
||||
*
|
||||
* (c) Christian Kerl <christian-kerl@web.de>
|
||||
* (c) Francis Besset <francis.besset@gmail.com>
|
||||
*
|
||||
* This source file is subject to the MIT license that is bundled
|
||||
* with this source code in the file LICENSE.
|
||||
*/
|
||||
|
||||
namespace BeSimple\SoapClient;
|
||||
|
||||
use BeSimple\SoapCommon\SoapRequest as CommonSoapRequest;
|
||||
use BeSimple\SoapCommon\SoapMessage;
|
||||
|
||||
/**
|
||||
* SoapRequest class for SoapClient. Provides factory function for request object.
|
||||
*
|
||||
* @author Andreas Schamberger <mail@andreass.net>
|
||||
*/
|
||||
class SoapRequest extends CommonSoapRequest
|
||||
{
|
||||
/**
|
||||
* Factory function for SoapRequest.
|
||||
*
|
||||
* @param string $content Content
|
||||
* @param string $location Location
|
||||
* @param string $action SOAP action
|
||||
* @param string $version SOAP version
|
||||
*
|
||||
* @return BeSimple\SoapClient\SoapRequest
|
||||
*/
|
||||
public static function create($content, $location, $action, $version)
|
||||
{
|
||||
$request = new SoapRequest();
|
||||
// $content is if unmodified from SoapClient not a php string type!
|
||||
$request->setContent((string) $content);
|
||||
$request->setLocation($location);
|
||||
$request->setAction($action);
|
||||
$request->setVersion($version);
|
||||
$contentType = SoapMessage::getContentTypeForVersion($version);
|
||||
$request->setContentType($contentType);
|
||||
|
||||
return $request;
|
||||
}
|
||||
}
|
@ -30,7 +30,7 @@ class SoapResponse extends CommonSoapResponse
|
||||
* @param string $version SOAP version
|
||||
* @param string $contentType Content type header
|
||||
*
|
||||
* @return SoapResponse
|
||||
* @return BeSimple\SoapClient\SoapResponse
|
||||
*/
|
||||
public static function create($content, $location, $action, $version, $contentType)
|
||||
{
|
||||
|
@ -23,8 +23,7 @@ abstract class AbstractWebServerTest extends \PHPUnit_Framework_TestCase
|
||||
/**
|
||||
* @var ProcessBuilder
|
||||
*/
|
||||
static protected $webserver;
|
||||
static protected $websererPortLength;
|
||||
protected static $webserver;
|
||||
|
||||
public static function setUpBeforeClass()
|
||||
{
|
||||
@ -44,8 +43,6 @@ abstract class AbstractWebServerTest extends \PHPUnit_Framework_TestCase
|
||||
|
||||
self::$webserver->start();
|
||||
usleep(100000);
|
||||
|
||||
self::$websererPortLength = strlen(WEBSERVER_PORT);
|
||||
}
|
||||
|
||||
public static function tearDownAfterClass()
|
||||
|
@ -4,4 +4,4 @@ namespace BeSimple\SoapClient\Tests\AxisInterop\Fixtures;
|
||||
|
||||
class AttachmentRequest extends AttachmentType
|
||||
{
|
||||
}
|
||||
}
|
||||
|
@ -6,4 +6,4 @@ class AttachmentType
|
||||
{
|
||||
public $fileName;
|
||||
public $binaryData;
|
||||
}
|
||||
}
|
||||
|
@ -20,4 +20,4 @@ class TestCase extends \PHPUnit_Framework_TestCase
|
||||
|
||||
curl_close($ch);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -74,7 +74,7 @@ class WsSecurityUserPassAxisInteropTest extends TestCase
|
||||
$sc = new BeSimpleSoapClient(__DIR__.'/Fixtures/WsSecurityUserPass.wsdl', $this->options);
|
||||
|
||||
$wssFilter = new BeSimpleWsSecurityFilter(true, 600);
|
||||
$wssFilter->addUserData( 'libuser', 'books', BeSimpleWsSecurityFilter::PASSWORD_TYPE_DIGEST );
|
||||
$wssFilter->addUserData('libuser', 'books', BeSimpleWsSecurityFilter::PASSWORD_TYPE_DIGEST);
|
||||
|
||||
$soapKernel = $sc->getSoapKernel();
|
||||
$soapKernel->registerFilter($wssFilter);
|
||||
|
@ -45,19 +45,6 @@ class CurlTest extends AbstractWebserverTest
|
||||
$this->assertEquals('Unable to parse URL', $curl->getErrorMessage());
|
||||
}
|
||||
|
||||
public function testGetRequestHeaders()
|
||||
{
|
||||
$curl = new Curl(array(
|
||||
'proxy_host' => false,
|
||||
));
|
||||
|
||||
$curl->exec(sprintf('http://localhost:%d/curl.txt', WEBSERVER_PORT));
|
||||
$this->assertEquals(132 + self::$websererPortLength, strlen($curl->getRequestHeaders()));
|
||||
|
||||
$curl->exec(sprintf('http://localhost:%s/404.txt', WEBSERVER_PORT));
|
||||
$this->assertEquals(131 + self::$websererPortLength, strlen($curl->getRequestHeaders()));
|
||||
}
|
||||
|
||||
public function testGetResponse()
|
||||
{
|
||||
$curl = new Curl(array(
|
||||
@ -66,7 +53,6 @@ class CurlTest extends AbstractWebserverTest
|
||||
|
||||
$curl->exec(sprintf('http://localhost:%d/curl.txt', WEBSERVER_PORT));
|
||||
$this->assertSame('OK', $curl->getResponseStatusMessage());
|
||||
$this->assertEquals(145 + self::$websererPortLength, strlen($curl->getResponse()));
|
||||
|
||||
$curl->exec(sprintf('http://localhost:%d/404.txt', WEBSERVER_PORT));
|
||||
$this->assertSame('Not Found', $curl->getResponseStatusMessage());
|
||||
@ -95,19 +81,6 @@ class CurlTest extends AbstractWebserverTest
|
||||
$this->assertEquals('text/html; charset=UTF-8', $curl->getResponseContentType());
|
||||
}
|
||||
|
||||
public function testGetResponseHeaders()
|
||||
{
|
||||
$curl = new Curl(array(
|
||||
'proxy_host' => false,
|
||||
));
|
||||
|
||||
$curl->exec(sprintf('http://localhost:%d/curl.txt', WEBSERVER_PORT));
|
||||
$this->assertEquals(117 + self::$websererPortLength, strlen($curl->getResponseHeaders()));
|
||||
|
||||
$curl->exec(sprintf('http://localhost:%d/404.txt', WEBSERVER_PORT));
|
||||
$this->assertEquals(124 + self::$websererPortLength, strlen($curl->getResponseHeaders()));
|
||||
}
|
||||
|
||||
public function testGetResponseStatusCode()
|
||||
{
|
||||
$curl = new Curl(array(
|
||||
|
@ -4,4 +4,4 @@ namespace BeSimple\SoapClient\Tests\ServerInterop\Fixtures;
|
||||
|
||||
class AttachmentRequest extends AttachmentType
|
||||
{
|
||||
}
|
||||
}
|
||||
|
@ -6,4 +6,4 @@ class AttachmentType
|
||||
{
|
||||
public $fileName;
|
||||
public $binaryData;
|
||||
}
|
||||
}
|
||||
|
@ -36,7 +36,6 @@ try {
|
||||
$attachment->binaryData = $b64;
|
||||
|
||||
var_dump($sc->attachment($attachment));
|
||||
|
||||
} catch (Exception $e) {
|
||||
var_dump($e);
|
||||
}
|
||||
@ -46,4 +45,4 @@ try {
|
||||
// $sc->__getLastRequest(),
|
||||
// $sc->__getLastResponseHeaders(),
|
||||
// $sc->__getLastResponse()
|
||||
// );
|
||||
// );
|
||||
|
@ -29,7 +29,6 @@ $options = array(
|
||||
$sc = new BeSimpleSoapClient(__DIR__.'/Fixtures/SwA.wsdl', $options);
|
||||
|
||||
try {
|
||||
|
||||
$upload = new uploadFile();
|
||||
$upload->name = 'upload.txt';
|
||||
$upload->data = 'This is a test. :)';
|
||||
@ -49,4 +48,4 @@ try {
|
||||
// $sc->__getLastRequest(),
|
||||
// $sc->__getLastResponseHeaders(),
|
||||
// $sc->__getLastResponse()
|
||||
// );
|
||||
// );
|
||||
|
@ -26,4 +26,4 @@ class TestCase extends \PHPUnit_Framework_TestCase
|
||||
|
||||
curl_close($ch);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -69,7 +69,6 @@ try {
|
||||
$ab->type = 'scifi';
|
||||
|
||||
var_dump($sc->addBook($ab));
|
||||
|
||||
} catch (Exception $e) {
|
||||
var_dump($e);
|
||||
}
|
||||
|
@ -54,7 +54,6 @@ try {
|
||||
$ab->type = 'scifi';
|
||||
|
||||
var_dump($sc->addBook($ab));
|
||||
|
||||
} catch (Exception $e) {
|
||||
var_dump($e);
|
||||
}
|
||||
|
@ -63,7 +63,7 @@ class WsSecurityUserPassServerInteropTest extends TestCase
|
||||
$sc = new BeSimpleSoapClient(__DIR__.'/Fixtures/WsSecurityUserPass.wsdl', $this->options);
|
||||
|
||||
$wssFilter = new BeSimpleWsSecurityFilter(true, 600);
|
||||
$wssFilter->addUserData( 'libuser', 'books', BeSimpleWsSecurityFilter::PASSWORD_TYPE_DIGEST );
|
||||
$wssFilter->addUserData('libuser', 'books', BeSimpleWsSecurityFilter::PASSWORD_TYPE_DIGEST);
|
||||
|
||||
$soapKernel = $sc->getSoapKernel();
|
||||
$soapKernel->registerFilter($wssFilter);
|
||||
|
@ -114,7 +114,7 @@ class SoapClientBuilderTest extends \PHPUnit_Framework_TestCase
|
||||
|
||||
public function testCreateWithDefaults()
|
||||
{
|
||||
$builder = SoapClientBuilder::createClientWithDefaults();
|
||||
$builder = SoapClientBuilder::createWithDefaults();
|
||||
|
||||
$this->assertInstanceOf('BeSimple\SoapClient\SoapClientBuilder', $builder);
|
||||
|
||||
|
@ -25,9 +25,9 @@ use org\bovigo\vfs\vfsStreamWrapper;
|
||||
*/
|
||||
class WsdlDownloaderTest extends AbstractWebserverTest
|
||||
{
|
||||
static protected $filesystem;
|
||||
protected static $filesystem;
|
||||
|
||||
static protected $fixturesPath;
|
||||
protected static $fixturesPath;
|
||||
|
||||
/**
|
||||
* @dataProvider provideDownload
|
||||
@ -278,7 +278,7 @@ class WsdlDownloaderTest extends AbstractWebserverTest
|
||||
$content = file_get_contents(self::$fixturesPath.$file);
|
||||
$content = preg_replace('#'.preg_quote('%location%').'#', sprintf('localhost:%d', WEBSERVER_PORT), $content);
|
||||
|
||||
self::$filesystem->dumpFile(self::$fixturesPath.'build_include'.DIRECTORY_SEPARATOR.pathinfo($file, PATHINFO_BASENAME), $content);
|
||||
file_put_contents(self::$fixturesPath.'build_include'.DIRECTORY_SEPARATOR.pathinfo($file, PATHINFO_BASENAME), $content);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -157,7 +157,6 @@ class WsAddressingFilter implements SoapRequestFilter, SoapResponseFilter
|
||||
public function getReferenceParameter($ns, $parameter)
|
||||
{
|
||||
if (isset($this->referenceParametersRecieved[$ns][$parameter])) {
|
||||
|
||||
return $this->referenceParametersRecieved[$ns][$parameter];
|
||||
}
|
||||
|
||||
@ -344,4 +343,4 @@ class WsAddressingFilter implements SoapRequestFilter, SoapResponseFilter
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -151,7 +151,6 @@ class WsSecurityFilter extends WsSecurityFilterClientServer implements SoapReque
|
||||
if (null !== $this->password
|
||||
&& (null === $this->userSecurityKey
|
||||
|| (null !== $this->userSecurityKey && !$this->userSecurityKey->hasPrivateKey()))) {
|
||||
|
||||
if (self::PASSWORD_TYPE_DIGEST === $this->passwordType) {
|
||||
$nonce = mt_rand();
|
||||
$password = base64_encode(sha1($nonce . $createdTimestamp . $this->password, true));
|
||||
|
@ -56,7 +56,7 @@ class WsdlDownloader
|
||||
/**
|
||||
* Resolve WSDl/XSD includes.
|
||||
*
|
||||
* @var boolean
|
||||
* @var bool
|
||||
*/
|
||||
protected $resolveRemoteIncludes = true;
|
||||
|
||||
@ -64,13 +64,13 @@ class WsdlDownloader
|
||||
* Constructor.
|
||||
*
|
||||
* @param \BeSimple\SoapClient\Curl $curl Curl instance
|
||||
* @param boolean $resolveRemoteIncludes WSDL/XSD include enabled?
|
||||
* @param boolean $cacheWsdl Cache constant
|
||||
* @param bool $resolveRemoteIncludes WSDL/XSD include enabled?
|
||||
* @param bool $cacheWsdl Cache constant
|
||||
*/
|
||||
public function __construct(Curl $curl, $resolveRemoteIncludes = true, $cacheWsdl = Cache::TYPE_DISK)
|
||||
{
|
||||
$this->curl = $curl;
|
||||
$this->resolveRemoteIncludes = (Boolean) $resolveRemoteIncludes;
|
||||
$this->curl = $curl;
|
||||
$this->resolveRemoteIncludes = (bool) $resolveRemoteIncludes;
|
||||
|
||||
// get current WSDL caching config
|
||||
$this->cacheEnabled = $cacheWsdl === Cache::TYPE_NONE ? Cache::DISABLED : Cache::ENABLED == Cache::isEnabled();
|
||||
@ -101,19 +101,33 @@ class WsdlDownloader
|
||||
if ($responseSuccessfull) {
|
||||
$response = $this->curl->getResponseBody();
|
||||
|
||||
libxml_use_internal_errors(true);
|
||||
|
||||
$doc = simplexml_load_string($response);
|
||||
|
||||
if (!$doc) {
|
||||
$errors = libxml_get_errors();
|
||||
|
||||
if (count($errors)) {
|
||||
throw new \Exception('There is something wrong with the WSDL file formatting. The file can\'t be downloaded to be cached.');
|
||||
}
|
||||
|
||||
libxml_clear_errors();
|
||||
}
|
||||
|
||||
if ($this->resolveRemoteIncludes) {
|
||||
$this->resolveRemoteIncludes($response, $cacheFilePath, $wsdl);
|
||||
} else {
|
||||
file_put_contents($cacheFilePath, $response);
|
||||
}
|
||||
} else {
|
||||
throw new \ErrorException("SOAP-ERROR: Parsing WSDL: Couldn't load from '" . $wsdl ."'");
|
||||
throw new \ErrorException("SOAP-ERROR: Parsing WSDL: Couldn't load from '".$wsdl."'");
|
||||
}
|
||||
} elseif (file_exists($wsdl)) {
|
||||
$response = file_get_contents($wsdl);
|
||||
$this->resolveRemoteIncludes($response, $cacheFilePath);
|
||||
} else {
|
||||
throw new \ErrorException("SOAP-ERROR: Parsing WSDL: Couldn't load from '" . $wsdl ."'");
|
||||
throw new \ErrorException("SOAP-ERROR: Parsing WSDL: Couldn't load from '".$wsdl."'");
|
||||
}
|
||||
}
|
||||
|
||||
@ -122,7 +136,7 @@ class WsdlDownloader
|
||||
return realpath($wsdl);
|
||||
}
|
||||
|
||||
throw new \ErrorException("SOAP-ERROR: Parsing WSDL: Couldn't load from '" . $wsdl ."'");
|
||||
throw new \ErrorException("SOAP-ERROR: Parsing WSDL: Couldn't load from '".$wsdl."'");
|
||||
}
|
||||
|
||||
/**
|
||||
@ -130,7 +144,7 @@ class WsdlDownloader
|
||||
*
|
||||
* @param string $file File URL/path
|
||||
*
|
||||
* @return boolean
|
||||
* @return bool
|
||||
*/
|
||||
private function isRemoteFile($file)
|
||||
{
|
||||
@ -147,11 +161,9 @@ class WsdlDownloader
|
||||
/**
|
||||
* Resolves remote WSDL/XSD includes within the WSDL files.
|
||||
*
|
||||
* @param string $xml XML file
|
||||
* @param string $cacheFilePath Cache file name
|
||||
* @param boolean $parentFilePath Parent file name
|
||||
*
|
||||
* @return void
|
||||
* @param string $xml XML file
|
||||
* @param string $cacheFilePath Cache file name
|
||||
* @param bool $parentFilePath Parent file name
|
||||
*/
|
||||
private function resolveRemoteIncludes($xml, $cacheFilePath, $parentFilePath = null)
|
||||
{
|
||||
@ -214,10 +226,10 @@ class WsdlDownloader
|
||||
$urlParts = parse_url($base);
|
||||
|
||||
// combine base path with relative path
|
||||
if (isset($urlParts['path']) && '/' === $relative{0}) {
|
||||
if (isset($urlParts['path']) && '/' === $relative[0]) {
|
||||
// $relative is absolute path from domain (starts with /)
|
||||
$path = $relative;
|
||||
} elseif (isset($urlParts['path']) && strrpos($urlParts['path'], '/') === (strlen($urlParts['path']) )) {
|
||||
} elseif (isset($urlParts['path']) && strrpos($urlParts['path'], '/') === (strlen($urlParts['path']))) {
|
||||
// base path is directory
|
||||
$path = $urlParts['path'].$relative;
|
||||
} elseif (isset($urlParts['path'])) {
|
||||
@ -247,7 +259,7 @@ class WsdlDownloader
|
||||
break;
|
||||
}
|
||||
|
||||
$keyToDelete--;
|
||||
--$keyToDelete;
|
||||
}
|
||||
|
||||
unset($parts[$key]);
|
||||
|
@ -65,6 +65,5 @@ class XmlMimeFilter implements SoapRequestFilter
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -23,12 +23,12 @@
|
||||
"php": ">=5.3.0",
|
||||
"ext-soap": "*",
|
||||
"ext-curl": "*",
|
||||
"besimple/soap-common": "0.3.*",
|
||||
"besimple/soap-common": "0.2.*",
|
||||
"ass/xmlsecurity": "~1.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"mikey179/vfsStream": "~1.0",
|
||||
"symfony/filesystem": "~2.3",
|
||||
"symfony/filesystem": "~2.0",
|
||||
"symfony/process": "~2.3"
|
||||
},
|
||||
"autoload": {
|
||||
@ -37,7 +37,7 @@
|
||||
"target-dir": "BeSimple/SoapClient",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "0.3-dev"
|
||||
"dev-master": "0.2-dev"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
246
src/BeSimple/SoapCommon/AbstractSoapBuilder.php
Normal file
246
src/BeSimple/SoapCommon/AbstractSoapBuilder.php
Normal file
@ -0,0 +1,246 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the BeSimpleSoapBundle.
|
||||
*
|
||||
* (c) Christian Kerl <christian-kerl@web.de>
|
||||
* (c) Francis Besset <francis.besset@gmail.com>
|
||||
*
|
||||
* This source file is subject to the MIT license that is bundled
|
||||
* with this source code in the file LICENSE.
|
||||
*/
|
||||
|
||||
namespace BeSimple\SoapCommon;
|
||||
|
||||
use BeSimple\SoapCommon\Converter\TypeConverterCollection;
|
||||
use BeSimple\SoapCommon\Converter\TypeConverterInterface;
|
||||
|
||||
/**
|
||||
* @author Christian Kerl <christian-kerl@web.de>
|
||||
* @author Francis Besset <francis.besset@gmail.com>
|
||||
*/
|
||||
abstract class AbstractSoapBuilder
|
||||
{
|
||||
protected $wsdl;
|
||||
protected $soapOptions = array();
|
||||
|
||||
/**
|
||||
* @return AbstractSoapBuilder
|
||||
*/
|
||||
public static function createWithDefaults()
|
||||
{
|
||||
$builder = new static();
|
||||
|
||||
return $builder
|
||||
->withSoapVersion12()
|
||||
->withEncoding('UTF-8')
|
||||
->withSingleElementArrays()
|
||||
;
|
||||
}
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->soapOptions['features'] = 0;
|
||||
$this->soapOptions['classmap'] = new Classmap();
|
||||
$this->soapOptions['typemap'] = new TypeConverterCollection();
|
||||
}
|
||||
|
||||
public function getWsdl()
|
||||
{
|
||||
return $this->wsdl;
|
||||
}
|
||||
|
||||
public function getSoapOptions()
|
||||
{
|
||||
$options = $this->soapOptions;
|
||||
|
||||
$options['classmap'] = $this->soapOptions['classmap']->all();
|
||||
$options['typemap'] = $this->soapOptions['typemap']->getTypemap();
|
||||
|
||||
return $options;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return AbstractSoapBuilder
|
||||
*/
|
||||
public function withWsdl($wsdl)
|
||||
{
|
||||
$this->wsdl = $wsdl;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return AbstractSoapBuilder
|
||||
*/
|
||||
public function withSoapVersion11()
|
||||
{
|
||||
$this->soapOptions['soap_version'] = \SOAP_1_1;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return AbstractSoapBuilder
|
||||
*/
|
||||
public function withSoapVersion12()
|
||||
{
|
||||
$this->soapOptions['soap_version'] = \SOAP_1_2;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function withEncoding($encoding)
|
||||
{
|
||||
$this->soapOptions['encoding'] = $encoding;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function withWsdlCache($cache)
|
||||
{
|
||||
if (!in_array($cache, Cache::getTypes(), true)) {
|
||||
throw new \InvalidArgumentException();
|
||||
}
|
||||
|
||||
$this->soapOptions['cache_wsdl'] = $cache;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return AbstractSoapBuilder
|
||||
*/
|
||||
public function withWsdlCacheNone()
|
||||
{
|
||||
$this->soapOptions['cache_wsdl'] = Cache::TYPE_NONE;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return AbstractSoapBuilder
|
||||
*/
|
||||
public function withWsdlCacheDisk()
|
||||
{
|
||||
$this->soapOptions['cache_wsdl'] = Cache::TYPE_DISK;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return AbstractSoapBuilder
|
||||
*/
|
||||
public function withWsdlCacheMemory()
|
||||
{
|
||||
$this->soapOptions['cache_wsdl'] = Cache::TYPE_MEMORY;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return AbstractSoapBuilder
|
||||
*/
|
||||
public function withWsdlCacheDiskAndMemory()
|
||||
{
|
||||
$this->soapOptions['cache_wsdl'] = Cache::TYPE_DISK_MEMORY;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Enables the SOAP_SINGLE_ELEMENT_ARRAYS feature.
|
||||
* If enabled arrays containing only one element will be passed as arrays otherwise the single element is extracted and directly passed.
|
||||
*
|
||||
* @return AbstractSoapBuilder
|
||||
*/
|
||||
public function withSingleElementArrays()
|
||||
{
|
||||
$this->soapOptions['features'] |= \SOAP_SINGLE_ELEMENT_ARRAYS;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Enables the SOAP_WAIT_ONE_WAY_CALLS feature.
|
||||
*
|
||||
* @return AbstractSoapBuilder
|
||||
*/
|
||||
public function withWaitOneWayCalls()
|
||||
{
|
||||
$this->soapOptions['features'] |= \SOAP_WAIT_ONE_WAY_CALLS;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Enables the SOAP_USE_XSI_ARRAY_TYPE feature.
|
||||
*
|
||||
* @return AbstractSoapBuilder
|
||||
*/
|
||||
public function withUseXsiArrayType()
|
||||
{
|
||||
$this->soapOptions['features'] |= \SOAP_USE_XSI_ARRAY_TYPE;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function withTypeConverter(TypeConverterInterface $converter)
|
||||
{
|
||||
$this->soapOptions['typemap']->add($converter);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function withTypeConverters(TypeConverterCollection $converters, $merge = true)
|
||||
{
|
||||
if ($merge) {
|
||||
$this->soapOptions['typemap']->addCollection($converters);
|
||||
} else {
|
||||
$this->soapOptions['typemap']->set($converters->all());
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a class mapping to the classmap.
|
||||
*
|
||||
* @param string $xmlType
|
||||
* @param string $phpType
|
||||
*
|
||||
* @return AbstractSoapBuilder
|
||||
*/
|
||||
public function withClassMapping($xmlType, $phpType)
|
||||
{
|
||||
$this->soapOptions['classmap']->add($xmlType, $phpType);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the classmap.
|
||||
*
|
||||
* @param array $classmap The classmap.
|
||||
* @param boolean $merge If true the given classmap is merged into the existing one, otherwise the existing one is overwritten.
|
||||
*
|
||||
* @return AbstractSoapBuilder
|
||||
*/
|
||||
public function withClassmap(Classmap $classmap, $merge = true)
|
||||
{
|
||||
if ($merge) {
|
||||
$this->soapOptions['classmap']->addClassmap($classmap);
|
||||
} else {
|
||||
$this->soapOptions['classmap']->set($classmap->all());
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
protected function validateWsdl()
|
||||
{
|
||||
if (null === $this->wsdl) {
|
||||
throw new \InvalidArgumentException('The WSDL has to be configured!');
|
||||
}
|
||||
}
|
||||
}
|
@ -25,29 +25,24 @@ class Cache
|
||||
const TYPE_MEMORY = WSDL_CACHE_MEMORY;
|
||||
const TYPE_DISK_MEMORY = WSDL_CACHE_BOTH;
|
||||
|
||||
static protected $types = [
|
||||
protected static $types = array(
|
||||
self::TYPE_NONE,
|
||||
self::TYPE_DISK,
|
||||
self::TYPE_MEMORY,
|
||||
self::TYPE_DISK_MEMORY,
|
||||
];
|
||||
);
|
||||
|
||||
static public function getTypes()
|
||||
public static function getTypes()
|
||||
{
|
||||
return self::$types;
|
||||
}
|
||||
|
||||
static public function hasType($cacheType)
|
||||
{
|
||||
return in_array($cacheType, self::$types);
|
||||
}
|
||||
|
||||
static public function isEnabled()
|
||||
public static function isEnabled()
|
||||
{
|
||||
return self::iniGet('soap.wsdl_cache_enabled');
|
||||
}
|
||||
|
||||
static public function setEnabled($enabled)
|
||||
public static function setEnabled($enabled)
|
||||
{
|
||||
if (!in_array($enabled, array(self::ENABLED, self::DISABLED), true)) {
|
||||
throw new \InvalidArgumentException();
|
||||
@ -56,12 +51,12 @@ class Cache
|
||||
self::iniSet('soap.wsdl_cache_enabled', $enabled);
|
||||
}
|
||||
|
||||
static public function getType()
|
||||
public static function getType()
|
||||
{
|
||||
return self::iniGet('soap.wsdl_cache');
|
||||
}
|
||||
|
||||
static public function setType($type)
|
||||
public static function setType($type)
|
||||
{
|
||||
if (!in_array($type, self::getTypes(), true)) {
|
||||
throw new \InvalidArgumentException('The cache type has to be either Cache::TYPE_NONE, Cache::TYPE_DISK, Cache::TYPE_MEMORY or Cache::TYPE_DISK_MEMORY');
|
||||
@ -70,12 +65,12 @@ class Cache
|
||||
self::iniSet('soap.wsdl_cache', $type);
|
||||
}
|
||||
|
||||
static public function getDirectory()
|
||||
public static function getDirectory()
|
||||
{
|
||||
return self::iniGet('soap.wsdl_cache_dir');
|
||||
}
|
||||
|
||||
static public function setDirectory($directory)
|
||||
public static function setDirectory($directory)
|
||||
{
|
||||
if (!is_dir($directory)) {
|
||||
mkdir($directory, 0777, true);
|
||||
@ -84,33 +79,33 @@ class Cache
|
||||
self::iniSet('soap.wsdl_cache_dir', $directory);
|
||||
}
|
||||
|
||||
static public function getLifetime()
|
||||
public static function getLifetime()
|
||||
{
|
||||
return self::iniGet('soap.wsdl_cache_ttl');
|
||||
}
|
||||
|
||||
static public function setLifetime($lifetime)
|
||||
public static function setLifetime($lifetime)
|
||||
{
|
||||
self::iniSet('soap.wsdl_cache_ttl', $lifetime);
|
||||
}
|
||||
|
||||
static public function getLimit()
|
||||
public static function getLimit()
|
||||
{
|
||||
return self::iniGet('soap.wsdl_cache_limit');
|
||||
}
|
||||
|
||||
static public function setLimit($limit)
|
||||
public static function setLimit($limit)
|
||||
{
|
||||
self::iniSet('soap.wsdl_cache_limit', $limit);
|
||||
}
|
||||
|
||||
static protected function iniGet($key)
|
||||
protected static function iniGet($key)
|
||||
{
|
||||
return ini_get($key);
|
||||
}
|
||||
|
||||
static protected function iniSet($key, $value)
|
||||
protected static function iniSet($key, $value)
|
||||
{
|
||||
ini_set($key, $value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -15,29 +15,27 @@ namespace BeSimple\SoapCommon;
|
||||
/**
|
||||
* @author Francis Besset <francis.besset@gmail.com>
|
||||
*/
|
||||
class ClassMap
|
||||
class Classmap
|
||||
{
|
||||
protected $classMap;
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
protected $classmap = array();
|
||||
|
||||
public function __construct(array $classMap = [])
|
||||
{
|
||||
$this->classmap = [];
|
||||
foreach ($classMap as $type => $className) {
|
||||
$this->add($type, $className);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function getAll()
|
||||
public function all()
|
||||
{
|
||||
return $this->classMap;
|
||||
return $this->classmap;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $type
|
||||
*
|
||||
* @return string
|
||||
*
|
||||
* @throws \InvalidArgumentException
|
||||
*/
|
||||
public function get($type)
|
||||
@ -46,25 +44,39 @@ class ClassMap
|
||||
throw new \InvalidArgumentException(sprintf('The type "%s" does not exists', $type));
|
||||
}
|
||||
|
||||
return $this->classMap[$type];
|
||||
return $this->classmap[$type];
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $type
|
||||
* @param string $className
|
||||
* @param string $classname
|
||||
*
|
||||
* @throws \InvalidArgumentException
|
||||
*/
|
||||
public function add($type, $className)
|
||||
public function add($type, $classname)
|
||||
{
|
||||
if ($this->has($type)) {
|
||||
throw new \InvalidArgumentException(sprintf('The type "%s" already exists', $type));
|
||||
}
|
||||
|
||||
$this->classMap[$type] = $className;
|
||||
$this->classmap[$type] = $classname;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $classmap
|
||||
*/
|
||||
public function set(array $classmap)
|
||||
{
|
||||
$this->classmap = array();
|
||||
|
||||
foreach ($classmap as $type => $classname) {
|
||||
$this->add($type, $classname);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $type
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function has($type)
|
||||
@ -72,10 +84,10 @@ class ClassMap
|
||||
return isset($this->classmap[$type]);
|
||||
}
|
||||
|
||||
public function addClassMap(ClassMap $classMap)
|
||||
public function addClassmap(Classmap $classmap)
|
||||
{
|
||||
foreach ($classMap->getAll() as $type => $className) {
|
||||
$this->add($type, $className);
|
||||
foreach ($classmap->all() as $type => $classname) {
|
||||
$this->add($type, $classname);
|
||||
}
|
||||
}
|
||||
}
|
@ -44,4 +44,3 @@ class DateTimeTypeConverter implements TypeConverterInterface
|
||||
return sprintf('<%1$s>%2$s</%1$s>', $this->getTypeName(), $data->format('Y-m-d\TH:i:sP'));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -44,4 +44,3 @@ class DateTypeConverter implements TypeConverterInterface
|
||||
return sprintf('<%1$s>%2$s</%1$s>', $this->getTypeName(), $data->format('Y-m-d'));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -65,10 +65,8 @@ class MtomTypeConverter implements TypeConverterInterface, SoapKernelAwareInterf
|
||||
$contentId = urldecode(substr($ref, 4));
|
||||
|
||||
if (null !== ($part = $this->soapKernel->getAttachment($contentId))) {
|
||||
|
||||
return $part->getContent();
|
||||
} else {
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
@ -28,5 +28,5 @@ interface SoapKernelAwareInterface
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function setKernel(SoapKernel $soapKernel);
|
||||
}
|
||||
public function setKernel(SoapKernel $soapKernel);
|
||||
}
|
||||
|
@ -61,10 +61,8 @@ class SwaTypeConverter implements TypeConverterInterface, SoapKernelAwareInterfa
|
||||
$contentId = urldecode(substr($ref, 4));
|
||||
|
||||
if (null !== ($part = $this->soapKernel->getAttachment($contentId))) {
|
||||
|
||||
return $part->getContent();
|
||||
} else {
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
@ -19,7 +19,7 @@ class TypeConverterCollection
|
||||
{
|
||||
private $converters = array();
|
||||
|
||||
public function getAll()
|
||||
public function all()
|
||||
{
|
||||
return array_values($this->converters);
|
||||
}
|
||||
@ -58,7 +58,7 @@ class TypeConverterCollection
|
||||
|
||||
public function addCollection(TypeConverterCollection $converterCollection)
|
||||
{
|
||||
foreach ($converterCollection->getAll() as $converter) {
|
||||
foreach ($converterCollection->all() as $converter) {
|
||||
$this->add($converter);
|
||||
}
|
||||
}
|
||||
@ -74,10 +74,10 @@ class TypeConverterCollection
|
||||
$typemap[] = array(
|
||||
'type_name' => $converter->getTypeName(),
|
||||
'type_ns' => $converter->getTypeNamespace(),
|
||||
'from_xml' => function($input) use ($converter) {
|
||||
'from_xml' => function ($input) use ($converter) {
|
||||
return $converter->convertXmlToPhp($input);
|
||||
},
|
||||
'to_xml' => function($input) use ($converter) {
|
||||
'to_xml' => function ($input) use ($converter) {
|
||||
return $converter->convertPhpToXml($input);
|
||||
},
|
||||
);
|
||||
|
@ -24,14 +24,14 @@ interface TypeConverterInterface
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function getTypeNamespace();
|
||||
public function getTypeNamespace();
|
||||
|
||||
/**
|
||||
* Get type name.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function getTypeName();
|
||||
public function getTypeName();
|
||||
|
||||
/**
|
||||
* Convert given XML string to PHP type.
|
||||
@ -40,7 +40,7 @@ interface TypeConverterInterface
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
function convertXmlToPhp($data);
|
||||
public function convertXmlToPhp($data);
|
||||
|
||||
/**
|
||||
* Convert PHP type to XML string.
|
||||
@ -49,5 +49,5 @@ interface TypeConverterInterface
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function convertPhpToXml($data);
|
||||
}
|
||||
public function convertPhpToXml($data);
|
||||
}
|
||||
|
@ -25,7 +25,7 @@ class Message
|
||||
public function __construct($name)
|
||||
{
|
||||
$this->name = $name;
|
||||
$this->parts = array();
|
||||
$this->parts = [];
|
||||
}
|
||||
|
||||
public function getName()
|
||||
@ -48,13 +48,13 @@ class Message
|
||||
return 0 === count($this->parts) ? true : false;
|
||||
}
|
||||
|
||||
public function add($name, $phpType, $nillable = false)
|
||||
public function add($name, $phpType, $nillable = false, $minOccurs = 1)
|
||||
{
|
||||
if ($phpType instanceof TypeInterface) {
|
||||
$phpType = $phpType->getPhpType();
|
||||
}
|
||||
|
||||
$this->parts[$name] = new Part($name, $phpType, $nillable);
|
||||
$this->parts[$name] = new Part($name, $phpType, $nillable, $minOccurs);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
@ -12,8 +12,6 @@
|
||||
|
||||
namespace BeSimple\SoapCommon\Definition;
|
||||
|
||||
use BeSimple\SoapCommon\Definition\Type\TypeRepository;
|
||||
|
||||
/**
|
||||
* @author Francis Besset <francis.besset@gmail.com>
|
||||
*/
|
||||
@ -66,7 +64,7 @@ class Method
|
||||
$this->input->add($name, $type);
|
||||
}
|
||||
|
||||
public function setOutput($type)
|
||||
public function setOutput($type, $name = 'return')
|
||||
{
|
||||
$this->output->add('return', $type);
|
||||
}
|
||||
|
@ -20,11 +20,13 @@ class Part
|
||||
protected $name;
|
||||
protected $type;
|
||||
protected $nillable;
|
||||
protected $minOccurs;
|
||||
|
||||
public function __construct($name, $type, $nillable = false)
|
||||
public function __construct($name, $type, $nillable = false, $minOccurs = 1)
|
||||
{
|
||||
$this->name = $name;
|
||||
$this->type = $type;
|
||||
$this->minOccurs = $minOccurs;
|
||||
$this->setNillable($nillable);
|
||||
}
|
||||
|
||||
@ -50,6 +52,16 @@ class Part
|
||||
|
||||
public function setNillable($nillable)
|
||||
{
|
||||
$this->nillable = (boolean) $nillable;
|
||||
$this->nillable = (bool) $nillable;
|
||||
}
|
||||
|
||||
public function setMinOccurs($minOccurs)
|
||||
{
|
||||
$this->minOccurs = $minOccurs;
|
||||
}
|
||||
|
||||
public function getMinOccurs()
|
||||
{
|
||||
return $this->minOccurs;
|
||||
}
|
||||
}
|
||||
|
@ -175,4 +175,4 @@ class FilterHelper
|
||||
$this->namespaces[$namespaceURI] = $prefix;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -172,7 +172,8 @@ class Helper
|
||||
return sprintf(
|
||||
'%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
|
||||
// 32 bits for "time_low"
|
||||
mt_rand(0, 0xffff), mt_rand(0, 0xffff),
|
||||
mt_rand(0, 0xffff),
|
||||
mt_rand(0, 0xffff),
|
||||
// 16 bits for "time_mid"
|
||||
mt_rand(0, 0xffff),
|
||||
// 16 bits for "time_hi_and_version",
|
||||
@ -183,7 +184,9 @@ class Helper
|
||||
// two most significant bits holds zero and one for variant DCE1.1
|
||||
mt_rand(0, 0x3fff) | 0x8000,
|
||||
// 48 bits for "node"
|
||||
mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff)
|
||||
mt_rand(0, 0xffff),
|
||||
mt_rand(0, 0xffff),
|
||||
mt_rand(0, 0xffff)
|
||||
);
|
||||
}
|
||||
|
||||
@ -218,4 +221,4 @@ class Helper
|
||||
return SOAP_1_1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -172,4 +172,4 @@ class MultiPart extends PartHeader
|
||||
{
|
||||
return 'urn:uuid:' . Helper::generateUUID();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -184,4 +184,4 @@ class Parser
|
||||
}
|
||||
$part->setContent($content);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -166,4 +166,4 @@ class Part extends PartHeader
|
||||
{
|
||||
return 'urn:uuid:' . Helper::generateUUID();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -143,4 +143,4 @@ abstract class PartHeader
|
||||
return $string;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -47,7 +47,7 @@ abstract class SoapMessage
|
||||
*
|
||||
* @var array(string=>string)
|
||||
*/
|
||||
static protected $versionToContentTypeMap = array(
|
||||
protected static $versionToContentTypeMap = array(
|
||||
SOAP_1_1 => 'text/xml; charset=utf-8',
|
||||
SOAP_1_2 => 'application/soap+xml; charset=utf-8'
|
||||
);
|
||||
|
@ -1,70 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace BeSimple\SoapCommon\SoapOptions\SoapFeatures;
|
||||
|
||||
use Exception;
|
||||
|
||||
class SoapFeatures
|
||||
{
|
||||
const SINGLE_ELEMENT_ARRAYS = \SOAP_SINGLE_ELEMENT_ARRAYS;
|
||||
const WAIT_ONE_WAY_CALLS = \SOAP_WAIT_ONE_WAY_CALLS;
|
||||
const USE_XSI_ARRAY_TYPE = \SOAP_USE_XSI_ARRAY_TYPE;
|
||||
|
||||
private $featuresSum;
|
||||
private $singleElementArrays = false;
|
||||
private $oneWayCallsOn = false;
|
||||
private $useXsiArrayType = false;
|
||||
|
||||
/**
|
||||
* @param array $features array of SoapFeatures::FEATURE_NAME
|
||||
* @throws Exception
|
||||
*/
|
||||
public function __construct(array $features)
|
||||
{
|
||||
$this->resolveFeatures($features);
|
||||
}
|
||||
|
||||
public function isSingleElementArrays()
|
||||
{
|
||||
return $this->singleElementArrays;
|
||||
}
|
||||
|
||||
public function isOneWayCallsOn()
|
||||
{
|
||||
return $this->oneWayCallsOn;
|
||||
}
|
||||
|
||||
public function isUseXsiArrayType()
|
||||
{
|
||||
return $this->useXsiArrayType;
|
||||
}
|
||||
|
||||
public function getFeaturesSum()
|
||||
{
|
||||
return $this->featuresSum;
|
||||
}
|
||||
|
||||
private function resolveFeatures(array $features)
|
||||
{
|
||||
$featuresSum = 0;
|
||||
foreach ($features as $feature) {
|
||||
switch ($feature) {
|
||||
case self::SINGLE_ELEMENT_ARRAYS:
|
||||
$this->singleElementArrays = true;
|
||||
$featuresSum += $feature;
|
||||
break;
|
||||
case self::WAIT_ONE_WAY_CALLS:
|
||||
$this->oneWayCallsOn = true;
|
||||
$featuresSum += $feature;
|
||||
break;
|
||||
case self::USE_XSI_ARRAY_TYPE:
|
||||
$this->useXsiArrayType = true;
|
||||
$featuresSum += $feature;
|
||||
break;
|
||||
default:
|
||||
throw new Exception('Unknown SOAP feature: ' . $feature);
|
||||
}
|
||||
}
|
||||
$this->featuresSum = $featuresSum;
|
||||
}
|
||||
}
|
@ -1,124 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace BeSimple\SoapCommon\SoapOptions;
|
||||
|
||||
use BeSimple\SoapCommon\Cache;
|
||||
use BeSimple\SoapCommon\ClassMap;
|
||||
use BeSimple\SoapCommon\Converter\TypeConverterCollection;
|
||||
use BeSimple\SoapCommon\Helper;
|
||||
use BeSimple\SoapCommon\SoapOptions\SoapFeatures\SoapFeatures;
|
||||
|
||||
class SoapOptions
|
||||
{
|
||||
const SOAP_VERSION_1_1 = \SOAP_1_1;
|
||||
const SOAP_VERSION_1_2 = \SOAP_1_2;
|
||||
const SOAP_ENCODING_UTF8 = 'UTF-8';
|
||||
const SOAP_SINGLE_ELEMENT_ARRAYS_OFF = 0;
|
||||
const SOAP_CACHE_TYPE_NONE = Cache::TYPE_NONE;
|
||||
const SOAP_CACHE_TYPE_DISK = Cache::TYPE_DISK;
|
||||
const SOAP_CACHE_TYPE_MEMORY = Cache::TYPE_MEMORY;
|
||||
const SOAP_CACHE_TYPE_DISK_MEMORY = Cache::TYPE_DISK_MEMORY;
|
||||
const SOAP_ATTACHMENTS_OFF = null;
|
||||
const SOAP_ATTACHMENTS_TYPE_BASE64 = Helper::ATTACHMENTS_TYPE_BASE64;
|
||||
const SOAP_ATTACHMENTS_TYPE_MTOM = Helper::ATTACHMENTS_TYPE_MTOM;
|
||||
const SOAP_ATTACHMENTS_TYPE_SWA = Helper::ATTACHMENTS_TYPE_SWA;
|
||||
|
||||
protected $soapVersion;
|
||||
protected $encoding;
|
||||
protected $soapFeatures;
|
||||
protected $wsdlFile;
|
||||
protected $wsdlCacheType;
|
||||
protected $classMap;
|
||||
protected $typeConverterCollection;
|
||||
protected $attachmentType;
|
||||
|
||||
/**
|
||||
* @param int $soapVersion = SoapOptions::SOAP_VERSION_1_1|SoapOptions::SOAP_VERSION_1_2
|
||||
* @param string $encoding = SoapOptions::SOAP_ENCODING_UTF8
|
||||
* @param SoapFeatures $features
|
||||
* @param string $wsdlFile
|
||||
* @param string $wsdlCacheType = SoapOptions::SOAP_CACHE_TYPE_NONE|SoapOptions::SOAP_CACHE_TYPE_MEMORY|SoapOptions::SOAP_CACHE_TYPE_DISK|SoapOptions::SOAP_CACHE_TYPE_DISK_MEMORY
|
||||
* @param ClassMap $classMap
|
||||
* @param TypeConverterCollection $typeConverterCollection
|
||||
* @param string $attachmentType = SoapOptions::SOAP_ATTACHMENTS_OFF|SoapOptions::SOAP_ATTACHMENTS_TYPE_SWA|SoapOptions::ATTACHMENTS_TYPE_MTOM|SoapOptions::ATTACHMENTS_TYPE_BASE64
|
||||
*/
|
||||
public function __construct(
|
||||
$soapVersion,
|
||||
$encoding,
|
||||
SoapFeatures $features,
|
||||
$wsdlFile,
|
||||
$wsdlCacheType,
|
||||
ClassMap $classMap,
|
||||
TypeConverterCollection $typeConverterCollection,
|
||||
$attachmentType = null
|
||||
) {
|
||||
$this->soapVersion = $soapVersion;
|
||||
$this->encoding = $encoding;
|
||||
$this->soapFeatures = $features;
|
||||
$this->wsdlFile = $wsdlFile;
|
||||
$this->wsdlCacheType = $wsdlCacheType;
|
||||
$this->classMap = $classMap;
|
||||
$this->typeConverterCollection = $typeConverterCollection;
|
||||
$this->attachmentType = $attachmentType;
|
||||
}
|
||||
|
||||
public function getSoapVersion()
|
||||
{
|
||||
return $this->soapVersion;
|
||||
}
|
||||
|
||||
public function getEncoding()
|
||||
{
|
||||
return $this->encoding;
|
||||
}
|
||||
|
||||
public function getWsdlFile()
|
||||
{
|
||||
return $this->wsdlFile;
|
||||
}
|
||||
|
||||
public function getWsdlCacheType()
|
||||
{
|
||||
return $this->wsdlCacheType;
|
||||
}
|
||||
|
||||
public function hasAttachments()
|
||||
{
|
||||
return $this->attachmentType !== self::SOAP_ATTACHMENTS_OFF;
|
||||
}
|
||||
|
||||
public function getAttachmentType()
|
||||
{
|
||||
return $this->attachmentType;
|
||||
}
|
||||
|
||||
public function getSoapFeatures()
|
||||
{
|
||||
return $this->soapFeatures;
|
||||
}
|
||||
|
||||
public function getClassMap()
|
||||
{
|
||||
return $this->classMap;
|
||||
}
|
||||
|
||||
public function getTypeConverterCollection()
|
||||
{
|
||||
return $this->typeConverterCollection;
|
||||
}
|
||||
|
||||
public function toArray()
|
||||
{
|
||||
$optionsAsArray = [
|
||||
'soap_version' => $this->getSoapVersion(),
|
||||
'encoding' => $this->getEncoding(),
|
||||
'features' => $this->getSoapFeatures(),
|
||||
'wsdl' => $this->getWsdlFile(),
|
||||
'cache_wsdl' => $this->getWsdlCacheType(),
|
||||
'classmap' => $this->getClassMap()->getAll(),
|
||||
'typemap' => $this->getTypeConverterCollection()->getTypemap(),
|
||||
];
|
||||
|
||||
return $optionsAsArray;
|
||||
}
|
||||
}
|
@ -1,44 +0,0 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the BeSimpleSoapBundle.
|
||||
*
|
||||
* (c) Christian Kerl <christian-kerl@web.de>
|
||||
* (c) Francis Besset <francis.besset@gmail.com>
|
||||
*
|
||||
* This source file is subject to the MIT license that is bundled
|
||||
* with this source code in the file LICENSE.
|
||||
*/
|
||||
|
||||
namespace BeSimple\SoapCommon;
|
||||
|
||||
use BeSimple\SoapCommon\Converter\TypeConverterCollection;
|
||||
use BeSimple\SoapCommon\SoapOptions\SoapFeatures\SoapFeatures;
|
||||
use BeSimple\SoapCommon\SoapOptions\SoapOptions;
|
||||
use InvalidArgumentException;
|
||||
|
||||
/**
|
||||
* @author Petr Bechyně <petr.bechyne@vodafone.com>
|
||||
*/
|
||||
class SoapOptionsBuilder
|
||||
{
|
||||
static public function createWithDefaults($wsdlFile, $wsdlCacheType = Cache::TYPE_NONE)
|
||||
{
|
||||
if (!Cache::hasType($wsdlCacheType)) {
|
||||
throw new InvalidArgumentException;
|
||||
}
|
||||
$soapOptions = new SoapOptions(
|
||||
SoapOptions::SOAP_VERSION_1_2,
|
||||
SoapOptions::SOAP_ENCODING_UTF8,
|
||||
new SoapFeatures([
|
||||
SoapFeatures::SINGLE_ELEMENT_ARRAYS
|
||||
]),
|
||||
$wsdlFile,
|
||||
$wsdlCacheType,
|
||||
new ClassMap(),
|
||||
new TypeConverterCollection()
|
||||
);
|
||||
|
||||
return $soapOptions;
|
||||
}
|
||||
}
|
@ -13,6 +13,7 @@
|
||||
|
||||
namespace BeSimple\SoapCommon;
|
||||
|
||||
use BeSimple\SoapCommon\SoapMessage;
|
||||
|
||||
/**
|
||||
* SOAP request message.
|
||||
@ -21,27 +22,4 @@ namespace BeSimple\SoapCommon;
|
||||
*/
|
||||
class SoapRequest extends SoapMessage
|
||||
{
|
||||
/**
|
||||
* Factory function for SoapRequest.
|
||||
*
|
||||
* @param string $content Content
|
||||
* @param string $location Location
|
||||
* @param string $action SOAP action
|
||||
* @param string $version SOAP version
|
||||
*
|
||||
* @return SoapRequest
|
||||
*/
|
||||
public static function create($content, $location, $action, $version)
|
||||
{
|
||||
$request = new SoapRequest();
|
||||
// $content is if unmodified from SoapClient not a php string type!
|
||||
$request->setContent((string) $content);
|
||||
$request->setLocation($location);
|
||||
$request->setAction($action);
|
||||
$request->setVersion($version);
|
||||
$contentType = SoapMessage::getContentTypeForVersion($version);
|
||||
$request->setContentType($contentType);
|
||||
|
||||
return $request;
|
||||
}
|
||||
}
|
||||
|
@ -28,4 +28,4 @@ interface SoapRequestFilter
|
||||
* @param SoapRequest $request SOAP request
|
||||
*/
|
||||
public function filterRequest(SoapRequest $request);
|
||||
}
|
||||
}
|
||||
|
@ -22,5 +22,4 @@ use BeSimple\SoapCommon\SoapMessage;
|
||||
*/
|
||||
class SoapResponse extends SoapMessage
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -28,4 +28,4 @@ interface SoapResponseFilter
|
||||
* @param SoapResponse $response SOAP response
|
||||
*/
|
||||
public function filterResponse(SoapResponse $response);
|
||||
}
|
||||
}
|
||||
|
@ -177,7 +177,7 @@ class AbstractSoapBuilderTest extends \PHPUnit_Framework_TestCase
|
||||
|
||||
$this->assertEquals(1, count($options['classmap']));
|
||||
|
||||
$classmap = new ClassMap();
|
||||
$classmap = new Classmap();
|
||||
$classmap->add('bar', __CLASS__);
|
||||
$builder->withClassmap($classmap);
|
||||
$options = $builder->getSoapOptions();
|
||||
|
@ -1,65 +0,0 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the BeSimpleSoapCommon.
|
||||
*
|
||||
* (c) Christian Kerl <christian-kerl@web.de>
|
||||
* (c) Francis Besset <francis.besset@gmail.com>
|
||||
*
|
||||
* This source file is subject to the MIT license that is bundled
|
||||
* with this source code in the file LICENSE.
|
||||
*/
|
||||
|
||||
namespace BeSimple\SoapCommon\Tests;
|
||||
|
||||
use BeSimple\SoapCommon\ClassMap;
|
||||
|
||||
/**
|
||||
* UnitTest for \BeSimple\SoapCommon\ClassMap.
|
||||
*
|
||||
* @author Francis Besset <francis.besset@gmail.com>
|
||||
*/
|
||||
class ClassMapTest extends \PHPUnit_Framework_TestCase
|
||||
{
|
||||
public function testAll()
|
||||
{
|
||||
$classmap = new ClassMap();
|
||||
|
||||
$this->assertSame(array(), $classmap->getAll());
|
||||
}
|
||||
|
||||
public function testAdd()
|
||||
{
|
||||
$classmap = new ClassMap();
|
||||
|
||||
$classmap->add('foobar', 'BeSimple\SoapCommon\ClassMap');
|
||||
|
||||
$this->setExpectedException('InvalidArgumentException');
|
||||
$classmap->add('foobar', 'BeSimple\SoapCommon\ClassMap');
|
||||
}
|
||||
|
||||
public function testGet()
|
||||
{
|
||||
$classmap = new ClassMap();
|
||||
|
||||
$classmap->add('foobar', 'BeSimple\SoapCommon\ClassMap');
|
||||
$this->assertSame('BeSimple\SoapCommon\ClassMap', $classmap->get('foobar'));
|
||||
|
||||
$this->setExpectedException('InvalidArgumentException');
|
||||
$classmap->get('bar');
|
||||
}
|
||||
|
||||
public function testAddClassMap()
|
||||
{
|
||||
$classmap1 = new ClassMap();
|
||||
$classmap2 = new ClassMap();
|
||||
|
||||
$classmap2->add('foobar', 'BeSimple\SoapCommon\ClassMap');
|
||||
$classmap1->addClassMap($classmap2);
|
||||
|
||||
$this->assertEquals(array('foobar' => 'BeSimple\SoapCommon\ClassMap'), $classmap1->getAll());
|
||||
|
||||
$this->setExpectedException('InvalidArgumentException');
|
||||
$classmap1->addClassMap($classmap2);
|
||||
}
|
||||
}
|
81
src/BeSimple/SoapCommon/Tests/ClassmapTest.php
Normal file
81
src/BeSimple/SoapCommon/Tests/ClassmapTest.php
Normal file
@ -0,0 +1,81 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the BeSimpleSoapCommon.
|
||||
*
|
||||
* (c) Christian Kerl <christian-kerl@web.de>
|
||||
* (c) Francis Besset <francis.besset@gmail.com>
|
||||
*
|
||||
* This source file is subject to the MIT license that is bundled
|
||||
* with this source code in the file LICENSE.
|
||||
*/
|
||||
|
||||
namespace BeSimple\SoapCommon\Tests;
|
||||
|
||||
use BeSimple\SoapCommon\Classmap;
|
||||
|
||||
/**
|
||||
* UnitTest for \BeSimple\SoapCommon\Classmap.
|
||||
*
|
||||
* @author Francis Besset <francis.besset@gmail.com>
|
||||
*/
|
||||
class ClassmapTest extends \PHPUnit_Framework_TestCase
|
||||
{
|
||||
public function testAll()
|
||||
{
|
||||
$classmap = new Classmap();
|
||||
|
||||
$this->assertSame(array(), $classmap->all());
|
||||
}
|
||||
|
||||
public function testAdd()
|
||||
{
|
||||
$classmap = new Classmap();
|
||||
|
||||
$classmap->add('foobar', 'BeSimple\SoapCommon\Classmap');
|
||||
|
||||
$this->setExpectedException('InvalidArgumentException');
|
||||
$classmap->add('foobar', 'BeSimple\SoapCommon\Classmap');
|
||||
}
|
||||
|
||||
public function testGet()
|
||||
{
|
||||
$classmap = new Classmap();
|
||||
|
||||
$classmap->add('foobar', 'BeSimple\SoapCommon\Classmap');
|
||||
$this->assertSame('BeSimple\SoapCommon\Classmap', $classmap->get('foobar'));
|
||||
|
||||
$this->setExpectedException('InvalidArgumentException');
|
||||
$classmap->get('bar');
|
||||
}
|
||||
|
||||
public function testSet()
|
||||
{
|
||||
$classmap = new Classmap();
|
||||
|
||||
$classmap->add('foobar', 'BeSimple\SoapCommon\Tests\ClassmapTest');
|
||||
$classmap->add('foo', 'BeSimple\SoapCommon\Tests\Classmap');
|
||||
|
||||
$map = array(
|
||||
'foobar' => 'BeSimple\SoapCommon\Classmap',
|
||||
'barfoo' => 'BeSimple\SoapCommon\Tests\ClassmapTest',
|
||||
);
|
||||
$classmap->set($map);
|
||||
|
||||
$this->assertSame($map, $classmap->all());
|
||||
}
|
||||
|
||||
public function testAddClassmap()
|
||||
{
|
||||
$classmap1 = new Classmap();
|
||||
$classmap2 = new Classmap();
|
||||
|
||||
$classmap2->add('foobar', 'BeSimple\SoapCommon\Classmap');
|
||||
$classmap1->addClassmap($classmap2);
|
||||
|
||||
$this->assertEquals(array('foobar' => 'BeSimple\SoapCommon\Classmap'), $classmap1->all());
|
||||
|
||||
$this->setExpectedException('InvalidArgumentException');
|
||||
$classmap1->addClassmap($classmap2);
|
||||
}
|
||||
}
|
@ -51,4 +51,3 @@ class DateTimeTypeConverterTest extends \PHPUnit_Framework_TestCase
|
||||
$this->assertNull($date);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -49,4 +49,3 @@ class DateTypeConverterTest extends \PHPUnit_Framework_TestCase
|
||||
$this->assertNull($date);
|
||||
}
|
||||
}
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user