Compare commits
117 Commits
Author | SHA1 | Date | |
---|---|---|---|
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 | |||
4d7894b66e | |||
0a157748a8 | |||
c4a9b58b08 | |||
fc15bf36ab | |||
8462233a08 | |||
03227295f6 | |||
f285adfa14 | |||
2ecdbe9714 | |||
e5c54164c1 | |||
27ebf0fbce | |||
855e382590 | |||
2974a4f838 | |||
fb56d51bd8 | |||
f2a8a7ebb3 | |||
7a9119cef1 | |||
1a7f60b679 | |||
70db0c42fd | |||
960c9f557a | |||
33d641de4e | |||
bbd4c26134 | |||
29170576c2 | |||
50ab5a93ad | |||
1290573285 | |||
f5675f6ece | |||
15b208d861 | |||
294a9fe90e | |||
313840d5a4 | |||
8e4d8b0300 | |||
621b2080e0 | |||
fe67cff5ff | |||
e676eb0432 | |||
fd402731af | |||
f5d6f5e759 | |||
726ee89936 | |||
36a368e695 | |||
e2de214ea5 | |||
3cfeea8371 | |||
c24e8775bf | |||
b3c6353af8 | |||
10bba6a3bd | |||
a122f2a0f6 | |||
8d13d2dd5c | |||
1c1cd377f1 | |||
1efa348ae5 | |||
ccc4d57501 | |||
740f146bad | |||
5e8e669299 | |||
e4cb612aed | |||
59ea6b1ce0 | |||
7bb849e394 | |||
02722eae8f | |||
b7581f29b0 | |||
dc6e1e0889 | |||
f986400dc2 | |||
67410805ba | |||
2ae7515294 | |||
cdfc3cd5bd | |||
9ac755d86e | |||
321dcf3058 | |||
f9e230400d |
2
.gitignore
vendored
2
.gitignore
vendored
@ -1,3 +1,3 @@
|
|||||||
/vendor/
|
/vendor/
|
||||||
composer.lock
|
|
||||||
phpunit.xml
|
phpunit.xml
|
||||||
|
.idea/
|
||||||
|
25
.travis.yml
25
.travis.yml
@ -1,25 +1,14 @@
|
|||||||
language: php
|
language: php
|
||||||
|
|
||||||
php:
|
php:
|
||||||
- 5.3
|
- 7.0
|
||||||
- 5.4
|
- 7.1
|
||||||
- 5.5
|
|
||||||
|
|
||||||
env:
|
|
||||||
- SYMFONY_VERSION=2.0.*
|
|
||||||
- SYMFONY_VERSION=2.1.*
|
|
||||||
- SYMFONY_VERSION=2.2.*
|
|
||||||
- SYMFONY_VERSION=2.3.*
|
|
||||||
- SYMFONY_VERSION=dev-master
|
|
||||||
|
|
||||||
before_script:
|
before_script:
|
||||||
- composer require symfony/http-foundation:${SYMFONY_VERSION} --no-interaction --prefer-source
|
- composer self-update
|
||||||
- ./src/BeSimple/SoapClient/Tests/bin/phpwebserver.sh
|
- composer install
|
||||||
- ./src/BeSimple/SoapClient/Tests/bin/axis.sh
|
- cp phpunit.xml.dist phpunit.xml
|
||||||
|
- php -S localhost:8000 > /dev/null 2>&1 &
|
||||||
|
|
||||||
script:
|
script:
|
||||||
- phpunit --coverage-text
|
- vendor/phing/phing/bin/phing -f build.xml
|
||||||
|
|
||||||
matrix:
|
|
||||||
allow_failures:
|
|
||||||
- env: SYMFONY_VERSION=dev-master
|
|
||||||
|
135
README.md
135
README.md
@ -1,35 +1,38 @@
|
|||||||
# BeSimpleSoap
|
# BeSimpleSoap
|
||||||
|
|
||||||
Build SOAP and WSDL based web services
|
Build SOAP and WSDL based web services.
|
||||||
|
This fork is a refactored version that fixes a lot of errors and provides
|
||||||
|
better API, robust, stable and modern codebase.
|
||||||
|
See [How to use](#how-to-use) that will help you to understand the magic.
|
||||||
|
|
||||||
# Components
|
# Components
|
||||||
|
|
||||||
BeSimpleSoap consists of five 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
|
## BeSimpleSoapClient
|
||||||
|
|
||||||
The BeSimpleSoapClient is a component that extends the native PHP SoapClient with further features like SwA, MTOM and WS-Security.
|
**Refactored** BeSimpleSoapClient is a component that extends the native PHP SoapClient with further features like SwA 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).
|
|
||||||
|
|
||||||
|
|
||||||
## BeSimpleSoapServer
|
## BeSimpleSoapServer
|
||||||
|
|
||||||
The BeSimpleSoapServer is a component that extends the native PHP SoapServer with further features like SwA, MTOM and WS-Security.
|
**Refactored** BeSimpleSoapServer is a component that extends the native PHP SoapServer with further features like SwA and WS-Security.
|
||||||
For further information see the [README](https://github.com/BeSimple/BeSimpleSoap/blob/master/src/BeSimple/SoapServer/README.md).
|
|
||||||
|
## BeSimpleSoapCommon
|
||||||
|
|
||||||
|
**Refactored** BeSimpleSoapCommon component contains functionality shared by both the server and client implementations.
|
||||||
|
|
||||||
## BeSimpleSoapWsdl
|
## 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).
|
||||||
|
|
||||||
|
## BeSimpleSoapBundle
|
||||||
|
|
||||||
|
**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!*
|
||||||
|
|
||||||
# Installation
|
# Installation
|
||||||
|
|
||||||
@ -44,7 +47,7 @@ Create a `composer.json` file:
|
|||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"require": {
|
"require": {
|
||||||
"besimple/soap": "0.2.*@dev"
|
"tuscanicz/soap": "^4.2"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@ -54,3 +57,99 @@ Now you are ready to install the library:
|
|||||||
```sh
|
```sh
|
||||||
php /usr/local/bin/composer.phar install
|
php /usr/local/bin/composer.phar install
|
||||||
```
|
```
|
||||||
|
|
||||||
|
# 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
|
||||||
|
```
|
||||||
|
|
||||||
|
### Something wrong?!
|
||||||
|
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:
|
||||||
|
|
||||||
|
```
|
||||||
|
/**
|
||||||
|
* @param DummyServiceRequest $dummyServiceRequest
|
||||||
|
* @return DummyServiceResponse
|
||||||
|
*/
|
||||||
|
public function dummyServiceMethod(DummyServiceRequest $dummyServiceRequest)
|
||||||
|
{
|
||||||
|
$response = new DummyServiceResponse();
|
||||||
|
$response->status = true;
|
||||||
|
|
||||||
|
return $response;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
For further information and getting inspiration for your implementation, see the unit tests in ``tests`` dir.
|
||||||
|
|
||||||
|
# Contribute
|
||||||
|
|
||||||
|
[](https://travis-ci.org/tuscanicz/BeSimpleSoap)
|
||||||
|
|
||||||
|
Feel free to contribute! Please, run the tests via Phing ``php phing -f build.xml``.
|
||||||
|
|
||||||
|
**Warning:** Unit tests may fail under Windows OS, tested under Linux, MacOS.
|
||||||
|
54
build.xml
Normal file
54
build.xml
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
<project name="be-simple-soap" default="build">
|
||||||
|
|
||||||
|
<property environment="env"/>
|
||||||
|
|
||||||
|
<fileset id="src" dir="${project.basedir}/src">
|
||||||
|
<include name="**/*.php"/>
|
||||||
|
<exclude name="BeSimple/SoapBundle/**/*.php"/>
|
||||||
|
<exclude name="BeSimple/SoapCommon/Type/**/*.php"/>
|
||||||
|
</fileset>
|
||||||
|
|
||||||
|
<fileset id="tests" dir="${project.basedir}/tests">
|
||||||
|
<include name="**/*.php"/>
|
||||||
|
</fileset>
|
||||||
|
|
||||||
|
<target name="cleanup" description="Workspace cleanup">
|
||||||
|
<delete>
|
||||||
|
<fileset dir="${project.basedir}/cache">
|
||||||
|
<include name="**/*"/>
|
||||||
|
<exclude name=".gitkeep"/>
|
||||||
|
</fileset>
|
||||||
|
</delete>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<target name="prepare" depends="cleanup" description="Workspace preparation">
|
||||||
|
<echo>project.basedir: ${project.basedir}</echo>
|
||||||
|
<property name="buildOutputPath" value="${project.basedir}/cache"/>
|
||||||
|
<echo>buildOutputPath: ${buildOutputPath}</echo>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<target name="lint" depends="prepare" description="PHP Lint check">
|
||||||
|
<phplint haltonfailure="true" level="debug" deprecatedAsError="true" tofile="${buildOutputPath}/phplint-outfile.txt">
|
||||||
|
<fileset refid="src"/>
|
||||||
|
</phplint>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<target name="varDump" depends="prepare" description="Check for forgotten var_dumps">
|
||||||
|
<exec command="${project.basedir}/vendor/bin/var-dump-check --exclude app --exclude vendor ." passthru="true" checkreturn="true"/>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<target name="phpcs" depends="prepare" description="PHP_CodeSniffer checks">
|
||||||
|
<exec command="php vendor/squizlabs/php_codesniffer/bin/phpcs --ignore=BeSimple/SoapBundle/,BeSimple/SoapCommon/Type/ --standard=${project.basedir}/codesniffer-ruleset.xml --report=checkstyle --report-file=${buildOutputPath}/phpcs-checkstyle-outfile.xml src tests" passthru="true" checkreturn="true"/>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<target name="phpstan" depends="prepare" description="phpstan checks">
|
||||||
|
<exec command="php vendor/bin/phpstan analyse src/BeSimple/SoapClient src/BeSimple/SoapServer > cache/phpstan-output.txt" passthru="true" checkreturn="true"/>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<target name="phpUnitTests" description="Run unit tests">
|
||||||
|
<exec command="php vendor/phpunit/phpunit/phpunit --configuration=phpunit.xml --testsuite=BeSimpleSoapTestSuite" passthru="true" checkreturn="true"/>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<target name="build" depends="prepare, varDump, lint, phpcs, phpstan, phpUnitTests" description="Meta target"/>
|
||||||
|
|
||||||
|
</project>
|
2
cache/.gitignore
vendored
Normal file
2
cache/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
*
|
||||||
|
!.gitignore
|
52
codesniffer-ruleset.xml
Normal file
52
codesniffer-ruleset.xml
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<ruleset name="WSCBE">
|
||||||
|
<description>Coding standards</description>
|
||||||
|
|
||||||
|
<rule ref="Generic.Classes">
|
||||||
|
<exclude name="Generic.Classes.OpeningBraceSameLine.BraceOnNewLine"/>
|
||||||
|
</rule>
|
||||||
|
<rule ref="Generic.WhiteSpace.DisallowTabIndent"/>
|
||||||
|
<rule ref="Generic.Files">
|
||||||
|
<properties>
|
||||||
|
<property name="eolChar" value="\n"/>
|
||||||
|
<property name="lineLimit" value="200"/>
|
||||||
|
<property name="absoluteLineLimit" value="220"/>
|
||||||
|
</properties>
|
||||||
|
<exclude name="Generic.Files.LowercasedFilename.NotFound"/>
|
||||||
|
<exclude name="Generic.Files.EndFileNoNewline.Found"/>
|
||||||
|
</rule>
|
||||||
|
<rule ref="Generic.PHP">
|
||||||
|
<exclude name="Generic.PHP.UpperCaseConstant.Found"/>
|
||||||
|
<exclude name="Generic.PHP.ClosingPHPTag.NotFound"/>
|
||||||
|
<exclude name="Generic.PHP.NoSilencedErrors.Discouraged"/> <!-- unfortunately, the only way to make native SoapClient work correctly -->
|
||||||
|
</rule>
|
||||||
|
<rule ref="Generic.NamingConventions"/>
|
||||||
|
<rule ref="Generic.Functions">
|
||||||
|
<exclude name="Generic.Functions.OpeningFunctionBraceKernighanRitchie.BraceOnNewLine"/>
|
||||||
|
<exclude name="Generic.Functions.OpeningFunctionBraceBsdAllman.BraceOnSameLine"/>
|
||||||
|
</rule>
|
||||||
|
|
||||||
|
<rule ref="PSR1.Classes"/>
|
||||||
|
<rule ref="PSR1.Files"/>
|
||||||
|
<rule ref="PSR1.Methods"/>
|
||||||
|
|
||||||
|
<rule ref="PSR2.Classes"/>
|
||||||
|
<rule ref="PSR2.ControlStructures"/>
|
||||||
|
<rule ref="PSR2.Files"/>
|
||||||
|
<rule ref="PSR2.Methods"/>
|
||||||
|
<rule ref="PSR2.Namespaces"/>
|
||||||
|
|
||||||
|
<rule ref="Squiz.Classes">
|
||||||
|
<exclude name="Squiz.Classes.ClassDeclaration.EndFileAfterCloseBrace"/>
|
||||||
|
</rule>
|
||||||
|
<rule ref="Squiz.Functions">
|
||||||
|
<exclude name="Squiz.Functions.FunctionDeclarationArgumentSpacing.SpaceAfterDefault"/>
|
||||||
|
<exclude name="Squiz.Functions.FunctionDeclarationArgumentSpacing.SpaceBeforeEquals"/>
|
||||||
|
</rule>
|
||||||
|
<!--<rule ref="Squiz.PHP"/>-->
|
||||||
|
<rule ref="Squiz.Objects">
|
||||||
|
<exclude name="Squiz.Objects.ObjectInstantiation.NotAssigned"/>
|
||||||
|
</rule>
|
||||||
|
<rule ref="Squiz.Scope"/>
|
||||||
|
|
||||||
|
</ruleset>
|
@ -1,9 +1,8 @@
|
|||||||
{
|
{
|
||||||
"name": "besimple/soap",
|
"name": "tuscanicz/soap",
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"description": "Build and consume SOAP and WSDL based web services",
|
"description": "A largely refactored besimple/soap used to build SOAP and WSDL based web services. This fork fixes a lot of errors and provides better API, robust, stable and modern codebase.",
|
||||||
"keywords": ["soap"],
|
"keywords": ["soap", "soap server", "soap client"],
|
||||||
"homepage": "http://besim.pl",
|
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"authors": [
|
"authors": [
|
||||||
{
|
{
|
||||||
@ -17,15 +16,17 @@
|
|||||||
{
|
{
|
||||||
"name": "Andreas Schamberger",
|
"name": "Andreas Schamberger",
|
||||||
"email": "mail@andreass.net"
|
"email": "mail@andreass.net"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Petr Bechyně",
|
||||||
|
"email": "mail@petrbechyne.com"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"require": {
|
"require": {
|
||||||
"php": ">=5.3.0",
|
"php": ">=5.3.0|>=7.0",
|
||||||
"ext-soap": "*",
|
"ext-soap": "*",
|
||||||
"ext-curl": "*",
|
"ext-curl": "*",
|
||||||
"ass/xmlsecurity": "~1.0",
|
"ass/xmlsecurity": "~1.0",
|
||||||
"symfony/framework-bundle": "~2.0",
|
|
||||||
"symfony/twig-bundle": "~2.0",
|
|
||||||
"zendframework/zend-mime": "2.1.*"
|
"zendframework/zend-mime": "2.1.*"
|
||||||
},
|
},
|
||||||
"replace": {
|
"replace": {
|
||||||
@ -37,17 +38,30 @@
|
|||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"ext-mcrypt": "*",
|
"ext-mcrypt": "*",
|
||||||
"mikey179/vfsStream": "dev-master",
|
"mikey179/vfsStream": "~1.0",
|
||||||
"symfony/filesystem": "~2.3",
|
"phpunit/phpunit": "~4.0",
|
||||||
"symfony/process": "~2.3"
|
"phpstan/phpstan": "dev-master",
|
||||||
|
"phing/phing": "^2.16",
|
||||||
|
"jakub-onderka/php-var-dump-check": "^0.2.0",
|
||||||
|
"squizlabs/php_codesniffer": "^3.0"
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"psr-0": { "BeSimple\\": "src/" }
|
"psr-0": { "BeSimple\\": "src/" }
|
||||||
},
|
},
|
||||||
"minimum-stability": "dev",
|
"autoload-dev": {
|
||||||
|
"psr-4": {
|
||||||
|
"": "tests/"
|
||||||
|
}
|
||||||
|
},
|
||||||
"extra": {
|
"extra": {
|
||||||
"branch-alias": {
|
"branch-alias": {
|
||||||
"dev-master": "0.2-dev"
|
"dev-master": "0.4-dev"
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
"repositories": [
|
||||||
|
{
|
||||||
|
"type": "vcs",
|
||||||
|
"url": "https://github.com/tuscanicz/phpstan.git"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
2427
composer.lock
generated
Normal file
2427
composer.lock
generated
Normal file
@ -0,0 +1,2427 @@
|
|||||||
|
{
|
||||||
|
"_readme": [
|
||||||
|
"This file locks the dependencies of your project to a known state",
|
||||||
|
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
|
||||||
|
"This file is @generated automatically"
|
||||||
|
],
|
||||||
|
"hash": "635c398afa1d5c217b5b8679b348ddc7",
|
||||||
|
"content-hash": "08f419455dd969e9145b8adfc84a03e9",
|
||||||
|
"packages": [
|
||||||
|
{
|
||||||
|
"name": "ass/xmlsecurity",
|
||||||
|
"version": "v1.1.1",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/aschamberger/XmlSecurity.git",
|
||||||
|
"reference": "c8976519ebbf6e4d953cd781d09df44b7f65fbb8"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/aschamberger/XmlSecurity/zipball/c8976519ebbf6e4d953cd781d09df44b7f65fbb8",
|
||||||
|
"reference": "c8976519ebbf6e4d953cd781d09df44b7f65fbb8",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"ext-openssl": "*",
|
||||||
|
"lib-openssl": ">=0.9.0",
|
||||||
|
"php": ">=5.3.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"satooshi/php-coveralls": "dev-master"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"ext-mcrypt": "*"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "1.0.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-0": {
|
||||||
|
"ass\\XmlSecurity": "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"BSD-3-Clause"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Robert Richards",
|
||||||
|
"email": "rrichards@cdatazone.org"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Andreas Schamberger",
|
||||||
|
"email": "mail@andreass.net"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "The XmlSecurity library is written in PHP for working with XML Encryption and Signatures",
|
||||||
|
"homepage": "https://github.com/aschamberger/XmlSecurity",
|
||||||
|
"keywords": [
|
||||||
|
"encryption",
|
||||||
|
"security",
|
||||||
|
"signature",
|
||||||
|
"xml"
|
||||||
|
],
|
||||||
|
"time": "2015-05-31 10:10:35"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "zendframework/zend-mime",
|
||||||
|
"version": "2.1.6",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/zendframework/zend-mime.git",
|
||||||
|
"reference": "066d6eecff586a7fb10e8907c032beaf1a9d6104"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/zendframework/zend-mime/zipball/066d6eecff586a7fb10e8907c032beaf1a9d6104",
|
||||||
|
"reference": "066d6eecff586a7fb10e8907c032beaf1a9d6104",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.3",
|
||||||
|
"zendframework/zend-stdlib": "self.version"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"fabpot/php-cs-fixer": "1.7.*",
|
||||||
|
"phpunit/phpunit": "~4.0",
|
||||||
|
"satooshi/php-coveralls": "dev-master",
|
||||||
|
"zendframework/zend-mail": "self.version"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"zendframework/zend-mail": "Zend\\Mail component"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "2.1-dev",
|
||||||
|
"dev-develop": "2.2-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Zend\\Mime\\": "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"BSD-3-Clause"
|
||||||
|
],
|
||||||
|
"homepage": "https://github.com/zendframework/zend-mime",
|
||||||
|
"keywords": [
|
||||||
|
"mime",
|
||||||
|
"zf2"
|
||||||
|
],
|
||||||
|
"time": "2013-04-17 13:32:54"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "zendframework/zend-stdlib",
|
||||||
|
"version": "2.1.6",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/zendframework/zend-stdlib.git",
|
||||||
|
"reference": "0027339961ad3d49f91ee092e23f7269c18cb470"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/zendframework/zend-stdlib/zipball/0027339961ad3d49f91ee092e23f7269c18cb470",
|
||||||
|
"reference": "0027339961ad3d49f91ee092e23f7269c18cb470",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.3"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"fabpot/php-cs-fixer": "1.7.*",
|
||||||
|
"phpunit/phpunit": "~4.0",
|
||||||
|
"satooshi/php-coveralls": "dev-master",
|
||||||
|
"zendframework/zend-eventmanager": "self.version",
|
||||||
|
"zendframework/zend-filter": "self.version",
|
||||||
|
"zendframework/zend-serializer": "self.version",
|
||||||
|
"zendframework/zend-servicemanager": "self.version"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"pecl-weakref": "Implementation of weak references for Stdlib\\CallbackHandler",
|
||||||
|
"zendframework/zend-eventmanager": "To support aggregate hydrator usage",
|
||||||
|
"zendframework/zend-filter": "To support naming strategy hydrator usage",
|
||||||
|
"zendframework/zend-serializer": "Zend\\Serializer component",
|
||||||
|
"zendframework/zend-servicemanager": "To support hydrator plugin manager usage"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "2.1-dev",
|
||||||
|
"dev-develop": "2.2-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Zend\\Stdlib\\": "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"BSD-3-Clause"
|
||||||
|
],
|
||||||
|
"homepage": "https://github.com/zendframework/zend-stdlib",
|
||||||
|
"keywords": [
|
||||||
|
"stdlib",
|
||||||
|
"zf2"
|
||||||
|
],
|
||||||
|
"time": "2013-04-17 13:32:54"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"packages-dev": [
|
||||||
|
{
|
||||||
|
"name": "doctrine/instantiator",
|
||||||
|
"version": "1.0.5",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/doctrine/instantiator.git",
|
||||||
|
"reference": "8e884e78f9f0eb1329e445619e04456e64d8051d"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d",
|
||||||
|
"reference": "8e884e78f9f0eb1329e445619e04456e64d8051d",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3,<8.0-DEV"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"athletic/athletic": "~0.1.8",
|
||||||
|
"ext-pdo": "*",
|
||||||
|
"ext-phar": "*",
|
||||||
|
"phpunit/phpunit": "~4.0",
|
||||||
|
"squizlabs/php_codesniffer": "~2.0"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "1.0.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Marco Pivetta",
|
||||||
|
"email": "ocramius@gmail.com",
|
||||||
|
"homepage": "http://ocramius.github.com/"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
|
||||||
|
"homepage": "https://github.com/doctrine/instantiator",
|
||||||
|
"keywords": [
|
||||||
|
"constructor",
|
||||||
|
"instantiate"
|
||||||
|
],
|
||||||
|
"time": "2015-06-14 21:17:01"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "jakub-onderka/php-var-dump-check",
|
||||||
|
"version": "v0.2",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/JakubOnderka/PHP-Var-Dump-Check.git",
|
||||||
|
"reference": "c00c52f1503c537a3da394520717a7331eb290a1"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/JakubOnderka/PHP-Var-Dump-Check/zipball/c00c52f1503c537a3da394520717a7331eb290a1",
|
||||||
|
"reference": "c00c52f1503c537a3da394520717a7331eb290a1",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.3"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"jakub-onderka/php-parallel-lint": "~0.8",
|
||||||
|
"phpunit/phpunit": "~4.5"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"jakub-onderka/php-console-highlighter": "For colored console output"
|
||||||
|
},
|
||||||
|
"bin": [
|
||||||
|
"var-dump-check"
|
||||||
|
],
|
||||||
|
"type": "library",
|
||||||
|
"autoload": {
|
||||||
|
"psr-0": {
|
||||||
|
"JakubOnderka\\PhpVarDumpCheck": "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"BSD-2-Clause"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Jakub Onderka",
|
||||||
|
"email": "jakub.onderka@gmail.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Find forgotten variables dump in PHP source code.",
|
||||||
|
"time": "2015-03-13 12:02:23"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mikey179/vfsStream",
|
||||||
|
"version": "v1.6.4",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/mikey179/vfsStream.git",
|
||||||
|
"reference": "0247f57b2245e8ad2e689d7cee754b45fbabd592"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/mikey179/vfsStream/zipball/0247f57b2245e8ad2e689d7cee754b45fbabd592",
|
||||||
|
"reference": "0247f57b2245e8ad2e689d7cee754b45fbabd592",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "~4.5"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "1.6.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-0": {
|
||||||
|
"org\\bovigo\\vfs\\": "src/main/php"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"BSD-3-Clause"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Frank Kleine",
|
||||||
|
"homepage": "http://frankkleine.de/",
|
||||||
|
"role": "Developer"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Virtual file system to mock the real file system in unit tests.",
|
||||||
|
"homepage": "http://vfs.bovigo.org/",
|
||||||
|
"time": "2016-07-18 14:02:57"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "nette/bootstrap",
|
||||||
|
"version": "v2.4.3",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/nette/bootstrap.git",
|
||||||
|
"reference": "2c27747f5aff2e436ebf542e0ea566bea1db2d53"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/nette/bootstrap/zipball/2c27747f5aff2e436ebf542e0ea566bea1db2d53",
|
||||||
|
"reference": "2c27747f5aff2e436ebf542e0ea566bea1db2d53",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"nette/di": "~2.4.7",
|
||||||
|
"nette/utils": "~2.4",
|
||||||
|
"php": ">=5.6.0"
|
||||||
|
},
|
||||||
|
"conflict": {
|
||||||
|
"nette/nette": "<2.2"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"latte/latte": "~2.2",
|
||||||
|
"nette/application": "~2.3",
|
||||||
|
"nette/caching": "~2.3",
|
||||||
|
"nette/database": "~2.3",
|
||||||
|
"nette/forms": "~2.3",
|
||||||
|
"nette/http": "~2.4.0",
|
||||||
|
"nette/mail": "~2.3",
|
||||||
|
"nette/robot-loader": "^2.4.2 || ^3.0",
|
||||||
|
"nette/safe-stream": "~2.2",
|
||||||
|
"nette/security": "~2.3",
|
||||||
|
"nette/tester": "~2.0",
|
||||||
|
"tracy/tracy": "^2.4.1"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"nette/robot-loader": "to use Configurator::createRobotLoader()",
|
||||||
|
"tracy/tracy": "to use Configurator::enableTracy()"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "2.4-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"classmap": [
|
||||||
|
"src/"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"BSD-3-Clause",
|
||||||
|
"GPL-2.0",
|
||||||
|
"GPL-3.0"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "David Grudl",
|
||||||
|
"homepage": "https://davidgrudl.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Nette Community",
|
||||||
|
"homepage": "https://nette.org/contributors"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Nette Bootstrap",
|
||||||
|
"homepage": "https://nette.org",
|
||||||
|
"time": "2017-02-19 22:15:02"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "nette/caching",
|
||||||
|
"version": "v2.5.3",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/nette/caching.git",
|
||||||
|
"reference": "2436e530484a346d0a246733519ceaa40b943bd6"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/nette/caching/zipball/2436e530484a346d0a246733519ceaa40b943bd6",
|
||||||
|
"reference": "2436e530484a346d0a246733519ceaa40b943bd6",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"nette/finder": "^2.2 || ~3.0.0",
|
||||||
|
"nette/utils": "^2.4 || ~3.0.0",
|
||||||
|
"php": ">=5.6.0"
|
||||||
|
},
|
||||||
|
"conflict": {
|
||||||
|
"nette/nette": "<2.2"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"latte/latte": "^2.4",
|
||||||
|
"nette/di": "^2.4 || ~3.0.0",
|
||||||
|
"nette/tester": "^2.0",
|
||||||
|
"tracy/tracy": "^2.4"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"ext-pdo_sqlite": "to use SQLiteStorage or SQLiteJournal"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "2.5-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"classmap": [
|
||||||
|
"src/"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"BSD-3-Clause",
|
||||||
|
"GPL-2.0",
|
||||||
|
"GPL-3.0"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "David Grudl",
|
||||||
|
"homepage": "https://davidgrudl.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Nette Community",
|
||||||
|
"homepage": "https://nette.org/contributors"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Nette Caching Component",
|
||||||
|
"homepage": "https://nette.org",
|
||||||
|
"time": "2017-01-29 20:40:55"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "nette/di",
|
||||||
|
"version": "v2.4.8",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/nette/di.git",
|
||||||
|
"reference": "b3fe8551162279216e251e49b406e55cd2d255d5"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/nette/di/zipball/b3fe8551162279216e251e49b406e55cd2d255d5",
|
||||||
|
"reference": "b3fe8551162279216e251e49b406e55cd2d255d5",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"ext-tokenizer": "*",
|
||||||
|
"nette/neon": "^2.3.3 || ~3.0.0",
|
||||||
|
"nette/php-generator": "^2.6.1 || ~3.0.0",
|
||||||
|
"nette/utils": "^2.4.3 || ~3.0.0",
|
||||||
|
"php": ">=5.6.0"
|
||||||
|
},
|
||||||
|
"conflict": {
|
||||||
|
"nette/bootstrap": "<2.4",
|
||||||
|
"nette/nette": "<2.2"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"nette/tester": "^2.0",
|
||||||
|
"tracy/tracy": "^2.3"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "2.4-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"classmap": [
|
||||||
|
"src/"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"BSD-3-Clause",
|
||||||
|
"GPL-2.0",
|
||||||
|
"GPL-3.0"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "David Grudl",
|
||||||
|
"homepage": "https://davidgrudl.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Nette Community",
|
||||||
|
"homepage": "https://nette.org/contributors"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Nette Dependency Injection Component",
|
||||||
|
"homepage": "https://nette.org",
|
||||||
|
"time": "2017-03-14 17:16:14"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "nette/finder",
|
||||||
|
"version": "v2.4.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/nette/finder.git",
|
||||||
|
"reference": "5cabd5fe89f9903715359a403b820c7f94f9bb5e"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/nette/finder/zipball/5cabd5fe89f9903715359a403b820c7f94f9bb5e",
|
||||||
|
"reference": "5cabd5fe89f9903715359a403b820c7f94f9bb5e",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"nette/utils": "~2.4",
|
||||||
|
"php": ">=5.6.0"
|
||||||
|
},
|
||||||
|
"conflict": {
|
||||||
|
"nette/nette": "<2.2"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"nette/tester": "~2.0",
|
||||||
|
"tracy/tracy": "^2.3"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "2.4-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"classmap": [
|
||||||
|
"src/"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"BSD-3-Clause",
|
||||||
|
"GPL-2.0",
|
||||||
|
"GPL-3.0"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "David Grudl",
|
||||||
|
"homepage": "https://davidgrudl.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Nette Community",
|
||||||
|
"homepage": "https://nette.org/contributors"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Nette Finder: Files Searching",
|
||||||
|
"homepage": "https://nette.org",
|
||||||
|
"time": "2016-05-17 15:49:06"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "nette/neon",
|
||||||
|
"version": "v2.4.1",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/nette/neon.git",
|
||||||
|
"reference": "1a78ff64b1e161ebccc03bdf9366450a69365f5b"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/nette/neon/zipball/1a78ff64b1e161ebccc03bdf9366450a69365f5b",
|
||||||
|
"reference": "1a78ff64b1e161ebccc03bdf9366450a69365f5b",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"ext-iconv": "*",
|
||||||
|
"ext-json": "*",
|
||||||
|
"php": ">=5.6.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"nette/tester": "~2.0",
|
||||||
|
"tracy/tracy": "^2.3"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "2.4-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"classmap": [
|
||||||
|
"src/"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"BSD-3-Clause",
|
||||||
|
"GPL-2.0",
|
||||||
|
"GPL-3.0"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "David Grudl",
|
||||||
|
"homepage": "https://davidgrudl.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Nette Community",
|
||||||
|
"homepage": "https://nette.org/contributors"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Nette NEON: parser & generator for Nette Object Notation",
|
||||||
|
"homepage": "http://ne-on.org",
|
||||||
|
"time": "2017-01-13 08:00:19"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "nette/php-generator",
|
||||||
|
"version": "v3.0.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/nette/php-generator.git",
|
||||||
|
"reference": "8605fd18857a4beef4aa0afc19eb9a7f876237e8"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/nette/php-generator/zipball/8605fd18857a4beef4aa0afc19eb9a7f876237e8",
|
||||||
|
"reference": "8605fd18857a4beef4aa0afc19eb9a7f876237e8",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"nette/utils": "^2.4.2 || ~3.0.0",
|
||||||
|
"php": ">=7.0"
|
||||||
|
},
|
||||||
|
"conflict": {
|
||||||
|
"nette/nette": "<2.2"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"nette/tester": "^2.0",
|
||||||
|
"tracy/tracy": "^2.3"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "3.0-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"classmap": [
|
||||||
|
"src/"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"BSD-3-Clause",
|
||||||
|
"GPL-2.0",
|
||||||
|
"GPL-3.0"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "David Grudl",
|
||||||
|
"homepage": "https://davidgrudl.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Nette Community",
|
||||||
|
"homepage": "https://nette.org/contributors"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "🐘 Generates neat PHP code for you. Supports new PHP 7.1 features.",
|
||||||
|
"homepage": "https://nette.org",
|
||||||
|
"keywords": [
|
||||||
|
"code",
|
||||||
|
"nette",
|
||||||
|
"php",
|
||||||
|
"scaffolding"
|
||||||
|
],
|
||||||
|
"time": "2017-03-18 15:20:10"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "nette/robot-loader",
|
||||||
|
"version": "v3.0.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/nette/robot-loader.git",
|
||||||
|
"reference": "459fc6bf08f0fd7f6889897e3acdff523dbf1159"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/nette/robot-loader/zipball/459fc6bf08f0fd7f6889897e3acdff523dbf1159",
|
||||||
|
"reference": "459fc6bf08f0fd7f6889897e3acdff523dbf1159",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"ext-tokenizer": "*",
|
||||||
|
"nette/finder": "^2.3 || ^3.0",
|
||||||
|
"nette/utils": "^2.4 || ^3.0",
|
||||||
|
"php": ">=5.6.0"
|
||||||
|
},
|
||||||
|
"conflict": {
|
||||||
|
"nette/nette": "<2.2"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"nette/tester": "^2.0",
|
||||||
|
"tracy/tracy": "^2.3"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "3.0-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"classmap": [
|
||||||
|
"src/"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"BSD-3-Clause",
|
||||||
|
"GPL-2.0",
|
||||||
|
"GPL-3.0"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "David Grudl",
|
||||||
|
"homepage": "https://davidgrudl.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Nette Community",
|
||||||
|
"homepage": "https://nette.org/contributors"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "🍀 RobotLoader: high performance and comfortable autoloader that will search and autoload classes within your application.",
|
||||||
|
"homepage": "https://nette.org",
|
||||||
|
"keywords": [
|
||||||
|
"autoload",
|
||||||
|
"class",
|
||||||
|
"interface",
|
||||||
|
"nette",
|
||||||
|
"trait"
|
||||||
|
],
|
||||||
|
"time": "2017-02-10 13:44:22"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "nette/utils",
|
||||||
|
"version": "v2.4.6",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/nette/utils.git",
|
||||||
|
"reference": "266160aec0d99516e0ea510de1dfa24a0dc1e76e"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/nette/utils/zipball/266160aec0d99516e0ea510de1dfa24a0dc1e76e",
|
||||||
|
"reference": "266160aec0d99516e0ea510de1dfa24a0dc1e76e",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.6.0"
|
||||||
|
},
|
||||||
|
"conflict": {
|
||||||
|
"nette/nette": "<2.2"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"nette/tester": "~2.0",
|
||||||
|
"tracy/tracy": "^2.3"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"ext-gd": "to use Image",
|
||||||
|
"ext-iconv": "to use Strings::webalize() and toAscii()",
|
||||||
|
"ext-intl": "for script transliteration in Strings::webalize() and toAscii()",
|
||||||
|
"ext-json": "to use Nette\\Utils\\Json",
|
||||||
|
"ext-mbstring": "to use Strings::lower() etc...",
|
||||||
|
"ext-xml": "to use Strings::length() etc. when mbstring is not available"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "2.4-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"classmap": [
|
||||||
|
"src/"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"BSD-3-Clause",
|
||||||
|
"GPL-2.0",
|
||||||
|
"GPL-3.0"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "David Grudl",
|
||||||
|
"homepage": "https://davidgrudl.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Nette Community",
|
||||||
|
"homepage": "https://nette.org/contributors"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Nette Utility Classes",
|
||||||
|
"homepage": "https://nette.org",
|
||||||
|
"time": "2017-04-26 10:04:49"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "nikic/php-parser",
|
||||||
|
"version": "v3.0.5",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/nikic/PHP-Parser.git",
|
||||||
|
"reference": "2b9e2f71b722f7c53918ab0c25f7646c2013f17d"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/2b9e2f71b722f7c53918ab0c25f7646c2013f17d",
|
||||||
|
"reference": "2b9e2f71b722f7c53918ab0c25f7646c2013f17d",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"ext-tokenizer": "*",
|
||||||
|
"php": ">=5.5"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "~4.0|~5.0"
|
||||||
|
},
|
||||||
|
"bin": [
|
||||||
|
"bin/php-parse"
|
||||||
|
],
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "3.0-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"PhpParser\\": "lib/PhpParser"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"BSD-3-Clause"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Nikita Popov"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "A PHP parser written in PHP",
|
||||||
|
"keywords": [
|
||||||
|
"parser",
|
||||||
|
"php"
|
||||||
|
],
|
||||||
|
"time": "2017-03-05 18:23:57"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "phing/phing",
|
||||||
|
"version": "2.16.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/phingofficial/phing.git",
|
||||||
|
"reference": "151a0f4d8cebf7711eccc62dde3f09bc36a00d7b"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/phingofficial/phing/zipball/151a0f4d8cebf7711eccc62dde3f09bc36a00d7b",
|
||||||
|
"reference": "151a0f4d8cebf7711eccc62dde3f09bc36a00d7b",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.2.0",
|
||||||
|
"symfony/yaml": "^3.1"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"ext-pdo_sqlite": "*",
|
||||||
|
"mikey179/vfsstream": "^1.6",
|
||||||
|
"pdepend/pdepend": "2.x",
|
||||||
|
"pear/archive_tar": "1.4.x",
|
||||||
|
"pear/http_request2": "dev-trunk",
|
||||||
|
"pear/net_growl": "dev-trunk",
|
||||||
|
"pear/pear-core-minimal": "1.10.1",
|
||||||
|
"pear/versioncontrol_git": "@dev",
|
||||||
|
"pear/versioncontrol_svn": "~0.5",
|
||||||
|
"phpdocumentor/phpdocumentor": "2.x",
|
||||||
|
"phploc/phploc": "~2.0.6",
|
||||||
|
"phpmd/phpmd": "~2.2",
|
||||||
|
"phpunit/phpunit": ">=3.7",
|
||||||
|
"sebastian/git": "~1.0",
|
||||||
|
"sebastian/phpcpd": "2.x",
|
||||||
|
"siad007/versioncontrol_hg": "^1.0",
|
||||||
|
"simpletest/simpletest": "^1.1",
|
||||||
|
"squizlabs/php_codesniffer": "~2.2"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"pdepend/pdepend": "PHP version of JDepend",
|
||||||
|
"pear/archive_tar": "Tar file management class",
|
||||||
|
"pear/versioncontrol_git": "A library that provides OO interface to handle Git repository",
|
||||||
|
"pear/versioncontrol_svn": "A simple OO-style interface for Subversion, the free/open-source version control system",
|
||||||
|
"phpdocumentor/phpdocumentor": "Documentation Generator for PHP",
|
||||||
|
"phploc/phploc": "A tool for quickly measuring the size of a PHP project",
|
||||||
|
"phpmd/phpmd": "PHP version of PMD tool",
|
||||||
|
"phpunit/php-code-coverage": "Library that provides collection, processing, and rendering functionality for PHP code coverage information",
|
||||||
|
"phpunit/phpunit": "The PHP Unit Testing Framework",
|
||||||
|
"sebastian/phpcpd": "Copy/Paste Detector (CPD) for PHP code",
|
||||||
|
"siad007/versioncontrol_hg": "A library for interfacing with Mercurial repositories.",
|
||||||
|
"tedivm/jshrink": "Javascript Minifier built in PHP"
|
||||||
|
},
|
||||||
|
"bin": [
|
||||||
|
"bin/phing"
|
||||||
|
],
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "2.16.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"classmap": [
|
||||||
|
"classes/phing/"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"include-path": [
|
||||||
|
"classes"
|
||||||
|
],
|
||||||
|
"license": [
|
||||||
|
"LGPL-3.0"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Michiel Rook",
|
||||||
|
"email": "mrook@php.net"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Phing Community",
|
||||||
|
"homepage": "https://www.phing.info/trac/wiki/Development/Contributors"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "PHing Is Not GNU make; it's a PHP project build system or build tool based on Apache Ant.",
|
||||||
|
"homepage": "https://www.phing.info/",
|
||||||
|
"keywords": [
|
||||||
|
"build",
|
||||||
|
"phing",
|
||||||
|
"task",
|
||||||
|
"tool"
|
||||||
|
],
|
||||||
|
"time": "2016-12-22 20:16:33"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "phpdocumentor/reflection-common",
|
||||||
|
"version": "1.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/phpDocumentor/ReflectionCommon.git",
|
||||||
|
"reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/144c307535e82c8fdcaacbcfc1d6d8eeb896687c",
|
||||||
|
"reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.5"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "^4.6"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "1.0.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"phpDocumentor\\Reflection\\": [
|
||||||
|
"src"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Jaap van Otterdijk",
|
||||||
|
"email": "opensource@ijaap.nl"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Common reflection classes used by phpdocumentor to reflect the code structure",
|
||||||
|
"homepage": "http://www.phpdoc.org",
|
||||||
|
"keywords": [
|
||||||
|
"FQSEN",
|
||||||
|
"phpDocumentor",
|
||||||
|
"phpdoc",
|
||||||
|
"reflection",
|
||||||
|
"static analysis"
|
||||||
|
],
|
||||||
|
"time": "2015-12-27 11:43:31"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "phpdocumentor/reflection-docblock",
|
||||||
|
"version": "3.1.1",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
|
||||||
|
"reference": "8331b5efe816ae05461b7ca1e721c01b46bafb3e"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/8331b5efe816ae05461b7ca1e721c01b46bafb3e",
|
||||||
|
"reference": "8331b5efe816ae05461b7ca1e721c01b46bafb3e",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.5",
|
||||||
|
"phpdocumentor/reflection-common": "^1.0@dev",
|
||||||
|
"phpdocumentor/type-resolver": "^0.2.0",
|
||||||
|
"webmozart/assert": "^1.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"mockery/mockery": "^0.9.4",
|
||||||
|
"phpunit/phpunit": "^4.4"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"phpDocumentor\\Reflection\\": [
|
||||||
|
"src/"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Mike van Riel",
|
||||||
|
"email": "me@mikevanriel.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
|
||||||
|
"time": "2016-09-30 07:12:33"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "phpdocumentor/type-resolver",
|
||||||
|
"version": "0.2.1",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/phpDocumentor/TypeResolver.git",
|
||||||
|
"reference": "e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb",
|
||||||
|
"reference": "e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.5",
|
||||||
|
"phpdocumentor/reflection-common": "^1.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"mockery/mockery": "^0.9.4",
|
||||||
|
"phpunit/phpunit": "^5.2||^4.8.24"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "1.0.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"phpDocumentor\\Reflection\\": [
|
||||||
|
"src/"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Mike van Riel",
|
||||||
|
"email": "me@mikevanriel.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"time": "2016-11-25 06:54:22"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "phpspec/prophecy",
|
||||||
|
"version": "v1.6.2",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/phpspec/prophecy.git",
|
||||||
|
"reference": "6c52c2722f8460122f96f86346600e1077ce22cb"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/phpspec/prophecy/zipball/6c52c2722f8460122f96f86346600e1077ce22cb",
|
||||||
|
"reference": "6c52c2722f8460122f96f86346600e1077ce22cb",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"doctrine/instantiator": "^1.0.2",
|
||||||
|
"php": "^5.3|^7.0",
|
||||||
|
"phpdocumentor/reflection-docblock": "^2.0|^3.0.2",
|
||||||
|
"sebastian/comparator": "^1.1",
|
||||||
|
"sebastian/recursion-context": "^1.0|^2.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpspec/phpspec": "^2.0",
|
||||||
|
"phpunit/phpunit": "^4.8 || ^5.6.5"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "1.6.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-0": {
|
||||||
|
"Prophecy\\": "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Konstantin Kudryashov",
|
||||||
|
"email": "ever.zet@gmail.com",
|
||||||
|
"homepage": "http://everzet.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Marcello Duarte",
|
||||||
|
"email": "marcello.duarte@gmail.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Highly opinionated mocking framework for PHP 5.3+",
|
||||||
|
"homepage": "https://github.com/phpspec/prophecy",
|
||||||
|
"keywords": [
|
||||||
|
"Double",
|
||||||
|
"Dummy",
|
||||||
|
"fake",
|
||||||
|
"mock",
|
||||||
|
"spy",
|
||||||
|
"stub"
|
||||||
|
],
|
||||||
|
"time": "2016-11-21 14:58:47"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "phpstan/phpstan",
|
||||||
|
"version": "dev-master",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/tuscanicz/phpstan.git",
|
||||||
|
"reference": "11d705360de768c8f0f9431288228ecd85ac14dd"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/tuscanicz/phpstan/zipball/11d705360de768c8f0f9431288228ecd85ac14dd",
|
||||||
|
"reference": "11d705360de768c8f0f9431288228ecd85ac14dd",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"nette/bootstrap": "^2.4 || ^3.0",
|
||||||
|
"nette/caching": "^2.4 || ^3.0",
|
||||||
|
"nette/di": "^2.4 || ^3.0",
|
||||||
|
"nette/robot-loader": "^2.4.2 || ^3.0",
|
||||||
|
"nette/utils": "^2.4 || ^3.0",
|
||||||
|
"nikic/php-parser": "^2.1 || ^3.0.2",
|
||||||
|
"php": "~7.0",
|
||||||
|
"symfony/console": "~2.7 || ~3.0",
|
||||||
|
"symfony/finder": "~2.7 || ~3.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"consistence/coding-standard": "~0.13.0",
|
||||||
|
"jakub-onderka/php-parallel-lint": "^0.9.2",
|
||||||
|
"phing/phing": "^2.16.0",
|
||||||
|
"phpunit/phpunit": "^6.0.7",
|
||||||
|
"satooshi/php-coveralls": "^1.0",
|
||||||
|
"slevomat/coding-standard": "^2.0"
|
||||||
|
},
|
||||||
|
"bin": [
|
||||||
|
"bin/phpstan"
|
||||||
|
],
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "0.7-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"PHPStan\\": "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload-dev": {
|
||||||
|
"classmap": [
|
||||||
|
"tests/PHPStan",
|
||||||
|
"tests/TestCase.php"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"description": "PHPStan - PHP Static Analysis Tool",
|
||||||
|
"support": {
|
||||||
|
"source": "https://github.com/tuscanicz/phpstan/tree/master"
|
||||||
|
},
|
||||||
|
"time": "2017-06-07 13:05:16"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "phpunit/php-code-coverage",
|
||||||
|
"version": "2.2.4",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/sebastianbergmann/php-code-coverage.git",
|
||||||
|
"reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/eabf68b476ac7d0f73793aada060f1c1a9bf8979",
|
||||||
|
"reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.3",
|
||||||
|
"phpunit/php-file-iterator": "~1.3",
|
||||||
|
"phpunit/php-text-template": "~1.2",
|
||||||
|
"phpunit/php-token-stream": "~1.3",
|
||||||
|
"sebastian/environment": "^1.3.2",
|
||||||
|
"sebastian/version": "~1.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"ext-xdebug": ">=2.1.4",
|
||||||
|
"phpunit/phpunit": "~4"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"ext-dom": "*",
|
||||||
|
"ext-xdebug": ">=2.2.1",
|
||||||
|
"ext-xmlwriter": "*"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "2.2.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"classmap": [
|
||||||
|
"src/"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"BSD-3-Clause"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Sebastian Bergmann",
|
||||||
|
"email": "sb@sebastian-bergmann.de",
|
||||||
|
"role": "lead"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
|
||||||
|
"homepage": "https://github.com/sebastianbergmann/php-code-coverage",
|
||||||
|
"keywords": [
|
||||||
|
"coverage",
|
||||||
|
"testing",
|
||||||
|
"xunit"
|
||||||
|
],
|
||||||
|
"time": "2015-10-06 15:47:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "phpunit/php-file-iterator",
|
||||||
|
"version": "1.4.2",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/sebastianbergmann/php-file-iterator.git",
|
||||||
|
"reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/3cc8f69b3028d0f96a9078e6295d86e9bf019be5",
|
||||||
|
"reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.3"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "1.4.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"classmap": [
|
||||||
|
"src/"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"BSD-3-Clause"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Sebastian Bergmann",
|
||||||
|
"email": "sb@sebastian-bergmann.de",
|
||||||
|
"role": "lead"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "FilterIterator implementation that filters files based on a list of suffixes.",
|
||||||
|
"homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
|
||||||
|
"keywords": [
|
||||||
|
"filesystem",
|
||||||
|
"iterator"
|
||||||
|
],
|
||||||
|
"time": "2016-10-03 07:40:28"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "phpunit/php-text-template",
|
||||||
|
"version": "1.2.1",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/sebastianbergmann/php-text-template.git",
|
||||||
|
"reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
|
||||||
|
"reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.3"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"autoload": {
|
||||||
|
"classmap": [
|
||||||
|
"src/"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"BSD-3-Clause"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Sebastian Bergmann",
|
||||||
|
"email": "sebastian@phpunit.de",
|
||||||
|
"role": "lead"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Simple template engine.",
|
||||||
|
"homepage": "https://github.com/sebastianbergmann/php-text-template/",
|
||||||
|
"keywords": [
|
||||||
|
"template"
|
||||||
|
],
|
||||||
|
"time": "2015-06-21 13:50:34"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "phpunit/php-timer",
|
||||||
|
"version": "1.0.8",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/sebastianbergmann/php-timer.git",
|
||||||
|
"reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/38e9124049cf1a164f1e4537caf19c99bf1eb260",
|
||||||
|
"reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.3"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "~4|~5"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"autoload": {
|
||||||
|
"classmap": [
|
||||||
|
"src/"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"BSD-3-Clause"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Sebastian Bergmann",
|
||||||
|
"email": "sb@sebastian-bergmann.de",
|
||||||
|
"role": "lead"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Utility class for timing",
|
||||||
|
"homepage": "https://github.com/sebastianbergmann/php-timer/",
|
||||||
|
"keywords": [
|
||||||
|
"timer"
|
||||||
|
],
|
||||||
|
"time": "2016-05-12 18:03:57"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "phpunit/php-token-stream",
|
||||||
|
"version": "1.4.9",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/sebastianbergmann/php-token-stream.git",
|
||||||
|
"reference": "3b402f65a4cc90abf6e1104e388b896ce209631b"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/3b402f65a4cc90abf6e1104e388b896ce209631b",
|
||||||
|
"reference": "3b402f65a4cc90abf6e1104e388b896ce209631b",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"ext-tokenizer": "*",
|
||||||
|
"php": ">=5.3.3"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "~4.2"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "1.4-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"classmap": [
|
||||||
|
"src/"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"BSD-3-Clause"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Sebastian Bergmann",
|
||||||
|
"email": "sebastian@phpunit.de"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Wrapper around PHP's tokenizer extension.",
|
||||||
|
"homepage": "https://github.com/sebastianbergmann/php-token-stream/",
|
||||||
|
"keywords": [
|
||||||
|
"tokenizer"
|
||||||
|
],
|
||||||
|
"time": "2016-11-15 14:06:22"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "phpunit/phpunit",
|
||||||
|
"version": "4.8.34",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/sebastianbergmann/phpunit.git",
|
||||||
|
"reference": "7eb45205d27edd94bd2b3614085ea158bd1e2bca"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/7eb45205d27edd94bd2b3614085ea158bd1e2bca",
|
||||||
|
"reference": "7eb45205d27edd94bd2b3614085ea158bd1e2bca",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"ext-dom": "*",
|
||||||
|
"ext-json": "*",
|
||||||
|
"ext-pcre": "*",
|
||||||
|
"ext-reflection": "*",
|
||||||
|
"ext-spl": "*",
|
||||||
|
"php": ">=5.3.3",
|
||||||
|
"phpspec/prophecy": "^1.3.1",
|
||||||
|
"phpunit/php-code-coverage": "~2.1",
|
||||||
|
"phpunit/php-file-iterator": "~1.4",
|
||||||
|
"phpunit/php-text-template": "~1.2",
|
||||||
|
"phpunit/php-timer": "^1.0.6",
|
||||||
|
"phpunit/phpunit-mock-objects": "~2.3",
|
||||||
|
"sebastian/comparator": "~1.2.2",
|
||||||
|
"sebastian/diff": "~1.2",
|
||||||
|
"sebastian/environment": "~1.3",
|
||||||
|
"sebastian/exporter": "~1.2",
|
||||||
|
"sebastian/global-state": "~1.0",
|
||||||
|
"sebastian/version": "~1.0",
|
||||||
|
"symfony/yaml": "~2.1|~3.0"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"phpunit/php-invoker": "~1.1"
|
||||||
|
},
|
||||||
|
"bin": [
|
||||||
|
"phpunit"
|
||||||
|
],
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "4.8.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"classmap": [
|
||||||
|
"src/"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"BSD-3-Clause"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Sebastian Bergmann",
|
||||||
|
"email": "sebastian@phpunit.de",
|
||||||
|
"role": "lead"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "The PHP Unit Testing framework.",
|
||||||
|
"homepage": "https://phpunit.de/",
|
||||||
|
"keywords": [
|
||||||
|
"phpunit",
|
||||||
|
"testing",
|
||||||
|
"xunit"
|
||||||
|
],
|
||||||
|
"time": "2017-01-26 16:15:36"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "phpunit/phpunit-mock-objects",
|
||||||
|
"version": "2.3.8",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
|
||||||
|
"reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/ac8e7a3db35738d56ee9a76e78a4e03d97628983",
|
||||||
|
"reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"doctrine/instantiator": "^1.0.2",
|
||||||
|
"php": ">=5.3.3",
|
||||||
|
"phpunit/php-text-template": "~1.2",
|
||||||
|
"sebastian/exporter": "~1.2"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "~4.4"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"ext-soap": "*"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "2.3.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"classmap": [
|
||||||
|
"src/"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"BSD-3-Clause"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Sebastian Bergmann",
|
||||||
|
"email": "sb@sebastian-bergmann.de",
|
||||||
|
"role": "lead"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Mock Object library for PHPUnit",
|
||||||
|
"homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/",
|
||||||
|
"keywords": [
|
||||||
|
"mock",
|
||||||
|
"xunit"
|
||||||
|
],
|
||||||
|
"time": "2015-10-02 06:51:40"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "psr/log",
|
||||||
|
"version": "1.0.2",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/php-fig/log.git",
|
||||||
|
"reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
|
||||||
|
"reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.0"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "1.0.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Psr\\Log\\": "Psr/Log/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "PHP-FIG",
|
||||||
|
"homepage": "http://www.php-fig.org/"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Common interface for logging libraries",
|
||||||
|
"homepage": "https://github.com/php-fig/log",
|
||||||
|
"keywords": [
|
||||||
|
"log",
|
||||||
|
"psr",
|
||||||
|
"psr-3"
|
||||||
|
],
|
||||||
|
"time": "2016-10-10 12:19:37"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "sebastian/comparator",
|
||||||
|
"version": "1.2.4",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/sebastianbergmann/comparator.git",
|
||||||
|
"reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2b7424b55f5047b47ac6e5ccb20b2aea4011d9be",
|
||||||
|
"reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.3",
|
||||||
|
"sebastian/diff": "~1.2",
|
||||||
|
"sebastian/exporter": "~1.2 || ~2.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "~4.4"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "1.2.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"classmap": [
|
||||||
|
"src/"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"BSD-3-Clause"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Jeff Welch",
|
||||||
|
"email": "whatthejeff@gmail.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Volker Dusch",
|
||||||
|
"email": "github@wallbash.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Bernhard Schussek",
|
||||||
|
"email": "bschussek@2bepublished.at"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Sebastian Bergmann",
|
||||||
|
"email": "sebastian@phpunit.de"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Provides the functionality to compare PHP values for equality",
|
||||||
|
"homepage": "http://www.github.com/sebastianbergmann/comparator",
|
||||||
|
"keywords": [
|
||||||
|
"comparator",
|
||||||
|
"compare",
|
||||||
|
"equality"
|
||||||
|
],
|
||||||
|
"time": "2017-01-29 09:50:25"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "sebastian/diff",
|
||||||
|
"version": "1.4.1",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/sebastianbergmann/diff.git",
|
||||||
|
"reference": "13edfd8706462032c2f52b4b862974dd46b71c9e"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/13edfd8706462032c2f52b4b862974dd46b71c9e",
|
||||||
|
"reference": "13edfd8706462032c2f52b4b862974dd46b71c9e",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.3"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "~4.8"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "1.4-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"classmap": [
|
||||||
|
"src/"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"BSD-3-Clause"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Kore Nordmann",
|
||||||
|
"email": "mail@kore-nordmann.de"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Sebastian Bergmann",
|
||||||
|
"email": "sebastian@phpunit.de"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Diff implementation",
|
||||||
|
"homepage": "https://github.com/sebastianbergmann/diff",
|
||||||
|
"keywords": [
|
||||||
|
"diff"
|
||||||
|
],
|
||||||
|
"time": "2015-12-08 07:14:41"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "sebastian/environment",
|
||||||
|
"version": "1.3.8",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/sebastianbergmann/environment.git",
|
||||||
|
"reference": "be2c607e43ce4c89ecd60e75c6a85c126e754aea"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/be2c607e43ce4c89ecd60e75c6a85c126e754aea",
|
||||||
|
"reference": "be2c607e43ce4c89ecd60e75c6a85c126e754aea",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": "^5.3.3 || ^7.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "^4.8 || ^5.0"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "1.3.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"classmap": [
|
||||||
|
"src/"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"BSD-3-Clause"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Sebastian Bergmann",
|
||||||
|
"email": "sebastian@phpunit.de"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Provides functionality to handle HHVM/PHP environments",
|
||||||
|
"homepage": "http://www.github.com/sebastianbergmann/environment",
|
||||||
|
"keywords": [
|
||||||
|
"Xdebug",
|
||||||
|
"environment",
|
||||||
|
"hhvm"
|
||||||
|
],
|
||||||
|
"time": "2016-08-18 05:49:44"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "sebastian/exporter",
|
||||||
|
"version": "1.2.2",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/sebastianbergmann/exporter.git",
|
||||||
|
"reference": "42c4c2eec485ee3e159ec9884f95b431287edde4"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/42c4c2eec485ee3e159ec9884f95b431287edde4",
|
||||||
|
"reference": "42c4c2eec485ee3e159ec9884f95b431287edde4",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.3",
|
||||||
|
"sebastian/recursion-context": "~1.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"ext-mbstring": "*",
|
||||||
|
"phpunit/phpunit": "~4.4"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "1.3.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"classmap": [
|
||||||
|
"src/"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"BSD-3-Clause"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Jeff Welch",
|
||||||
|
"email": "whatthejeff@gmail.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Volker Dusch",
|
||||||
|
"email": "github@wallbash.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Bernhard Schussek",
|
||||||
|
"email": "bschussek@2bepublished.at"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Sebastian Bergmann",
|
||||||
|
"email": "sebastian@phpunit.de"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Adam Harvey",
|
||||||
|
"email": "aharvey@php.net"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Provides the functionality to export PHP variables for visualization",
|
||||||
|
"homepage": "http://www.github.com/sebastianbergmann/exporter",
|
||||||
|
"keywords": [
|
||||||
|
"export",
|
||||||
|
"exporter"
|
||||||
|
],
|
||||||
|
"time": "2016-06-17 09:04:28"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "sebastian/global-state",
|
||||||
|
"version": "1.1.1",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/sebastianbergmann/global-state.git",
|
||||||
|
"reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4",
|
||||||
|
"reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.3"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "~4.2"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"ext-uopz": "*"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "1.0-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"classmap": [
|
||||||
|
"src/"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"BSD-3-Clause"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Sebastian Bergmann",
|
||||||
|
"email": "sebastian@phpunit.de"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Snapshotting of global state",
|
||||||
|
"homepage": "http://www.github.com/sebastianbergmann/global-state",
|
||||||
|
"keywords": [
|
||||||
|
"global state"
|
||||||
|
],
|
||||||
|
"time": "2015-10-12 03:26:01"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "sebastian/recursion-context",
|
||||||
|
"version": "1.0.2",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/sebastianbergmann/recursion-context.git",
|
||||||
|
"reference": "913401df809e99e4f47b27cdd781f4a258d58791"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/913401df809e99e4f47b27cdd781f4a258d58791",
|
||||||
|
"reference": "913401df809e99e4f47b27cdd781f4a258d58791",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.3"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "~4.4"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "1.0.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"classmap": [
|
||||||
|
"src/"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"BSD-3-Clause"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Jeff Welch",
|
||||||
|
"email": "whatthejeff@gmail.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Sebastian Bergmann",
|
||||||
|
"email": "sebastian@phpunit.de"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Adam Harvey",
|
||||||
|
"email": "aharvey@php.net"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Provides functionality to recursively process PHP variables",
|
||||||
|
"homepage": "http://www.github.com/sebastianbergmann/recursion-context",
|
||||||
|
"time": "2015-11-11 19:50:13"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "sebastian/version",
|
||||||
|
"version": "1.0.6",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/sebastianbergmann/version.git",
|
||||||
|
"reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6",
|
||||||
|
"reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"autoload": {
|
||||||
|
"classmap": [
|
||||||
|
"src/"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"BSD-3-Clause"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Sebastian Bergmann",
|
||||||
|
"email": "sebastian@phpunit.de",
|
||||||
|
"role": "lead"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Library that helps with managing the version number of Git-hosted PHP projects",
|
||||||
|
"homepage": "https://github.com/sebastianbergmann/version",
|
||||||
|
"time": "2015-06-21 13:59:46"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "squizlabs/php_codesniffer",
|
||||||
|
"version": "3.0.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/squizlabs/PHP_CodeSniffer.git",
|
||||||
|
"reference": "b95ff2c3b122a3ee4b57d149a57d2afce65522c3"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/b95ff2c3b122a3ee4b57d149a57d2afce65522c3",
|
||||||
|
"reference": "b95ff2c3b122a3ee4b57d149a57d2afce65522c3",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"ext-simplexml": "*",
|
||||||
|
"ext-tokenizer": "*",
|
||||||
|
"ext-xmlwriter": "*",
|
||||||
|
"php": ">=5.4.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "~4.0"
|
||||||
|
},
|
||||||
|
"bin": [
|
||||||
|
"bin/phpcs",
|
||||||
|
"bin/phpcbf"
|
||||||
|
],
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "3.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"BSD-3-Clause"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Greg Sherwood",
|
||||||
|
"role": "lead"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.",
|
||||||
|
"homepage": "http://www.squizlabs.com/php-codesniffer",
|
||||||
|
"keywords": [
|
||||||
|
"phpcs",
|
||||||
|
"standards"
|
||||||
|
],
|
||||||
|
"time": "2017-05-04 00:33:04"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "symfony/console",
|
||||||
|
"version": "v3.3.2",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/symfony/console.git",
|
||||||
|
"reference": "70d2a29b2911cbdc91a7e268046c395278238b2e"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/symfony/console/zipball/70d2a29b2911cbdc91a7e268046c395278238b2e",
|
||||||
|
"reference": "70d2a29b2911cbdc91a7e268046c395278238b2e",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.5.9",
|
||||||
|
"symfony/debug": "~2.8|~3.0",
|
||||||
|
"symfony/polyfill-mbstring": "~1.0"
|
||||||
|
},
|
||||||
|
"conflict": {
|
||||||
|
"symfony/dependency-injection": "<3.3"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"psr/log": "~1.0",
|
||||||
|
"symfony/config": "~3.3",
|
||||||
|
"symfony/dependency-injection": "~3.3",
|
||||||
|
"symfony/event-dispatcher": "~2.8|~3.0",
|
||||||
|
"symfony/filesystem": "~2.8|~3.0",
|
||||||
|
"symfony/http-kernel": "~2.8|~3.0",
|
||||||
|
"symfony/process": "~2.8|~3.0"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"psr/log": "For using the console logger",
|
||||||
|
"symfony/event-dispatcher": "",
|
||||||
|
"symfony/filesystem": "",
|
||||||
|
"symfony/process": ""
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "3.3-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Symfony\\Component\\Console\\": ""
|
||||||
|
},
|
||||||
|
"exclude-from-classmap": [
|
||||||
|
"/Tests/"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Fabien Potencier",
|
||||||
|
"email": "fabien@symfony.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Symfony Community",
|
||||||
|
"homepage": "https://symfony.com/contributors"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Symfony Console Component",
|
||||||
|
"homepage": "https://symfony.com",
|
||||||
|
"time": "2017-06-02 19:24:58"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "symfony/debug",
|
||||||
|
"version": "v3.3.2",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/symfony/debug.git",
|
||||||
|
"reference": "e9c50482841ef696e8fa1470d950a79c8921f45d"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/symfony/debug/zipball/e9c50482841ef696e8fa1470d950a79c8921f45d",
|
||||||
|
"reference": "e9c50482841ef696e8fa1470d950a79c8921f45d",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.5.9",
|
||||||
|
"psr/log": "~1.0"
|
||||||
|
},
|
||||||
|
"conflict": {
|
||||||
|
"symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"symfony/http-kernel": "~2.8|~3.0"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "3.3-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Symfony\\Component\\Debug\\": ""
|
||||||
|
},
|
||||||
|
"exclude-from-classmap": [
|
||||||
|
"/Tests/"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Fabien Potencier",
|
||||||
|
"email": "fabien@symfony.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Symfony Community",
|
||||||
|
"homepage": "https://symfony.com/contributors"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Symfony Debug Component",
|
||||||
|
"homepage": "https://symfony.com",
|
||||||
|
"time": "2017-06-01 21:01:25"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "symfony/finder",
|
||||||
|
"version": "v3.3.2",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/symfony/finder.git",
|
||||||
|
"reference": "baea7f66d30854ad32988c11a09d7ffd485810c4"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/symfony/finder/zipball/baea7f66d30854ad32988c11a09d7ffd485810c4",
|
||||||
|
"reference": "baea7f66d30854ad32988c11a09d7ffd485810c4",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.5.9"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "3.3-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Symfony\\Component\\Finder\\": ""
|
||||||
|
},
|
||||||
|
"exclude-from-classmap": [
|
||||||
|
"/Tests/"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Fabien Potencier",
|
||||||
|
"email": "fabien@symfony.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Symfony Community",
|
||||||
|
"homepage": "https://symfony.com/contributors"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Symfony Finder Component",
|
||||||
|
"homepage": "https://symfony.com",
|
||||||
|
"time": "2017-06-01 21:01:25"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "symfony/polyfill-mbstring",
|
||||||
|
"version": "v1.3.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/symfony/polyfill-mbstring.git",
|
||||||
|
"reference": "e79d363049d1c2128f133a2667e4f4190904f7f4"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/e79d363049d1c2128f133a2667e4f4190904f7f4",
|
||||||
|
"reference": "e79d363049d1c2128f133a2667e4f4190904f7f4",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.3"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"ext-mbstring": "For best performance"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "1.3-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Symfony\\Polyfill\\Mbstring\\": ""
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"bootstrap.php"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Nicolas Grekas",
|
||||||
|
"email": "p@tchwork.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Symfony Community",
|
||||||
|
"homepage": "https://symfony.com/contributors"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Symfony polyfill for the Mbstring extension",
|
||||||
|
"homepage": "https://symfony.com",
|
||||||
|
"keywords": [
|
||||||
|
"compatibility",
|
||||||
|
"mbstring",
|
||||||
|
"polyfill",
|
||||||
|
"portable",
|
||||||
|
"shim"
|
||||||
|
],
|
||||||
|
"time": "2016-11-14 01:06:16"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "symfony/yaml",
|
||||||
|
"version": "v3.2.2",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/symfony/yaml.git",
|
||||||
|
"reference": "50eadbd7926e31842893c957eca362b21592a97d"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/symfony/yaml/zipball/50eadbd7926e31842893c957eca362b21592a97d",
|
||||||
|
"reference": "50eadbd7926e31842893c957eca362b21592a97d",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.5.9"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"symfony/console": "~2.8|~3.0"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"symfony/console": "For validating YAML files using the lint command"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "3.2-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Symfony\\Component\\Yaml\\": ""
|
||||||
|
},
|
||||||
|
"exclude-from-classmap": [
|
||||||
|
"/Tests/"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Fabien Potencier",
|
||||||
|
"email": "fabien@symfony.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Symfony Community",
|
||||||
|
"homepage": "https://symfony.com/contributors"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Symfony Yaml Component",
|
||||||
|
"homepage": "https://symfony.com",
|
||||||
|
"time": "2017-01-03 13:51:32"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "webmozart/assert",
|
||||||
|
"version": "1.2.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/webmozart/assert.git",
|
||||||
|
"reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/webmozart/assert/zipball/2db61e59ff05fe5126d152bd0655c9ea113e550f",
|
||||||
|
"reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": "^5.3.3 || ^7.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "^4.6",
|
||||||
|
"sebastian/version": "^1.0.1"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "1.3-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Webmozart\\Assert\\": "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Bernhard Schussek",
|
||||||
|
"email": "bschussek@gmail.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Assertions to validate method input/output with nice error messages.",
|
||||||
|
"keywords": [
|
||||||
|
"assert",
|
||||||
|
"check",
|
||||||
|
"validate"
|
||||||
|
],
|
||||||
|
"time": "2016-11-23 20:04:58"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"aliases": [],
|
||||||
|
"minimum-stability": "stable",
|
||||||
|
"stability-flags": {
|
||||||
|
"phpstan/phpstan": 20
|
||||||
|
},
|
||||||
|
"prefer-stable": false,
|
||||||
|
"prefer-lowest": false,
|
||||||
|
"platform": {
|
||||||
|
"php": ">=5.3.0|>=7.0",
|
||||||
|
"ext-soap": "*",
|
||||||
|
"ext-curl": "*"
|
||||||
|
},
|
||||||
|
"platform-dev": {
|
||||||
|
"ext-mcrypt": "*"
|
||||||
|
}
|
||||||
|
}
|
6
phing
Executable file
6
phing
Executable file
@ -0,0 +1,6 @@
|
|||||||
|
#!/usr/bin/env php
|
||||||
|
<?php
|
||||||
|
|
||||||
|
putenv("PHING_HOME=" . realpath(dirname(__FILE__)));
|
||||||
|
|
||||||
|
require_once __DIR__ . '/vendor/phing/phing/bin/phing.php';
|
@ -9,26 +9,30 @@
|
|||||||
processIsolation="false"
|
processIsolation="false"
|
||||||
stopOnFailure="false"
|
stopOnFailure="false"
|
||||||
syntaxCheck="false"
|
syntaxCheck="false"
|
||||||
bootstrap="vendor/autoload.php"
|
stderr="true"
|
||||||
>
|
bootstrap="vendor/autoload.php">
|
||||||
|
|
||||||
<php>
|
<php>
|
||||||
<const name="WEBSERVER_PORT" value="8000" />
|
<const name="WEBSERVER_PORT" value="8000" />
|
||||||
</php>
|
</php>
|
||||||
|
|
||||||
<testsuites>
|
<testsuites>
|
||||||
<testsuite name="BeSimpleSoap Test Suite">
|
<testsuite name="BeSimpleSoapTestSuite">
|
||||||
<directory>./src/BeSimple/*/Tests/</directory>
|
<directory>tests</directory>
|
||||||
</testsuite>
|
</testsuite>
|
||||||
</testsuites>
|
</testsuites>
|
||||||
|
|
||||||
<filter>
|
<filter>
|
||||||
<whitelist>
|
<whitelist>
|
||||||
<directory>./src/BeSimple/</directory>
|
<directory>src</directory>
|
||||||
<exclude>
|
<exclude>
|
||||||
<directory>./src/BeSimple/*/Tests</directory>
|
<directory>src/BeSimple/SoapBundle</directory>
|
||||||
<directory>./src/BeSimple/*/Resources</directory>
|
<directory>src/BeSimple/SoapCommon/Type</directory>
|
||||||
</exclude>
|
</exclude>
|
||||||
</whitelist>
|
</whitelist>
|
||||||
</filter>
|
</filter>
|
||||||
|
|
||||||
|
<logging>
|
||||||
|
<log type="coverage-text" target="php://stdout" showUncoveredFiles="true" showOnlySummary="true"/>
|
||||||
|
<log type="coverage-clover" target="cache/clover.xml"/>
|
||||||
|
</logging>
|
||||||
</phpunit>
|
</phpunit>
|
||||||
|
@ -13,29 +13,45 @@
|
|||||||
namespace BeSimple\SoapBundle;
|
namespace BeSimple\SoapBundle;
|
||||||
|
|
||||||
use BeSimple\SoapCommon\Cache as BaseCache;
|
use BeSimple\SoapCommon\Cache as BaseCache;
|
||||||
|
use BeSimple\SoapCommon\SoapOptions\SoapOptions;
|
||||||
|
use Exception;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Francis Besset <francis.besset@gmail.com>
|
* @author Francis Besset <francis.besset@gmail.com>
|
||||||
*/
|
*/
|
||||||
class Cache
|
class Cache
|
||||||
{
|
{
|
||||||
public function __construct($cacheDisabled, $type, $directory, $lifetime = null, $limit = null)
|
public function __construct(SoapOptions $soapOptions)
|
||||||
{
|
{
|
||||||
$isEnabled = (Boolean) $cacheDisabled ? BaseCache::DISABLED : BaseCache::ENABLED;
|
if ($soapOptions->isWsdlCached()) {
|
||||||
|
$isEnabled = (bool)$soapOptions->isWsdlCached() ? BaseCache::ENABLED : BaseCache::DISABLED;
|
||||||
|
|
||||||
BaseCache::setEnabled($isEnabled);
|
BaseCache::setEnabled($isEnabled);
|
||||||
|
BaseCache::setType($soapOptions->getWsdlCacheType());
|
||||||
|
BaseCache::setDirectory($soapOptions->getWsdlCacheDir());
|
||||||
|
} else {
|
||||||
|
BaseCache::setEnabled(BaseCache::DISABLED);
|
||||||
|
BaseCache::setType(SoapOptions::SOAP_CACHE_TYPE_NONE);
|
||||||
|
BaseCache::setDirectory(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (BaseCache::ENABLED == BaseCache::isEnabled()) {
|
public function validateSettings(SoapOptions $soapOptions)
|
||||||
BaseCache::setType($type);
|
{
|
||||||
BaseCache::setDirectory($directory);
|
if ($soapOptions->isWsdlCached()) {
|
||||||
|
if (BaseCache::isEnabled() !== true) {
|
||||||
if (null !== $lifetime) {
|
throw new Exception('WSDL cache could not be set');
|
||||||
BaseCache::setLifetime($lifetime);
|
|
||||||
}
|
}
|
||||||
|
if ($soapOptions->getWsdlCacheType() !== (int)BaseCache::getType()) {
|
||||||
if (null !== $limit) {
|
throw new Exception('WSDL cache type could not be set, ini settings is: '.BaseCache::getType());
|
||||||
BaseCache::setLimit($limit);
|
}
|
||||||
|
if ($soapOptions->getWsdlCacheDir() !== BaseCache::getDirectory()) {
|
||||||
|
throw new Exception('WSDL cache dir could not be set, real dir is: '.BaseCache::getDirectory());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (BaseCache::isEnabled() !== false) {
|
||||||
|
throw new Exception('WSDL cache could not be turned off');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -16,10 +16,11 @@ use BeSimple\SoapBundle\Handler\ExceptionHandler;
|
|||||||
use BeSimple\SoapBundle\Soap\SoapRequest;
|
use BeSimple\SoapBundle\Soap\SoapRequest;
|
||||||
use BeSimple\SoapBundle\Soap\SoapResponse;
|
use BeSimple\SoapBundle\Soap\SoapResponse;
|
||||||
use BeSimple\SoapServer\SoapServerBuilder;
|
use BeSimple\SoapServer\SoapServerBuilder;
|
||||||
use Symfony\Component\DependencyInjection\ContainerAware;
|
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\Request;
|
||||||
use Symfony\Component\HttpFoundation\Response;
|
use Symfony\Component\HttpFoundation\Response;
|
||||||
use Symfony\Component\HttpKernel\Exception\FlattenException;
|
|
||||||
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
|
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
|
||||||
use Symfony\Component\HttpKernel\HttpKernelInterface;
|
use Symfony\Component\HttpKernel\HttpKernelInterface;
|
||||||
use Symfony\Component\HttpKernel\Log\DebugLoggerInterface;
|
use Symfony\Component\HttpKernel\Log\DebugLoggerInterface;
|
||||||
@ -28,8 +29,10 @@ use Symfony\Component\HttpKernel\Log\DebugLoggerInterface;
|
|||||||
* @author Christian Kerl <christian-kerl@web.de>
|
* @author Christian Kerl <christian-kerl@web.de>
|
||||||
* @author Francis Besset <francis.besset@gmail.com>
|
* @author Francis Besset <francis.besset@gmail.com>
|
||||||
*/
|
*/
|
||||||
class SoapWebServiceController extends ContainerAware
|
class SoapWebServiceController implements ContainerAwareInterface
|
||||||
{
|
{
|
||||||
|
use ContainerAwareTrait;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var \SoapServer
|
* @var \SoapServer
|
||||||
*/
|
*/
|
||||||
@ -64,7 +67,7 @@ class SoapWebServiceController extends ContainerAware
|
|||||||
|
|
||||||
$this->serviceBinder = $webServiceContext->getServiceBinder();
|
$this->serviceBinder = $webServiceContext->getServiceBinder();
|
||||||
|
|
||||||
$this->soapRequest = SoapRequest::createFromHttpRequest($this->container->get('request'));
|
$this->soapRequest = SoapRequest::createFromHttpRequest($this->container->get('request_stack')->getCurrentRequest());
|
||||||
$this->soapServer = $webServiceContext
|
$this->soapServer = $webServiceContext
|
||||||
->getServerBuilder()
|
->getServerBuilder()
|
||||||
->withSoapVersion11()
|
->withSoapVersion11()
|
||||||
@ -95,9 +98,10 @@ class SoapWebServiceController extends ContainerAware
|
|||||||
)
|
)
|
||||||
));
|
));
|
||||||
|
|
||||||
$query = $this->container->get('request')->query;
|
$request = $this->container->get('request');
|
||||||
if (!$query->has('wsdl') && !$query->has('WSDL')) {
|
$query = $request->query;
|
||||||
$this->container->get('request')->setRequestFormat('xml');
|
if ($query->has('wsdl') || $query->has('WSDL')) {
|
||||||
|
$request->setRequestFormat('wsdl');
|
||||||
}
|
}
|
||||||
|
|
||||||
return $response;
|
return $response;
|
||||||
@ -137,8 +141,8 @@ class SoapWebServiceController extends ContainerAware
|
|||||||
$request->query->remove('_besimple_soap_fault');
|
$request->query->remove('_besimple_soap_fault');
|
||||||
}
|
}
|
||||||
|
|
||||||
$server = SoapServerBuilder::createWithDefaults()
|
$server = SoapServerBuilder::createWithDefaults(__DIR__.'/../Handler/wsdl/exception.wsdl')
|
||||||
->withWsdl(__DIR__.'/../Handler/wsdl/exception.wsdl')
|
->withWsdl()
|
||||||
->withWsdlCacheNone()
|
->withWsdlCacheNone()
|
||||||
->withHandler($handler)
|
->withHandler($handler)
|
||||||
->build()
|
->build()
|
||||||
|
@ -12,7 +12,7 @@ namespace BeSimple\SoapBundle\Converter;
|
|||||||
|
|
||||||
use BeSimple\SoapBundle\Soap\SoapRequest;
|
use BeSimple\SoapBundle\Soap\SoapRequest;
|
||||||
use BeSimple\SoapBundle\Soap\SoapResponse;
|
use BeSimple\SoapBundle\Soap\SoapResponse;
|
||||||
use BeSimple\SoapBundle\Util\String;
|
use BeSimple\SoapBundle\Util\StringUtility;
|
||||||
use BeSimple\SoapCommon\Converter\TypeConverterInterface;
|
use BeSimple\SoapCommon\Converter\TypeConverterInterface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -40,7 +40,7 @@ class XopIncludeTypeConverter implements TypeConverterInterface
|
|||||||
|
|
||||||
$ref = $include->getAttribute('href');
|
$ref = $include->getAttribute('href');
|
||||||
|
|
||||||
if (String::startsWith($ref, 'cid:')) {
|
if (StringUtility::startsWith($ref, 'cid:')) {
|
||||||
$cid = urldecode(substr($ref, 4));
|
$cid = urldecode(substr($ref, 4));
|
||||||
|
|
||||||
return $request->getSoapAttachments()->get($cid)->getContent();
|
return $request->getSoapAttachments()->get($cid)->getContent();
|
||||||
|
@ -98,18 +98,31 @@ class BeSimpleSoapExtension extends Extension
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$proxy = $options['proxy'];
|
||||||
|
if (false !== $proxy['host']) {
|
||||||
|
if (null !== $proxy['auth']) {
|
||||||
|
if ('basic' === $proxy['auth']) {
|
||||||
|
$proxy['auth'] = \CURLAUTH_BASIC;
|
||||||
|
} elseif ('ntlm' === $proxy['auth']) {
|
||||||
|
$proxy['auth'] = \CURLAUTH_NTLM;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$definition->addMethodCall('withProxy', array(
|
||||||
|
$proxy['host'], $proxy['port'],
|
||||||
|
$proxy['login'], $proxy['password'],
|
||||||
|
$proxy['auth']
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
if (isset($defOptions['cache_type'])) {
|
if (isset($defOptions['cache_type'])) {
|
||||||
$defOptions['cache_type'] = $this->getCacheType($defOptions['cache_type']);
|
$defOptions['cache_type'] = $this->getCacheType($defOptions['cache_type']);
|
||||||
}
|
}
|
||||||
|
|
||||||
$definition->replaceArgument(1, $defOptions);
|
$definition->replaceArgument(1, $defOptions);
|
||||||
|
|
||||||
if (!empty($options['classmap'])) {
|
$classmap = $this->createClientClassmap($client, $options['classmap'], $container);
|
||||||
$classmap = $this->createClientClassmap($client, $options['classmap'], $container);
|
$definition->replaceArgument(2, new Reference($classmap));
|
||||||
$definition->replaceArgument(2, new Reference($classmap));
|
|
||||||
} else {
|
|
||||||
$definition->replaceArgument(2, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->createClient($client, $container);
|
$this->createClient($client, $container);
|
||||||
}
|
}
|
||||||
@ -120,9 +133,11 @@ class BeSimpleSoapExtension extends Extension
|
|||||||
$definition = new DefinitionDecorator('besimple.soap.classmap');
|
$definition = new DefinitionDecorator('besimple.soap.classmap');
|
||||||
$container->setDefinition(sprintf('besimple.soap.classmap.%s', $client), $definition);
|
$container->setDefinition(sprintf('besimple.soap.classmap.%s', $client), $definition);
|
||||||
|
|
||||||
$definition->setMethodCalls(array(
|
if (!empty($classmap)) {
|
||||||
array('set', array($classmap)),
|
$definition->setMethodCalls(array(
|
||||||
));
|
array('set', array($classmap)),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
return sprintf('besimple.soap.classmap.%s', $client);
|
return sprintf('besimple.soap.classmap.%s', $client);
|
||||||
}
|
}
|
||||||
@ -132,7 +147,10 @@ class BeSimpleSoapExtension extends Extension
|
|||||||
$definition = new DefinitionDecorator('besimple.soap.client');
|
$definition = new DefinitionDecorator('besimple.soap.client');
|
||||||
$container->setDefinition(sprintf('besimple.soap.client.%s', $client), $definition);
|
$container->setDefinition(sprintf('besimple.soap.client.%s', $client), $definition);
|
||||||
|
|
||||||
$definition->setFactoryService(sprintf('besimple.soap.client.builder.%s', $client));
|
$definition->setFactory(array(
|
||||||
|
new Reference(sprintf('besimple.soap.client.builder.%s', $client)),
|
||||||
|
'build'
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
private function createWebServiceContext(array $config, ContainerBuilder $container)
|
private function createWebServiceContext(array $config, ContainerBuilder $container)
|
||||||
|
@ -24,6 +24,7 @@ use Symfony\Component\Config\Definition\Builder\TreeBuilder;
|
|||||||
class Configuration
|
class Configuration
|
||||||
{
|
{
|
||||||
private $cacheTypes = array('none', 'disk', 'memory', 'disk_memory');
|
private $cacheTypes = array('none', 'disk', 'memory', 'disk_memory');
|
||||||
|
private $proxyAuth = array('basic', 'ntlm');
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generates the configuration tree.
|
* Generates the configuration tree.
|
||||||
@ -85,12 +86,33 @@ class Configuration
|
|||||||
->scalarNode('cache_type')
|
->scalarNode('cache_type')
|
||||||
->validate()
|
->validate()
|
||||||
->ifNotInArray($this->cacheTypes)
|
->ifNotInArray($this->cacheTypes)
|
||||||
->thenInvalid(sprintf('The cache type has to be either %s', implode(', ', $this->cacheTypes)))
|
->thenInvalid(sprintf('The cache type has to be either: %s', implode(', ', $this->cacheTypes)))
|
||||||
->end()
|
->end()
|
||||||
->end()
|
->end()
|
||||||
->arrayNode('classmap')
|
->arrayNode('classmap')
|
||||||
->useAttributeAsKey('name')->prototype('scalar')->end()
|
->useAttributeAsKey('name')->prototype('scalar')->end()
|
||||||
->end()
|
->end()
|
||||||
|
->arrayNode('proxy')
|
||||||
|
->info('proxy configuration')
|
||||||
|
->addDefaultsIfNotSet()
|
||||||
|
->beforeNormalization()
|
||||||
|
->ifTrue(function ($v) { return !is_array($v); })
|
||||||
|
->then(function ($v) { return array('host' => null === $v ? false : $v); })
|
||||||
|
->end()
|
||||||
|
->children()
|
||||||
|
->scalarNode('host')->defaultFalse()->end()
|
||||||
|
->scalarNode('port')->defaultValue(3128)->end()
|
||||||
|
->scalarNode('login')->defaultNull()->end()
|
||||||
|
->scalarNode('password')->defaultNull()->end()
|
||||||
|
->scalarNode('auth')
|
||||||
|
->defaultNull()
|
||||||
|
->validate()
|
||||||
|
->ifNotInArray($this->proxyAuth)
|
||||||
|
->thenInvalid(sprintf('The proxy auth has to be either: %s', implode(', ', $this->proxyAuth)))
|
||||||
|
->end()
|
||||||
|
->end()
|
||||||
|
->end()
|
||||||
|
->end()
|
||||||
->end()
|
->end()
|
||||||
->end()
|
->end()
|
||||||
->end()
|
->end()
|
||||||
|
@ -51,7 +51,9 @@ class SoapExceptionListener extends ExceptionListener
|
|||||||
}
|
}
|
||||||
|
|
||||||
$request = $event->getRequest();
|
$request = $event->getRequest();
|
||||||
if ('soap' !== $request->getRequestFormat()) {
|
if (!in_array($request->getRequestFormat(), array('soap', 'xml'))) {
|
||||||
|
return;
|
||||||
|
} elseif ('xml' === $request->getRequestFormat() && '_webservice_call' !== $request->attributes->get('_route')) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,9 +12,9 @@
|
|||||||
|
|
||||||
namespace BeSimple\SoapBundle\Handler;
|
namespace BeSimple\SoapBundle\Handler;
|
||||||
|
|
||||||
use BeSimple\SoapServer\Exception\ReceiverSoapFault;
|
use SoapFault;
|
||||||
|
use Symfony\Component\Debug\Exception\FlattenException;
|
||||||
use Symfony\Component\HttpFoundation\Response;
|
use Symfony\Component\HttpFoundation\Response;
|
||||||
use Symfony\Component\HttpKernel\Exception\FlattenException;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Francis Besset <francis.besset@gmail.com>
|
* @author Francis Besset <francis.besset@gmail.com>
|
||||||
@ -44,7 +44,8 @@ class ExceptionHandler
|
|||||||
|
|
||||||
$code = $this->exception->getStatusCode();
|
$code = $this->exception->getStatusCode();
|
||||||
|
|
||||||
throw new ReceiverSoapFault(
|
throw new SoapFault(
|
||||||
|
'receiver',
|
||||||
isset(Response::$statusTexts[$code]) ? Response::$statusTexts[$code] : '',
|
isset(Response::$statusTexts[$code]) ? Response::$statusTexts[$code] : '',
|
||||||
null,
|
null,
|
||||||
$this->details
|
$this->details
|
||||||
|
@ -16,9 +16,12 @@
|
|||||||
</argument>
|
</argument>
|
||||||
<argument type="service" id="besimple.soap.classmap" />
|
<argument type="service" id="besimple.soap.classmap" />
|
||||||
<argument type="service" id="besimple.soap.converter.collection" />
|
<argument type="service" id="besimple.soap.converter.collection" />
|
||||||
|
<argument type="service" id="besimple.soap.cache" /> <!-- hack to load besimple cache configuration -->
|
||||||
</service>
|
</service>
|
||||||
|
|
||||||
<service id="besimple.soap.client" factory-service="besimple.soap.client.builder" factory-method="build" class="%besimple.soap.client.builder.class%" abstract="true" />
|
<service id="besimple.soap.client" class="%besimple.soap.client.builder.class%" abstract="true">
|
||||||
|
<factory class="besimple.soap.client.builder" method="build" />
|
||||||
|
</service>
|
||||||
|
|
||||||
<service id="besimple.soap.classmap" class="%besimple.soap.classmap.class%" abstract="true" />
|
<service id="besimple.soap.classmap" class="%besimple.soap.classmap.class%" abstract="true" />
|
||||||
</services>
|
</services>
|
||||||
|
@ -4,15 +4,15 @@
|
|||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
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">
|
xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd">
|
||||||
|
|
||||||
<route id="_webservice_call" pattern="/{webservice}">
|
<route id="_webservice_call" path="/{webservice}">
|
||||||
<default key="_controller">BeSimpleSoapBundle:SoapWebService:Call</default>
|
<default key="_controller">BeSimpleSoapBundle:SoapWebService:Call</default>
|
||||||
<default key="_format">soap</default>
|
<default key="_format">xml</default>
|
||||||
<requirement key="_method">POST</requirement>
|
<requirement key="_method">POST</requirement>
|
||||||
</route>
|
</route>
|
||||||
|
|
||||||
<route id="_webservice_definition" pattern="/{webservice}">
|
<route id="_webservice_definition" path="/{webservice}">
|
||||||
<default key="_controller">BeSimpleSoapBundle:SoapWebService:Definition</default>
|
<default key="_controller">BeSimpleSoapBundle:SoapWebService:Definition</default>
|
||||||
<default key="_format">wsdl</default>
|
<default key="_format">xml</default>
|
||||||
<requirement key="_method">GET</requirement>
|
<requirement key="_method">GET</requirement>
|
||||||
</route>
|
</route>
|
||||||
</routes>
|
</routes>
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
<service id="besimple.soap.cache" class="%besimple.soap.cache.class%">
|
<service id="besimple.soap.cache" class="%besimple.soap.cache.class%">
|
||||||
<argument>%kernel.debug%</argument>
|
<argument>%kernel.debug%</argument>
|
||||||
<argument>%besimple.soap.cache.type%</argument>
|
<argument>%besimple.soap.cache.type%</argument>
|
||||||
<argument>%besimple.soap.cache.dir%/php</argument>
|
<argument>%besimple.soap.cache.dir%/cache</argument>
|
||||||
<argument>%besimple.soap.cache.lifetime%</argument>
|
<argument>%besimple.soap.cache.lifetime%</argument>
|
||||||
<argument>%besimple.soap.cache.limit%</argument>
|
<argument>%besimple.soap.cache.limit%</argument>
|
||||||
</service>
|
</service>
|
||||||
|
@ -33,4 +33,8 @@ SoapServer
|
|||||||
SoapClient
|
SoapClient
|
||||||
----------
|
----------
|
||||||
|
|
||||||
Coming soon.
|
.. toctree::
|
||||||
|
:maxdepth: 1
|
||||||
|
:numbered:
|
||||||
|
|
||||||
|
soapclient/configuration
|
||||||
|
@ -0,0 +1,158 @@
|
|||||||
|
Configuration
|
||||||
|
=============
|
||||||
|
|
||||||
|
Client configuration
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
Configure your first client in your config file:
|
||||||
|
|
||||||
|
.. code-block:: yaml
|
||||||
|
|
||||||
|
# app/config/config.yml
|
||||||
|
be_simple_soap:
|
||||||
|
clients:
|
||||||
|
DemoApi:
|
||||||
|
# required
|
||||||
|
wsdl: http://localhost/app_dev.php/ws/DemoApi?wsdl
|
||||||
|
|
||||||
|
# classmap (optional)
|
||||||
|
classmap:
|
||||||
|
type_name: "Full\Class\Name"
|
||||||
|
|
||||||
|
# proxy (optional)
|
||||||
|
proxy:
|
||||||
|
host: proxy.domain.name # required to enable proxy configuration
|
||||||
|
port: 3128
|
||||||
|
login: ~
|
||||||
|
password: ~
|
||||||
|
auth: ~ # can be 'basic' or 'ntlm'
|
||||||
|
|
||||||
|
Using client
|
||||||
|
------------
|
||||||
|
|
||||||
|
.. code-block:: php
|
||||||
|
|
||||||
|
namespace Acme\DemoBundle\Controller;
|
||||||
|
|
||||||
|
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
|
||||||
|
|
||||||
|
class DemoController extends Controller
|
||||||
|
{
|
||||||
|
public function helloAction($name)
|
||||||
|
{
|
||||||
|
// The client service name is `besimple.soap.client.demoapi`:
|
||||||
|
// `besimple.soap.client.`: is the base name of your client
|
||||||
|
// `demoapi`: is the name specified in your config file converted to lowercase
|
||||||
|
$client = $this->container->get('besimple.soap.client.demoapi');
|
||||||
|
|
||||||
|
// call `hello` method on WebService with the string parameter `$name`
|
||||||
|
$helloResult = $client->hello($name);
|
||||||
|
|
||||||
|
return $this->render('AcmeDemoBundle:Demo:hello.html.twig', array(
|
||||||
|
'hello' => $helloResult,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Classmap
|
||||||
|
--------
|
||||||
|
|
||||||
|
Configuration
|
||||||
|
~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
.. code-block:: yaml
|
||||||
|
|
||||||
|
# app/config/config.yml
|
||||||
|
be_simple_soap:
|
||||||
|
clients:
|
||||||
|
DemoApi:
|
||||||
|
# ...
|
||||||
|
classmap:
|
||||||
|
User: Acme\DemoBundle\Api\UserApi
|
||||||
|
# add other type_name: classname
|
||||||
|
|
||||||
|
UserApi class
|
||||||
|
~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
.. code-block:: php
|
||||||
|
|
||||||
|
namespace Acme\DemoBundle\Api;
|
||||||
|
|
||||||
|
class UserApi
|
||||||
|
{
|
||||||
|
private $username;
|
||||||
|
|
||||||
|
private $firstname;
|
||||||
|
|
||||||
|
private $lastname;
|
||||||
|
|
||||||
|
public function __construct($username)
|
||||||
|
{
|
||||||
|
$this->username = $username;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getFirstname()
|
||||||
|
{
|
||||||
|
return $this->firstname;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getLastname()
|
||||||
|
{
|
||||||
|
return $this->lastname;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Usage
|
||||||
|
~~~~~
|
||||||
|
|
||||||
|
.. code-block:: php
|
||||||
|
|
||||||
|
namespace Acme\DemoBundle\Controller;
|
||||||
|
|
||||||
|
use Acme\DemoBundle\Api\UserApi;
|
||||||
|
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
|
||||||
|
|
||||||
|
class DemoController extends Controller
|
||||||
|
{
|
||||||
|
public function userAction($username)
|
||||||
|
{
|
||||||
|
// The client service name is `besimple.soap.client.demoapi`:
|
||||||
|
// `besimple.soap.client.`: is the base name of your client
|
||||||
|
// `demoapi`: is the name specified in your config file converted to lowercase
|
||||||
|
$client = $this->container->get('besimple.soap.client.demoapi');
|
||||||
|
|
||||||
|
// call `getUser` method on WebService with an instance of UserApi
|
||||||
|
// if the `getUserByUsername` method return a `User` type then `$userResult` is an instance of UserApi
|
||||||
|
$userResult = $client->getUserByUsername($username);
|
||||||
|
|
||||||
|
return $this->render('AcmeDemoBundle:Demo:user.html.twig', array(
|
||||||
|
'user' => $userResult,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Without classmap configuration the `$userResult` is an instance of `stdClass`:
|
||||||
|
|
||||||
|
.. code-block:: text
|
||||||
|
|
||||||
|
object(stdClass)#5561 (3) {
|
||||||
|
["username"]=>
|
||||||
|
string(6) "FooBar"
|
||||||
|
["firstname"]=>
|
||||||
|
string(3) "Foo"
|
||||||
|
["lastname"]=>
|
||||||
|
string(3) "Bar"
|
||||||
|
}
|
||||||
|
|
||||||
|
With classmap configuration the `$userResult` is an instance of `Acme\DemoBundle\Api\UserApi`:
|
||||||
|
|
||||||
|
.. code-block:: text
|
||||||
|
|
||||||
|
object(Acme\DemoBundle\Api\UserApi)#208 (3) {
|
||||||
|
["username":"Acme\DemoBundle\Api\UserApi":private]=>
|
||||||
|
string(6) "FooBar"
|
||||||
|
["firstname":"Acme\DemoBundle\Api\UserApi":private]=>
|
||||||
|
string(3) "Foo"
|
||||||
|
["lastname":"Acme\DemoBundle\Api\UserApi":private]=>
|
||||||
|
string(3) "Bar"
|
||||||
|
}
|
@ -7,7 +7,7 @@ Pre-existent Type
|
|||||||
+------------------------------------------------+-----------------+
|
+------------------------------------------------+-----------------+
|
||||||
| Php Type | Value Type |
|
| Php Type | Value Type |
|
||||||
+================================================+=================+
|
+================================================+=================+
|
||||||
| BeSimple\\SoapCommon\\Type\\KeyValue\\String | String |
|
| BeSimple\\SoapCommon\\Type\\KeyValue\\StringUtility | StringUtility |
|
||||||
+------------------------------------------------+-----------------+
|
+------------------------------------------------+-----------------+
|
||||||
| BeSimple\\SoapCommon\\Type\\KeyValue\\Boolean | Boolean |
|
| BeSimple\\SoapCommon\\Type\\KeyValue\\Boolean | Boolean |
|
||||||
+------------------------------------------------+-----------------+
|
+------------------------------------------------+-----------------+
|
||||||
@ -34,7 +34,7 @@ Controller
|
|||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* @Soap\Method("returnAssocArray")
|
* @Soap\Method("returnAssocArray")
|
||||||
* @Soap\Result(phpType = "BeSimple\SoapCommon\Type\KeyValue\String[]")
|
* @Soap\Result(phpType = "BeSimple\SoapCommon\Type\KeyValue\StringUtility[]")
|
||||||
*/
|
*/
|
||||||
public function assocArrayOfStringAction()
|
public function assocArrayOfStringAction()
|
||||||
{
|
{
|
||||||
@ -46,10 +46,10 @@ Controller
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @Soap\Method("sendAssocArray")
|
* @Soap\Method("sendAssocArray")
|
||||||
* @Soap\Param("assocArray", phpType = "BeSimple\SoapCommon\Type\KeyValue\String[]")
|
* @Soap\Param("assocArray", phpType = "BeSimple\SoapCommon\Type\KeyValue\StringUtility[]")
|
||||||
* @Soap\Return(phpType = "BeSimple\SoapCommon\Type\KeyValue\String[]")
|
* @Soap\Result(phpType = "BeSimple\SoapCommon\Type\KeyValue\StringUtility[]")
|
||||||
*/
|
*/
|
||||||
public function assocArrayOfStringAction(array $assocArray)
|
public function sendAssocArrayOfStringAction(array $assocArray)
|
||||||
{
|
{
|
||||||
// The $assocArray it's a real associative array
|
// The $assocArray it's a real associative array
|
||||||
// var_dump($assocArray);die;
|
// var_dump($assocArray);die;
|
||||||
@ -97,3 +97,4 @@ How to create my Associative Array?
|
|||||||
'user2' => new User('user2', 'user2@user.com'),
|
'user2' => new User('user2', 'user2@user.com'),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
@ -86,6 +86,16 @@ You can expose only the properties (public, protected or private) of a complex t
|
|||||||
*/
|
*/
|
||||||
private $newsletter;
|
private $newsletter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Soap\ComplexType("date")
|
||||||
|
*/
|
||||||
|
private $createdAt:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Soap\ComplexType("datetime")
|
||||||
|
*/
|
||||||
|
private $updatedAt;
|
||||||
|
|
||||||
public function getId()
|
public function getId()
|
||||||
{
|
{
|
||||||
return $this->id;
|
return $this->id;
|
||||||
@ -128,7 +138,27 @@ You can expose only the properties (public, protected or private) of a complex t
|
|||||||
|
|
||||||
public function setNewsletter($newsletter)
|
public function setNewsletter($newsletter)
|
||||||
{
|
{
|
||||||
$this->newletter = (Boolean) $newsletter
|
$this->newletter = (Boolean) $newsletter;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getCreatedAt()
|
||||||
|
{
|
||||||
|
return $this->createdAt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setCreatedAt(\DateTime $createdAt)
|
||||||
|
{
|
||||||
|
$this->createdAt = $createdAt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getUpdatedAt()
|
||||||
|
{
|
||||||
|
return this->updatedAt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setUpdatedAt(\DateTime $updatedAt)
|
||||||
|
{
|
||||||
|
$this->updatedAt = $updatedAt;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
36
src/BeSimple/SoapBundle/Soap/SoapAttachmentList.php
Normal file
36
src/BeSimple/SoapBundle/Soap/SoapAttachmentList.php
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace BeSimple\SoapBundle\Soap;
|
||||||
|
|
||||||
|
class SoapAttachmentList
|
||||||
|
{
|
||||||
|
private $soapAttachments;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param SoapAttachment[] $soapAttachments
|
||||||
|
*/
|
||||||
|
public function __construct(array $soapAttachments = [])
|
||||||
|
{
|
||||||
|
$this->soapAttachments = $soapAttachments;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function hasSoapAttachments()
|
||||||
|
{
|
||||||
|
return $this->soapAttachments !== null && count($this->soapAttachments) > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getSoapAttachments()
|
||||||
|
{
|
||||||
|
return $this->soapAttachments;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getSoapAttachmentIds()
|
||||||
|
{
|
||||||
|
$ids = [];
|
||||||
|
foreach ($this->getSoapAttachments() as $soapAttachment) {
|
||||||
|
$ids[] = $soapAttachment->getId();
|
||||||
|
}
|
||||||
|
|
||||||
|
return $ids;
|
||||||
|
}
|
||||||
|
}
|
@ -1,77 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace BeSimple\SoapBundle\Soap;
|
|
||||||
|
|
||||||
use BeSimple\SoapCommon\Classmap;
|
|
||||||
use BeSimple\SoapCommon\Converter\TypeConverterCollection;
|
|
||||||
use BeSimple\SoapClient\SoapClientBuilder as BaseSoapClientBuilder;
|
|
||||||
|
|
||||||
class SoapClientBuilder extends BaseSoapClientBuilder
|
|
||||||
{
|
|
||||||
protected $soapClient;
|
|
||||||
|
|
||||||
public function __construct($wsdl, array $options, Classmap $classmap = null, TypeConverterCollection $converters = null)
|
|
||||||
{
|
|
||||||
parent::__construct();
|
|
||||||
|
|
||||||
$this->checkOptions($options);
|
|
||||||
|
|
||||||
$this
|
|
||||||
->withWsdl($wsdl)
|
|
||||||
->withTrace($options['debug'])
|
|
||||||
;
|
|
||||||
|
|
||||||
if (isset($options['user_agent'])) {
|
|
||||||
$this->withUserAgent($options['user_agent']);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isset($options['cache_type'])) {
|
|
||||||
$this->withWsdlCache($options['cache_type']);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($classmap) {
|
|
||||||
$this->withClassmap($classmap);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($converters) {
|
|
||||||
$this->withTypeConverters($converters);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public function build()
|
|
||||||
{
|
|
||||||
if (!$this->soapClient) {
|
|
||||||
$this->soapClient = parent::build();
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->soapClient;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function checkOptions(array $options)
|
|
||||||
{
|
|
||||||
$checkOptions = array(
|
|
||||||
'debug' => false,
|
|
||||||
'cache_type' => null,
|
|
||||||
'exceptions' => true,
|
|
||||||
'user_agent' => 'BeSimpleSoap',
|
|
||||||
);
|
|
||||||
|
|
||||||
// check option names and live merge, if errors are encountered Exception will be thrown
|
|
||||||
$invalid = array();
|
|
||||||
$isInvalid = false;
|
|
||||||
foreach ($options as $key => $value) {
|
|
||||||
if (!array_key_exists($key, $checkOptions)) {
|
|
||||||
$isInvalid = true;
|
|
||||||
$invalid[] = $key;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($isInvalid) {
|
|
||||||
throw new \InvalidArgumentException(sprintf(
|
|
||||||
'The "%s" class does not support the following options: "%s".',
|
|
||||||
get_class($this),
|
|
||||||
implode('\', \'', $invalid)
|
|
||||||
));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -16,66 +16,70 @@ use BeSimple\SoapBundle\ServiceBinding\RpcLiteralRequestMessageBinder;
|
|||||||
use BeSimple\SoapBundle\ServiceDefinition as Definition;
|
use BeSimple\SoapBundle\ServiceDefinition as Definition;
|
||||||
use BeSimple\SoapBundle\Tests\fixtures\ServiceBinding as Fixtures;
|
use BeSimple\SoapBundle\Tests\fixtures\ServiceBinding as Fixtures;
|
||||||
use BeSimple\SoapBundle\Util\Collection;
|
use BeSimple\SoapBundle\Util\Collection;
|
||||||
|
use BeSimple\SoapCommon\Definition\Type\ComplexType;
|
||||||
|
use BeSimple\SoapCommon\Definition\Type\TypeRepository;
|
||||||
|
|
||||||
class RpcLiteralRequestMessageBinderTest extends \PHPUnit_Framework_TestCase
|
class RpcLiteralRequestMessageBinderTest extends \PHPUnit_Framework_TestCase
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* @dataProvider messageProvider
|
* @dataProvider messageProvider
|
||||||
*/
|
*/
|
||||||
public function testProcessMessage(Definition\Method $method, $message, $assert)
|
public function testProcessMessage(Definition\Method $method, array $message, array $assert)
|
||||||
{
|
{
|
||||||
$messageBinder = new RpcLiteralRequestMessageBinder();
|
$messageBinder = new RpcLiteralRequestMessageBinder();
|
||||||
$result = $messageBinder->processMessage($method, $message);
|
$result = $messageBinder->processMessage($method, $message, $this->getTypeRepository());
|
||||||
|
|
||||||
$this->assertSame($assert, $result);
|
$this->assertSame($assert, $result);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testProcessMessageWithComplexType()
|
public function testProcessMessageWithComplexType()
|
||||||
{
|
{
|
||||||
|
$typeRepository = $this->addComplexTypes($this->getTypeRepository());
|
||||||
$messageBinder = new RpcLiteralRequestMessageBinder();
|
$messageBinder = new RpcLiteralRequestMessageBinder();
|
||||||
|
|
||||||
|
$method = new Definition\Method('complextype_argument', null);
|
||||||
|
$method->addInput('foo', 'BeSimple\SoapBundle\Tests\fixtures\ServiceBinding\Foo');
|
||||||
|
|
||||||
$foo = new Fixtures\Foo('foobar', 19395);
|
$foo = new Fixtures\Foo('foobar', 19395);
|
||||||
$result = $messageBinder->processMessage(
|
$result = $messageBinder->processMessage(
|
||||||
new Definition\Method('complextype_argument', null, array(), array(
|
$method,
|
||||||
new Definition\Argument('foo', new Definition\Type('BeSimple\SoapBundle\Tests\fixtures\ServiceBinding\Foo')),
|
|
||||||
)),
|
|
||||||
array($foo),
|
array($foo),
|
||||||
$this->getDefinitionComplexTypes()
|
$typeRepository
|
||||||
);
|
);
|
||||||
|
|
||||||
$this->assertEquals(array('foo' => $foo), $result);
|
$this->assertEquals(array('foo' => $foo), $result);
|
||||||
|
|
||||||
|
|
||||||
$foo1 = new Fixtures\Foo('foobar', 29291);
|
$foo1 = new Fixtures\Foo('foobar', 29291);
|
||||||
$foo2 = new Fixtures\Foo('barfoo', 39392);
|
$foo2 = new Fixtures\Foo('barfoo', 39392);
|
||||||
$foos = new \stdClass();
|
$foos = new \stdClass();
|
||||||
$foos->item = array($foo1, $foo2);
|
$foos->item = array($foo1, $foo2);
|
||||||
|
|
||||||
|
$method = new Definition\Method('complextype_argument', null);
|
||||||
|
$method->addInput('foos', 'BeSimple\SoapBundle\Tests\fixtures\ServiceBinding\Foo[]');
|
||||||
|
|
||||||
$result = $messageBinder->processMessage(
|
$result = $messageBinder->processMessage(
|
||||||
new Definition\Method('complextype_argument', null, array(), array(
|
$method,
|
||||||
new Definition\Argument('foos', new Definition\Type('BeSimple\SoapBundle\Tests\fixtures\ServiceBinding\Foo[]')),
|
|
||||||
)),
|
|
||||||
array($foos),
|
array($foos),
|
||||||
$this->getDefinitionComplexTypes()
|
$typeRepository
|
||||||
);
|
);
|
||||||
|
|
||||||
$this->assertEquals(array('foos' => array($foo1, $foo2)), $result);
|
$this->assertEquals(array('foos' => array($foo1, $foo2)), $result);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @expectedException SoapFault
|
|
||||||
*/
|
|
||||||
public function testProcessMessageSoapFault()
|
public function testProcessMessageSoapFault()
|
||||||
{
|
{
|
||||||
$messageBinder = new RpcLiteralRequestMessageBinder();
|
$messageBinder = new RpcLiteralRequestMessageBinder();
|
||||||
|
|
||||||
|
$method = new Definition\Method('complextype_argument', null);
|
||||||
|
$method->addInput('foo', 'BeSimple\SoapBundle\Tests\fixtures\ServiceBinding\Foo');
|
||||||
|
|
||||||
$foo = new Fixtures\Foo('foo', null);
|
$foo = new Fixtures\Foo('foo', null);
|
||||||
$result = $messageBinder->processMessage(
|
|
||||||
new Definition\Method('complextype_argument', null, array(), array(
|
$this->setExpectedException('SoapFault');
|
||||||
new Definition\Argument('foo', new Definition\Type('BeSimple\SoapBundle\Tests\fixtures\ServiceBinding\Foo')),
|
$messageBinder->processMessage(
|
||||||
)),
|
$method,
|
||||||
array($foo),
|
array($foo),
|
||||||
$this->getDefinitionComplexTypes()
|
$this->addComplexTypes($this->getTypeRepository())
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -83,16 +87,17 @@ class RpcLiteralRequestMessageBinderTest extends \PHPUnit_Framework_TestCase
|
|||||||
{
|
{
|
||||||
$messageBinder = new RpcLiteralRequestMessageBinder();
|
$messageBinder = new RpcLiteralRequestMessageBinder();
|
||||||
|
|
||||||
|
$method = new Definition\Method('complextype_argument', null);
|
||||||
|
$method->addInput('foos', 'BeSimple\SoapBundle\Tests\fixtures\ServiceBinding\Foo[]');
|
||||||
|
|
||||||
$foo = new Fixtures\Foo('foo', 2499104);
|
$foo = new Fixtures\Foo('foo', 2499104);
|
||||||
$foos = new \stdClass();
|
$foos = new \stdClass();
|
||||||
$foos->item = array($foo, $foo);
|
$foos->item = array($foo, $foo);
|
||||||
|
|
||||||
$result = $messageBinder->processMessage(
|
$result = $messageBinder->processMessage(
|
||||||
new Definition\Method('complextype_argument', null, array(), array(
|
$method,
|
||||||
new Definition\Argument('foos', new Definition\Type('BeSimple\SoapBundle\Tests\fixtures\ServiceBinding\Foo[]')),
|
|
||||||
)),
|
|
||||||
array($foos),
|
array($foos),
|
||||||
$this->getDefinitionComplexTypes()
|
$this->addComplexTypes($this->getTypeRepository())
|
||||||
);
|
);
|
||||||
|
|
||||||
$this->assertEquals(array('foos' => array($foo, $foo)), $result);
|
$this->assertEquals(array('foos' => array($foo, $foo)), $result);
|
||||||
@ -102,16 +107,17 @@ class RpcLiteralRequestMessageBinderTest extends \PHPUnit_Framework_TestCase
|
|||||||
{
|
{
|
||||||
$messageBinder = new RpcLiteralRequestMessageBinder();
|
$messageBinder = new RpcLiteralRequestMessageBinder();
|
||||||
|
|
||||||
|
$method = new Definition\Method('complextype_argument', null);
|
||||||
|
$method->addInput('fooBar', 'BeSimple\SoapBundle\Tests\fixtures\ServiceBinding\FooBar');
|
||||||
|
|
||||||
$foo = new Fixtures\Foo('foo', 38845);
|
$foo = new Fixtures\Foo('foo', 38845);
|
||||||
$bar = new Fixtures\Bar('bar', null);
|
$bar = new Fixtures\Bar('bar', null);
|
||||||
$fooBar = new Fixtures\FooBar($foo, $bar);
|
$fooBar = new Fixtures\FooBar($foo, $bar);
|
||||||
|
|
||||||
$result = $messageBinder->processMessage(
|
$result = $messageBinder->processMessage(
|
||||||
new Definition\Method('complextype_argument', null, array(), array(
|
$method,
|
||||||
new Definition\Argument('fooBar', new Definition\Type('BeSimple\SoapBundle\Tests\fixtures\ServiceBinding\FooBar')),
|
|
||||||
)),
|
|
||||||
array($fooBar),
|
array($fooBar),
|
||||||
$this->getDefinitionComplexTypes()
|
$this->addComplexTypes($this->getTypeRepository())
|
||||||
);
|
);
|
||||||
|
|
||||||
$this->assertEquals(array('fooBar' => $fooBar), $result);
|
$this->assertEquals(array('fooBar' => $fooBar), $result);
|
||||||
@ -121,17 +127,18 @@ class RpcLiteralRequestMessageBinderTest extends \PHPUnit_Framework_TestCase
|
|||||||
{
|
{
|
||||||
$messageBinder = new RpcLiteralRequestMessageBinder();
|
$messageBinder = new RpcLiteralRequestMessageBinder();
|
||||||
|
|
||||||
|
$method = new Definition\Method('complextype_with_array', null);
|
||||||
|
$method->addInput('simple_arrays', 'BeSimple\SoapBundle\Tests\fixtures\ServiceBinding\SimpleArrays');
|
||||||
|
|
||||||
$array = array(1, 2, 3, 4);
|
$array = array(1, 2, 3, 4);
|
||||||
$stdClass = new \stdClass();
|
$stdClass = new \stdClass();
|
||||||
$stdClass->item = $array;
|
$stdClass->item = $array;
|
||||||
$simpleArrays = new Fixtures\SimpleArrays(null, new \stdClass(), $stdClass);
|
$simpleArrays = new Fixtures\SimpleArrays(null, new \stdClass(), $stdClass);
|
||||||
|
|
||||||
$result = $messageBinder->processMessage(
|
$result = $messageBinder->processMessage(
|
||||||
new Definition\Method('complextype_with_array', null, array(), array(
|
$method,
|
||||||
new Definition\Argument('simple_arrays', new Definition\Type('BeSimple\SoapBundle\Tests\fixtures\ServiceBinding\SimpleArrays')),
|
|
||||||
)),
|
|
||||||
array($simpleArrays),
|
array($simpleArrays),
|
||||||
$this->getDefinitionComplexTypes()
|
$this->addComplexTypes($this->getTypeRepository())
|
||||||
);
|
);
|
||||||
|
|
||||||
$result = $result['simple_arrays'];
|
$result = $result['simple_arrays'];
|
||||||
@ -144,12 +151,13 @@ class RpcLiteralRequestMessageBinderTest extends \PHPUnit_Framework_TestCase
|
|||||||
{
|
{
|
||||||
$messageBinder = new RpcLiteralRequestMessageBinder();
|
$messageBinder = new RpcLiteralRequestMessageBinder();
|
||||||
|
|
||||||
|
$method = new Definition\Method('empty_array_complex_type', null);
|
||||||
|
$method->addInput('foo', 'BeSimple\SoapBundle\Tests\fixtures\ServiceBinding\Foo[]');
|
||||||
|
|
||||||
$result = $messageBinder->processMessage(
|
$result = $messageBinder->processMessage(
|
||||||
new Definition\Method('empty_array_complex_type', null, array(), array(
|
$method,
|
||||||
new Definition\Argument('foo', new Definition\Type('BeSimple\SoapBundle\Tests\fixtures\ServiceBinding\Foo[]')),
|
|
||||||
)),
|
|
||||||
array(new \stdClass()),
|
array(new \stdClass()),
|
||||||
$this->getDefinitionComplexTypes()
|
$this->addComplexTypes($this->getTypeRepository())
|
||||||
);
|
);
|
||||||
|
|
||||||
$this->assertEquals(array('foo' => array()), $result);
|
$this->assertEquals(array('foo' => array()), $result);
|
||||||
@ -159,16 +167,17 @@ class RpcLiteralRequestMessageBinderTest extends \PHPUnit_Framework_TestCase
|
|||||||
{
|
{
|
||||||
$messageBinder = new RpcLiteralRequestMessageBinder();
|
$messageBinder = new RpcLiteralRequestMessageBinder();
|
||||||
|
|
||||||
|
$method = new Definition\Method('prevent_infinite_recursion', null);
|
||||||
|
$method->addInput('foo_recursive', 'BeSimple\SoapBundle\Tests\fixtures\ServiceBinding\FooRecursive');
|
||||||
|
|
||||||
$foo = new Fixtures\FooRecursive('foo', '');
|
$foo = new Fixtures\FooRecursive('foo', '');
|
||||||
$bar = new Fixtures\BarRecursive($foo, 10394);
|
$bar = new Fixtures\BarRecursive($foo, 10394);
|
||||||
$foo->bar = $bar;
|
$foo->bar = $bar;
|
||||||
|
|
||||||
$result = $messageBinder->processMessage(
|
$result = $messageBinder->processMessage(
|
||||||
new Definition\Method('prevent_infinite_recursion', null, array(), array(
|
$method,
|
||||||
new Definition\Argument('foo_recursive', new Definition\Type('BeSimple\SoapBundle\Tests\fixtures\ServiceBinding\FooRecursive')),
|
|
||||||
)),
|
|
||||||
array($foo),
|
array($foo),
|
||||||
$this->getDefinitionComplexTypes()
|
$this->addComplexTypes($this->getTypeRepository())
|
||||||
);
|
);
|
||||||
|
|
||||||
$this->assertEquals(array('foo_recursive' => $foo), $result);
|
$this->assertEquals(array('foo_recursive' => $foo), $result);
|
||||||
@ -179,43 +188,43 @@ class RpcLiteralRequestMessageBinderTest extends \PHPUnit_Framework_TestCase
|
|||||||
$messages = array();
|
$messages = array();
|
||||||
|
|
||||||
$messages[] = array(
|
$messages[] = array(
|
||||||
new Definition\Method('no_argument'),
|
new Definition\Method('no_argument', null),
|
||||||
array(),
|
array(),
|
||||||
array(),
|
array(),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
$method = new Definition\Method('string_argument', null);
|
||||||
|
$method->addInput('foo', 'string');
|
||||||
$messages[] = array(
|
$messages[] = array(
|
||||||
new Definition\Method('string_argument', null, array(), array(
|
$method,
|
||||||
new Definition\Argument('foo', new Definition\Type('string')),
|
|
||||||
)),
|
|
||||||
array('bar'),
|
array('bar'),
|
||||||
array('foo' => 'bar'),
|
array('foo' => 'bar'),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
$method = new Definition\Method('string_int_arguments', null);
|
||||||
|
$method->addInput('foo', 'string');
|
||||||
|
$method->addInput('bar', 'int');
|
||||||
$messages[] = array(
|
$messages[] = array(
|
||||||
new Definition\Method('string_int_arguments', null, array(), array(
|
$method,
|
||||||
new Definition\Argument('foo', new Definition\Type('string')),
|
|
||||||
new Definition\Argument('bar', new Definition\Type('int')),
|
|
||||||
)),
|
|
||||||
array('test', 20),
|
array('test', 20),
|
||||||
array('foo' => 'test', 'bar' => 20),
|
array('foo' => 'test', 'bar' => 20),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
$method = new Definition\Method('array_string_arguments', null);
|
||||||
|
$method->addInput('foo', 'string[]');
|
||||||
|
$method->addInput('bar', 'int');
|
||||||
$strings = new \stdClass();
|
$strings = new \stdClass();
|
||||||
$strings->item = array('foo', 'bar', 'barfoo');
|
$strings->item = array('foo', 'bar', 'barfoo');
|
||||||
$messages[] = array(
|
$messages[] = array(
|
||||||
new Definition\Method('array_string_arguments', null, array(), array(
|
$method,
|
||||||
new Definition\Argument('foo', new Definition\Type('string[]')),
|
|
||||||
new Definition\Argument('bar', new Definition\Type('int')),
|
|
||||||
)),
|
|
||||||
array($strings, 4),
|
array($strings, 4),
|
||||||
array('foo' => array('foo', 'bar', 'barfoo'), 'bar' => 4),
|
array('foo' => array('foo', 'bar', 'barfoo'), 'bar' => 4),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
$method = new Definition\Method('empty_array', null);
|
||||||
|
$method->addInput('foo', 'string[]');
|
||||||
$messages[] = array(
|
$messages[] = array(
|
||||||
new Definition\Method('empty_array', null, array(), array(
|
$method,
|
||||||
new Definition\Argument('foo', new Definition\Type('string[]')),
|
|
||||||
)),
|
|
||||||
array(new \stdClass()),
|
array(new \stdClass()),
|
||||||
array('foo' => array()),
|
array('foo' => array()),
|
||||||
);
|
);
|
||||||
@ -223,40 +232,38 @@ class RpcLiteralRequestMessageBinderTest extends \PHPUnit_Framework_TestCase
|
|||||||
return $messages;
|
return $messages;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getDefinitionComplexTypes()
|
private function addComplexTypes(TypeRepository $typeRepository)
|
||||||
{
|
{
|
||||||
$definitionComplexTypes = array();
|
$foo = new ComplexType('BeSimple\SoapBundle\Tests\fixtures\ServiceBinding\Foo', 'Foo');
|
||||||
|
$foo->add('foo', 'string');
|
||||||
|
$foo->add('bar', 'int');
|
||||||
|
$typeRepository->addComplexType($foo);
|
||||||
|
|
||||||
$definitionComplexTypes['BeSimple\SoapBundle\Tests\fixtures\ServiceBinding\Foo'] = $this->createComplexTypeCollection(array(
|
$bar = new ComplexType('BeSimple\SoapBundle\Tests\fixtures\ServiceBinding\Bar', 'Bar');
|
||||||
array('foo', 'string'),
|
$bar->add('foo', 'string');
|
||||||
array('bar', 'int'),
|
$bar->add('bar', 'int', true);
|
||||||
));
|
$typeRepository->addComplexType($bar);
|
||||||
|
|
||||||
$definitionComplexTypes['BeSimple\SoapBundle\Tests\fixtures\ServiceBinding\Bar'] = $this->createComplexTypeCollection(array(
|
$fooBar = new ComplexType('BeSimple\SoapBundle\Tests\fixtures\ServiceBinding\FooBar', 'FooBar');
|
||||||
array('foo', 'string'),
|
$fooBar->add('foo', 'BeSimple\SoapBundle\Tests\fixtures\ServiceBinding\Foo');
|
||||||
array('bar', 'int', true),
|
$fooBar->add('bar', 'BeSimple\SoapBundle\Tests\fixtures\ServiceBinding\Bar');
|
||||||
));
|
$typeRepository->addComplexType($fooBar);
|
||||||
|
|
||||||
$definitionComplexTypes['BeSimple\SoapBundle\Tests\fixtures\ServiceBinding\FooBar'] = $this->createComplexTypeCollection(array(
|
$simpleArrays = new ComplexType('BeSimple\SoapBundle\Tests\fixtures\ServiceBinding\SimpleArrays', 'SimpleArrays');
|
||||||
array('foo', 'BeSimple\SoapBundle\Tests\fixtures\ServiceBinding\Foo'),
|
$simpleArrays->add('array1', 'string[]', true);
|
||||||
array('bar', 'BeSimple\SoapBundle\Tests\fixtures\ServiceBinding\Bar'),
|
$simpleArrays->add('array2', 'string[]');
|
||||||
));
|
$simpleArrays->add('array3', 'string[]');
|
||||||
|
$typeRepository->addComplexType($simpleArrays);
|
||||||
|
|
||||||
$definitionComplexTypes['BeSimple\SoapBundle\Tests\fixtures\ServiceBinding\SimpleArrays'] = $this->createComplexTypeCollection(array(
|
$fooRecursive = new ComplexType('BeSimple\SoapBundle\Tests\fixtures\ServiceBinding\FooRecursive', 'FooRecursive');
|
||||||
array('array1', 'string[]', true),
|
$fooRecursive->add('bar', 'BeSimple\SoapBundle\Tests\fixtures\ServiceBinding\BarRecursive');
|
||||||
array('array2', 'string[]'),
|
$typeRepository->addComplexType($fooRecursive);
|
||||||
array('array3', 'string[]'),
|
|
||||||
));
|
|
||||||
|
|
||||||
$definitionComplexTypes['BeSimple\SoapBundle\Tests\fixtures\ServiceBinding\FooRecursive'] = $this->createComplexTypeCollection(array(
|
$barRecursive = new ComplexType('BeSimple\SoapBundle\Tests\fixtures\ServiceBinding\BarRecursive', 'BarRecursive');
|
||||||
array('bar', 'BeSimple\SoapBundle\Tests\fixtures\ServiceBinding\BarRecursive'),
|
$barRecursive->add('foo', 'BeSimple\SoapBundle\Tests\fixtures\ServiceBinding\FooRecursive');
|
||||||
));
|
$typeRepository->addComplexType($barRecursive);
|
||||||
|
|
||||||
$definitionComplexTypes['BeSimple\SoapBundle\Tests\fixtures\ServiceBinding\BarRecursive'] = $this->createComplexTypeCollection(array(
|
return $typeRepository;
|
||||||
array('foo', 'BeSimple\SoapBundle\Tests\fixtures\ServiceBinding\FooRecursive'),
|
|
||||||
));
|
|
||||||
|
|
||||||
return $definitionComplexTypes;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private function createComplexTypeCollection(array $properties)
|
private function createComplexTypeCollection(array $properties)
|
||||||
@ -277,4 +284,18 @@ class RpcLiteralRequestMessageBinderTest extends \PHPUnit_Framework_TestCase
|
|||||||
|
|
||||||
return array('properties' => $collection);
|
return array('properties' => $collection);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function getTypeRepository()
|
||||||
|
{
|
||||||
|
$typeRepository = new TypeRepository();
|
||||||
|
$typeRepository->addXmlNamespace('xsd', 'http://www.w3.org/2001/XMLSchema');
|
||||||
|
$typeRepository->addType('string', 'xsd:string');
|
||||||
|
$typeRepository->addType('boolean', 'xsd:boolean');
|
||||||
|
$typeRepository->addType('int', 'xsd:int');
|
||||||
|
$typeRepository->addType('float', 'xsd:float');
|
||||||
|
$typeRepository->addType('date', 'xsd:date');
|
||||||
|
$typeRepository->addType('dateTime', 'xsd:dateTime');
|
||||||
|
|
||||||
|
return $typeRepository;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -23,6 +23,8 @@ class SoapRequestTest extends \PHPUnit_Framework_TestCase
|
|||||||
{
|
{
|
||||||
public function testMtomMessage()
|
public function testMtomMessage()
|
||||||
{
|
{
|
||||||
|
$this->markTestSkipped('Skip because I\'m not sure that SoapRequest is used in a HTTP Request process.');
|
||||||
|
|
||||||
$content = $this->loadRequestContentFixture('mtom/simple.txt');
|
$content = $this->loadRequestContentFixture('mtom/simple.txt');
|
||||||
|
|
||||||
$request = new SoapRequest(array(), array(), array(), array(), array(), array(), $content);
|
$request = new SoapRequest(array(), array(), array(), array(), array(), array(), $content);
|
||||||
|
@ -11,11 +11,11 @@
|
|||||||
namespace BeSimple\SoapBundle\Util;
|
namespace BeSimple\SoapBundle\Util;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* String provides utility methods for strings.
|
* StringUtility provides utility methods for strings.
|
||||||
*
|
*
|
||||||
* @author Christian Kerl <christian-kerl@web.de>
|
* @author Christian Kerl <christian-kerl@web.de>
|
||||||
*/
|
*/
|
||||||
class String
|
class StringUtility
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Checks if a string starts with a given string.
|
* Checks if a string starts with a given string.
|
@ -13,6 +13,8 @@ namespace BeSimple\SoapBundle;
|
|||||||
|
|
||||||
use BeSimple\SoapBundle\ServiceBinding\ServiceBinder;
|
use BeSimple\SoapBundle\ServiceBinding\ServiceBinder;
|
||||||
use BeSimple\SoapCommon\Converter\TypeConverterCollection;
|
use BeSimple\SoapCommon\Converter\TypeConverterCollection;
|
||||||
|
use BeSimple\SoapCommon\SoapOptionsBuilder;
|
||||||
|
use BeSimple\SoapServer\SoapServerOptionsBuilder;
|
||||||
use BeSimple\SoapWsdl\Dumper\Dumper;
|
use BeSimple\SoapWsdl\Dumper\Dumper;
|
||||||
use BeSimple\SoapServer\SoapServerBuilder;
|
use BeSimple\SoapServer\SoapServerBuilder;
|
||||||
use Symfony\Component\Config\ConfigCache;
|
use Symfony\Component\Config\ConfigCache;
|
||||||
@ -44,7 +46,7 @@ class WebServiceContext
|
|||||||
if (null === $this->serviceDefinition) {
|
if (null === $this->serviceDefinition) {
|
||||||
$cache = new ConfigCache(sprintf('%s/%s.definition.php', $this->options['cache_dir'], $this->options['name']), $this->options['debug']);
|
$cache = new ConfigCache(sprintf('%s/%s.definition.php', $this->options['cache_dir'], $this->options['name']), $this->options['debug']);
|
||||||
if ($cache->isFresh()) {
|
if ($cache->isFresh()) {
|
||||||
$this->serviceDefinition = include (string) $cache;
|
$this->serviceDefinition = include $cache->getPath();
|
||||||
} else {
|
} else {
|
||||||
if (!$this->loader->supports($this->options['resource'], $this->options['resource_type'])) {
|
if (!$this->loader->supports($this->options['resource'], $this->options['resource_type'])) {
|
||||||
throw new \LogicException(sprintf('Cannot load "%s" (%s)', $this->options['resource'], $this->options['resource_type']));
|
throw new \LogicException(sprintf('Cannot load "%s" (%s)', $this->options['resource'], $this->options['resource_type']));
|
||||||
@ -82,7 +84,7 @@ class WebServiceContext
|
|||||||
$cache->write($dumper->dump());
|
$cache->write($dumper->dump());
|
||||||
}
|
}
|
||||||
|
|
||||||
return (string) $cache;
|
return $cache->getPath();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getServiceBinder()
|
public function getServiceBinder()
|
||||||
@ -102,15 +104,14 @@ class WebServiceContext
|
|||||||
public function getServerBuilder()
|
public function getServerBuilder()
|
||||||
{
|
{
|
||||||
if (null === $this->serverBuilder) {
|
if (null === $this->serverBuilder) {
|
||||||
$this->serverBuilder = SoapServerBuilder::createWithDefaults()
|
$soapServerBuilder = new SoapServerBuilder();
|
||||||
->withWsdl($this->getWsdlFile())
|
$this->serverBuilder = $soapServerBuilder->build(
|
||||||
->withClassmap($this->getServiceDefinition()->getTypeRepository()->getClassmap())
|
SoapServerOptionsBuilder::createWithDefaults(),
|
||||||
->withTypeConverters($this->converters)
|
SoapOptionsBuilder::createWithClassMap(
|
||||||
;
|
$this->getWsdlFile(),
|
||||||
|
$this->getServiceDefinition()->getTypeRepository()->getClassmap()
|
||||||
if (null !== $this->options['cache_type']) {
|
)
|
||||||
$this->serverBuilder->withWsdlCache($this->options['cache_type']);
|
);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->serverBuilder;
|
return $this->serverBuilder;
|
||||||
|
@ -22,25 +22,24 @@
|
|||||||
"require": {
|
"require": {
|
||||||
"php": ">=5.3.0",
|
"php": ">=5.3.0",
|
||||||
"ext-soap": "*",
|
"ext-soap": "*",
|
||||||
"besimple/soap-common": "0.2.*",
|
"besimple/soap-common": "0.3.*",
|
||||||
"besimple/soap-wsdl": "0.2.*",
|
"besimple/soap-wsdl": "0.3.*",
|
||||||
"ass/xmlsecurity": "~1.0",
|
"ass/xmlsecurity": "~1.0",
|
||||||
"symfony/framework-bundle": "~2.0",
|
"symfony/framework-bundle": "~2.6",
|
||||||
"symfony/twig-bundle": "~2.0",
|
"symfony/twig-bundle": "~2.6",
|
||||||
"zendframework/zend-mime": "2.1.*"
|
"zendframework/zend-mime": "2.1.*"
|
||||||
},
|
},
|
||||||
"suggest": {
|
"suggest": {
|
||||||
"besimple/soap-client": "0.2.*",
|
"besimple/soap-client": "0.3.*",
|
||||||
"besimple/soap-server": "0.2.*"
|
"besimple/soap-server": "0.3.*"
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"psr-0": { "BeSimple\\SoapBundle": "" }
|
"psr-0": { "BeSimple\\SoapBundle": "" }
|
||||||
},
|
},
|
||||||
"target-dir": "BeSimple/SoapBundle",
|
"target-dir": "BeSimple/SoapBundle",
|
||||||
"minimum-stability": "dev",
|
|
||||||
"extra": {
|
"extra": {
|
||||||
"branch-alias": {
|
"branch-alias": {
|
||||||
"dev-master": "0.2-dev"
|
"dev-master": "0.3-dev"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,313 +0,0 @@
|
|||||||
<?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;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* cURL wrapper class for doing HTTP requests that uses the soap class options.
|
|
||||||
*
|
|
||||||
* @author Andreas Schamberger <mail@andreass.net>
|
|
||||||
*/
|
|
||||||
class Curl
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* HTTP User Agent.
|
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
const USER_AGENT = 'PHP-SOAP/\BeSimple\SoapClient';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Curl resource.
|
|
||||||
*
|
|
||||||
* @var resource
|
|
||||||
*/
|
|
||||||
private $ch;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Maximum number of location headers to follow.
|
|
||||||
*
|
|
||||||
* @var int
|
|
||||||
*/
|
|
||||||
private $followLocationMaxRedirects;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Request response data.
|
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
private $response;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor.
|
|
||||||
*
|
|
||||||
* @param array $options Options array from SoapClient constructor
|
|
||||||
* @param int $followLocationMaxRedirects Redirection limit for Location header
|
|
||||||
*/
|
|
||||||
public function __construct(array $options = array(), $followLocationMaxRedirects = 10)
|
|
||||||
{
|
|
||||||
// set the default HTTP user agent
|
|
||||||
if (!isset($options['user_agent'])) {
|
|
||||||
$options['user_agent'] = self::USER_AGENT;
|
|
||||||
}
|
|
||||||
$this->followLocationMaxRedirects = $followLocationMaxRedirects;
|
|
||||||
|
|
||||||
// make http request
|
|
||||||
$this->ch = curl_init();
|
|
||||||
$curlOptions = array(
|
|
||||||
CURLOPT_ENCODING => '',
|
|
||||||
CURLOPT_SSL_VERIFYPEER => false,
|
|
||||||
CURLOPT_FAILONERROR => false,
|
|
||||||
CURLOPT_RETURNTRANSFER => true,
|
|
||||||
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
|
|
||||||
CURLOPT_HEADER => true,
|
|
||||||
CURLOPT_USERAGENT => $options['user_agent'],
|
|
||||||
CURLINFO_HEADER_OUT => true,
|
|
||||||
);
|
|
||||||
curl_setopt_array($this->ch, $curlOptions);
|
|
||||||
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']);
|
|
||||||
}
|
|
||||||
if (isset($options['proxy_host'])) {
|
|
||||||
$port = isset($options['proxy_port']) ? $options['proxy_port'] : 8080;
|
|
||||||
curl_setopt($this->ch, CURLOPT_PROXY, $options['proxy_host'] . ':' . $port);
|
|
||||||
}
|
|
||||||
if (isset($options['proxy_user'])) {
|
|
||||||
curl_setopt($this->ch, CURLOPT_PROXYUSERPWD, $options['proxy_user'] . ':' . $options['proxy_password']);
|
|
||||||
}
|
|
||||||
if (isset($options['login'])) {
|
|
||||||
curl_setopt($this->ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
|
|
||||||
curl_setopt($this->ch, CURLOPT_USERPWD, $options['login'].':'.$options['password']);
|
|
||||||
}
|
|
||||||
if (isset($options['local_cert'])) {
|
|
||||||
curl_setopt($this->ch, CURLOPT_SSLCERT, $options['local_cert']);
|
|
||||||
curl_setopt($this->ch, CURLOPT_SSLCERTPASSWD, $options['passphrase']);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Destructor.
|
|
||||||
*/
|
|
||||||
public function __destruct()
|
|
||||||
{
|
|
||||||
curl_close($this->ch);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Execute HTTP request.
|
|
||||||
* Returns true if request was successfull.
|
|
||||||
*
|
|
||||||
* @param string $location HTTP location
|
|
||||||
* @param string $request Request body
|
|
||||||
* @param array $requestHeaders Request header strings
|
|
||||||
*
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
public function exec($location, $request = null, $requestHeaders = array())
|
|
||||||
{
|
|
||||||
curl_setopt($this->ch, CURLOPT_URL, $location);
|
|
||||||
|
|
||||||
if (!is_null($request)) {
|
|
||||||
curl_setopt($this->ch, CURLOPT_POST, true);
|
|
||||||
curl_setopt($this->ch, CURLOPT_POSTFIELDS, $request);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (count($requestHeaders) > 0) {
|
|
||||||
curl_setopt($this->ch, CURLOPT_HTTPHEADER, $requestHeaders);
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->response = $this->execManualRedirect();
|
|
||||||
|
|
||||||
return ($this->response === false) ? false : true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Custom curl_exec wrapper that allows to follow redirects when specific
|
|
||||||
* http response code is set. SOAP only allows 307.
|
|
||||||
*
|
|
||||||
* @param int $redirects Current redirection count
|
|
||||||
*
|
|
||||||
* @return mixed
|
|
||||||
*/
|
|
||||||
private function execManualRedirect($redirects = 0)
|
|
||||||
{
|
|
||||||
if ($redirects > $this->followLocationMaxRedirects) {
|
|
||||||
|
|
||||||
// TODO Redirection limit reached, aborting
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
curl_setopt($this->ch, CURLOPT_HEADER, true);
|
|
||||||
curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, true);
|
|
||||||
$response = curl_exec($this->ch);
|
|
||||||
$httpResponseCode = curl_getinfo($this->ch, CURLINFO_HTTP_CODE);
|
|
||||||
if ($httpResponseCode == 307) {
|
|
||||||
$headerSize = curl_getinfo($this->ch, CURLINFO_HEADER_SIZE);
|
|
||||||
$header = substr($response, 0, $headerSize);
|
|
||||||
$matches = array();
|
|
||||||
preg_match('/Location:(.*?)\n/', $header, $matches);
|
|
||||||
$url = trim(array_pop($matches));
|
|
||||||
// @parse_url to suppress E_WARNING for invalid urls
|
|
||||||
if (($url = @parse_url($url)) !== false) {
|
|
||||||
$lastUrl = parse_url(curl_getinfo($this->ch, CURLINFO_EFFECTIVE_URL));
|
|
||||||
if (!isset($url['scheme'])) {
|
|
||||||
$url['scheme'] = $lastUrl['scheme'];
|
|
||||||
}
|
|
||||||
if (!isset($url['host'])) {
|
|
||||||
$url['host'] = $lastUrl['host'];
|
|
||||||
}
|
|
||||||
if (!isset($url['path'])) {
|
|
||||||
$url['path'] = $lastUrl['path'];
|
|
||||||
}
|
|
||||||
$newUrl = $url['scheme'] . '://' . $url['host'] . $url['path'] . ($url['query'] ? '?' . $url['query'] : '');
|
|
||||||
curl_setopt($this->ch, CURLOPT_URL, $newUrl);
|
|
||||||
|
|
||||||
return $this->execManualRedirect($redirects++);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $response;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Error code mapping from cURL error codes to PHP ext/soap error messages
|
|
||||||
* (where applicable)
|
|
||||||
*
|
|
||||||
* http://curl.haxx.se/libcurl/c/libcurl-errors.html
|
|
||||||
*
|
|
||||||
* @return array(int=>string)
|
|
||||||
*/
|
|
||||||
protected function getErrorCodeMapping()
|
|
||||||
{
|
|
||||||
return array(
|
|
||||||
1 => 'Unknown protocol. Only http and https are allowed.', //CURLE_UNSUPPORTED_PROTOCOL
|
|
||||||
3 => 'Unable to parse URL', //CURLE_URL_MALFORMAT
|
|
||||||
5 => 'Could not connect to host', //CURLE_COULDNT_RESOLVE_PROXY
|
|
||||||
6 => 'Could not connect to host', //CURLE_COULDNT_RESOLVE_HOST
|
|
||||||
7 => 'Could not connect to host', //CURLE_COULDNT_CONNECT
|
|
||||||
9 => 'Could not connect to host', //CURLE_REMOTE_ACCESS_DENIED
|
|
||||||
28 => 'Failed Sending HTTP SOAP request', //CURLE_OPERATION_TIMEDOUT
|
|
||||||
35 => 'Could not connect to host', //CURLE_SSL_CONNECT_ERROR
|
|
||||||
41 => 'Can\'t uncompress compressed response', //CURLE_FUNCTION_NOT_FOUND
|
|
||||||
51 => 'Could not connect to host', //CURLE_PEER_FAILED_VERIFICATION
|
|
||||||
52 => 'Error Fetching http body, No Content-Length, connection closed or chunked data', //CURLE_GOT_NOTHING
|
|
||||||
53 => 'SSL support is not available in this build', //CURLE_SSL_ENGINE_NOTFOUND
|
|
||||||
54 => 'SSL support is not available in this build', //CURLE_SSL_ENGINE_SETFAILED
|
|
||||||
55 => 'Failed Sending HTTP SOAP request', //CURLE_SEND_ERROR
|
|
||||||
56 => 'Error Fetching http body, No Content-Length, connection closed or chunked data', //CURLE_RECV_ERROR
|
|
||||||
58 => 'Could not connect to host', //CURLE_SSL_CERTPROBLEM
|
|
||||||
59 => 'Could not connect to host', //CURLE_SSL_CIPHER
|
|
||||||
60 => 'Could not connect to host', //CURLE_SSL_CACERT
|
|
||||||
61 => 'Unknown Content-Encoding', //CURLE_BAD_CONTENT_ENCODING
|
|
||||||
65 => 'Failed Sending HTTP SOAP request', //CURLE_SEND_FAIL_REWIND
|
|
||||||
66 => 'SSL support is not available in this build', //CURLE_SSL_ENGINE_INITFAILED
|
|
||||||
67 => 'Could not connect to host', //CURLE_LOGIN_DENIED
|
|
||||||
77 => 'Could not connect to host', //CURLE_SSL_CACERT_BADFILE
|
|
||||||
80 => 'Error Fetching http body, No Content-Length, connection closed or chunked data', //CURLE_SSL_SHUTDOWN_FAILED
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the curl error message.
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getErrorMessage()
|
|
||||||
{
|
|
||||||
$errorCodeMapping = $this->getErrorCodeMapping();
|
|
||||||
$errorNumber = curl_errno($this->ch);
|
|
||||||
if (isset($errorCodeMapping[$errorNumber])) {
|
|
||||||
|
|
||||||
return $errorCodeMapping[$errorNumber];
|
|
||||||
}
|
|
||||||
|
|
||||||
return curl_error($this->ch);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the request headers as a string.
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getRequestHeaders()
|
|
||||||
{
|
|
||||||
return curl_getinfo($this->ch, CURLINFO_HEADER_OUT);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the whole response (including headers) as a string.
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getResponse()
|
|
||||||
{
|
|
||||||
return $this->response;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the response body as a string.
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getResponseBody()
|
|
||||||
{
|
|
||||||
$headerSize = curl_getinfo($this->ch, CURLINFO_HEADER_SIZE);
|
|
||||||
|
|
||||||
return substr($this->response, $headerSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the response content type.
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getResponseContentType()
|
|
||||||
{
|
|
||||||
return curl_getinfo($this->ch, CURLINFO_CONTENT_TYPE);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the response headers as a string.
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getResponseHeaders()
|
|
||||||
{
|
|
||||||
$headerSize = curl_getinfo($this->ch, CURLINFO_HEADER_SIZE);
|
|
||||||
|
|
||||||
return substr($this->response, 0, $headerSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the response http status code.
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getResponseStatusCode()
|
|
||||||
{
|
|
||||||
return curl_getinfo($this->ch, CURLINFO_HTTP_CODE);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the response http status message.
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getResponseStatusMessage()
|
|
||||||
{
|
|
||||||
preg_match('/HTTP\/(1\.[0-1]+) ([0-9]{3}) (.*)/', $this->response, $matches);
|
|
||||||
|
|
||||||
return trim(array_pop($matches));
|
|
||||||
}
|
|
||||||
}
|
|
247
src/BeSimple/SoapClient/Curl/Curl.php
Normal file
247
src/BeSimple/SoapClient/Curl/Curl.php
Normal file
@ -0,0 +1,247 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace BeSimple\SoapClient\Curl;
|
||||||
|
|
||||||
|
use BeSimple\SoapClient\Curl\Http\HttpAuthenticationBasicOptions;
|
||||||
|
use BeSimple\SoapClient\Curl\Http\HttpAuthenticationDigestOptions;
|
||||||
|
use BeSimple\SoapClient\Curl\Http\SslCertificateOptions;
|
||||||
|
use Exception;
|
||||||
|
|
||||||
|
class Curl
|
||||||
|
{
|
||||||
|
const CURL_SUCCESS = true;
|
||||||
|
const CURL_FAILED = false;
|
||||||
|
|
||||||
|
private $curlSession;
|
||||||
|
private $options;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param CurlOptions $options
|
||||||
|
*/
|
||||||
|
public function __construct(CurlOptions $options)
|
||||||
|
{
|
||||||
|
$this->curlSession = $this->acquireNewCurlSession($options);
|
||||||
|
$this->options = $options;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function __destruct()
|
||||||
|
{
|
||||||
|
$this->closeCurlSession($this->curlSession);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $location HTTP location
|
||||||
|
* @param string $request Request body
|
||||||
|
* @param array $requestHeaders Request header strings
|
||||||
|
* @return CurlResponse
|
||||||
|
*/
|
||||||
|
public function executeCurlWithCachedSession($location, $request = null, $requestHeaders = [])
|
||||||
|
{
|
||||||
|
return $this->executeCurlSession($this->curlSession, $this->options, $location, $request, $requestHeaders);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param CurlOptions $options
|
||||||
|
* @param string $location HTTP location
|
||||||
|
* @param string $request Request body
|
||||||
|
* @param array $requestHeaders Request header strings
|
||||||
|
* @return CurlResponse
|
||||||
|
*/
|
||||||
|
public function executeCurl(CurlOptions $options, $location, $request = null, $requestHeaders = [])
|
||||||
|
{
|
||||||
|
$curlSession = $this->acquireNewCurlSession($options);
|
||||||
|
$curlResponse = $this->executeCurlSession($curlSession, $options, $location, $request, $requestHeaders);
|
||||||
|
$this->closeCurlSession($curlSession);
|
||||||
|
|
||||||
|
return $curlResponse;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function acquireNewCurlSession(CurlOptions $options)
|
||||||
|
{
|
||||||
|
$curlSession = curl_init();
|
||||||
|
curl_setopt_array($curlSession, [
|
||||||
|
CURLOPT_ENCODING => '',
|
||||||
|
CURLOPT_SSL_VERIFYPEER => false,
|
||||||
|
CURLOPT_FAILONERROR => false,
|
||||||
|
CURLOPT_RETURNTRANSFER => true,
|
||||||
|
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
|
||||||
|
CURLOPT_HEADER => true,
|
||||||
|
CURLOPT_USERAGENT => $options->getUserAgent(),
|
||||||
|
CURLINFO_HEADER_OUT => true,
|
||||||
|
CURLOPT_CONNECTTIMEOUT => $options->getConnectionTimeout()
|
||||||
|
]);
|
||||||
|
|
||||||
|
return $curlSession;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function closeCurlSession($curlSession)
|
||||||
|
{
|
||||||
|
curl_close($curlSession);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param mixed $curlSession Result of curl_init() handle
|
||||||
|
* @param CurlOptions $options
|
||||||
|
* @param string $location HTTP location
|
||||||
|
* @param string $request Request body
|
||||||
|
* @param array $requestHeaders Request header strings
|
||||||
|
* @return CurlResponse
|
||||||
|
*/
|
||||||
|
private function executeCurlSession($curlSession, CurlOptions $options, $location, $request = null, $requestHeaders = [])
|
||||||
|
{
|
||||||
|
curl_setopt($curlSession, CURLOPT_URL, $location);
|
||||||
|
curl_setopt($curlSession, CURLOPT_HEADER, true);
|
||||||
|
curl_setopt($curlSession, CURLOPT_RETURNTRANSFER, true);
|
||||||
|
if ($request !== null) {
|
||||||
|
curl_setopt($curlSession, CURLOPT_POST, true);
|
||||||
|
curl_setopt($curlSession, CURLOPT_POSTFIELDS, $request);
|
||||||
|
} else {
|
||||||
|
curl_setopt($curlSession, CURLOPT_POST, false);
|
||||||
|
}
|
||||||
|
if (count($requestHeaders) > 0) {
|
||||||
|
curl_setopt($curlSession, CURLOPT_HTTPHEADER, $requestHeaders);
|
||||||
|
}
|
||||||
|
if (!$options->getSoapCompression() & SOAP_COMPRESSION_ACCEPT) {
|
||||||
|
curl_setopt($curlSession, CURLOPT_ENCODING, 'identity');
|
||||||
|
}
|
||||||
|
if ($options->hasProxy()) {
|
||||||
|
$proxyHost = $options->getProxy()->getHost() . $options->getProxy()->getPort();
|
||||||
|
curl_setopt($curlSession, CURLOPT_PROXY, $proxyHost);
|
||||||
|
if ($options->getProxy()->hasCredentials()) {
|
||||||
|
curl_setopt($curlSession, CURLOPT_PROXYUSERPWD, $options->getProxy()->getLogin() . ':' . $options->getProxy()->getPassword());
|
||||||
|
if ($options->getProxy()->hasAuthenticationType()) {
|
||||||
|
curl_setopt($curlSession, CURLOPT_PROXYAUTH, $options->getProxy()->getAuthenticationType());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($options->hasHttpAuthentication()) {
|
||||||
|
if ($options->hasHttpAuthenticationBasic()) {
|
||||||
|
/** @var HttpAuthenticationBasicOptions $httpAuthenticationBasic */
|
||||||
|
$httpAuthenticationBasic = $options->getHttpAuthentication();
|
||||||
|
curl_setopt($curlSession, CURLOPT_HTTPAUTH, $httpAuthenticationBasic->getAuthenticationType());
|
||||||
|
curl_setopt($curlSession, CURLOPT_USERPWD, $httpAuthenticationBasic->getUsername() . ':' . $httpAuthenticationBasic->getPassword());
|
||||||
|
} elseif ($options->hasHttpAuthenticationDigest()) {
|
||||||
|
/** @var HttpAuthenticationDigestOptions $httpAuthenticationDigest */
|
||||||
|
$httpAuthenticationDigest = $options->getHttpAuthentication();
|
||||||
|
curl_setopt($curlSession, CURLOPT_HTTPAUTH, $httpAuthenticationDigest->getAuthenticationType());
|
||||||
|
} else {
|
||||||
|
throw new Exception('Unresolved authentication type: '.get_class($options->getHttpAuthentication()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($options->hasSslCertificateOptions()) {
|
||||||
|
$sslCertificateOptions = $options->getSslCertificateOptions();
|
||||||
|
curl_setopt($curlSession, CURLOPT_SSLCERT, $sslCertificateOptions->getCertificateLocalPath());
|
||||||
|
if ($sslCertificateOptions->hasCertificatePassPhrase()) {
|
||||||
|
curl_setopt($curlSession, CURLOPT_SSLCERTPASSWD, $sslCertificateOptions->getCertificatePassPhrase());
|
||||||
|
}
|
||||||
|
if ($sslCertificateOptions->hasCertificateAuthorityInfo()) {
|
||||||
|
curl_setopt($curlSession, CURLOPT_CAINFO, $sslCertificateOptions->getCertificateAuthorityInfo());
|
||||||
|
}
|
||||||
|
if ($sslCertificateOptions->hasCertificateAuthorityPath()) {
|
||||||
|
curl_setopt($curlSession, CURLOPT_CAPATH, $sslCertificateOptions->hasCertificateAuthorityPath());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$executeSoapCallResponse = $this->executeHttpCall($curlSession, $options);
|
||||||
|
|
||||||
|
$httpRequestHeadersAsString = curl_getinfo($curlSession, CURLINFO_HEADER_OUT);
|
||||||
|
$headerSize = curl_getinfo($curlSession, CURLINFO_HEADER_SIZE);
|
||||||
|
$httpResponseCode = curl_getinfo($curlSession, CURLINFO_HTTP_CODE);
|
||||||
|
$httpResponseContentType = curl_getinfo($curlSession, CURLINFO_CONTENT_TYPE);;
|
||||||
|
$responseBody = substr($executeSoapCallResponse, $headerSize);
|
||||||
|
$responseHeaders = substr($executeSoapCallResponse, 0, $headerSize);
|
||||||
|
preg_match('/HTTP\/(1\.[0-1]+) ([0-9]{3}) (.*)/', $executeSoapCallResponse, $httpResponseMessages);
|
||||||
|
$httpResponseMessage = trim(array_pop($httpResponseMessages));
|
||||||
|
$curlErrorMessage = sprintf(
|
||||||
|
'Curl error "%s" with message: %s occurred while connecting to %s with HTTP response code %s',
|
||||||
|
curl_errno($curlSession),
|
||||||
|
curl_error($curlSession),
|
||||||
|
$location,
|
||||||
|
$httpResponseCode
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!is_integer($httpResponseCode) || $httpResponseCode >= 400 || $httpResponseCode === 0) {
|
||||||
|
|
||||||
|
return new CurlResponse(
|
||||||
|
$this->normalizeStringOrFalse($httpRequestHeadersAsString),
|
||||||
|
$httpResponseCode,
|
||||||
|
$httpResponseMessage,
|
||||||
|
$httpResponseContentType,
|
||||||
|
self::CURL_FAILED,
|
||||||
|
$this->normalizeStringOrFalse($responseHeaders),
|
||||||
|
$this->normalizeStringOrFalse($responseBody),
|
||||||
|
$curlErrorMessage
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new CurlResponse(
|
||||||
|
$this->normalizeStringOrFalse($httpRequestHeadersAsString),
|
||||||
|
$httpResponseCode,
|
||||||
|
$httpResponseMessage,
|
||||||
|
$httpResponseContentType,
|
||||||
|
self::CURL_SUCCESS,
|
||||||
|
$this->normalizeStringOrFalse($responseHeaders),
|
||||||
|
$this->normalizeStringOrFalse($responseBody)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Custom curl_exec wrapper that allows to follow redirects when specific
|
||||||
|
* http response code is set. SOAP only allows 307.
|
||||||
|
*
|
||||||
|
* @param mixed $curlSession Result of curl_init() handle
|
||||||
|
* @param CurlOptions $options
|
||||||
|
* @param int $executedRedirects
|
||||||
|
* @return string|null
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
private function executeHttpCall($curlSession, CurlOptions $options, $executedRedirects = 0)
|
||||||
|
{
|
||||||
|
if ($executedRedirects > $options->getFollowLocationMaxRedirects()) {
|
||||||
|
throw new Exception('Cannot executeHttpCall - too many redirects: ' . $executedRedirects);
|
||||||
|
}
|
||||||
|
$curlExecResponse = curl_exec($curlSession);
|
||||||
|
$httpResponseCode = curl_getinfo($curlSession, CURLINFO_HTTP_CODE);
|
||||||
|
if ($httpResponseCode === 307) {
|
||||||
|
$newUrl = $this->getRedirectUrlFromResponseHeaders($curlSession, $curlExecResponse);
|
||||||
|
curl_setopt($curlSession, CURLOPT_URL, $newUrl);
|
||||||
|
|
||||||
|
return $this->executeHttpCall($curlSession, $options, ++$executedRedirects);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $curlExecResponse;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getRedirectUrlFromResponseHeaders($curlSession, $curlExecResponse)
|
||||||
|
{
|
||||||
|
$curlExecResponseHeaders = substr($curlExecResponse, 0, curl_getinfo($curlSession, CURLINFO_HEADER_SIZE));
|
||||||
|
$matches = [];
|
||||||
|
preg_match('/Location:(.*?)\n/', $curlExecResponseHeaders, $matches);
|
||||||
|
$url = trim(array_pop($matches));
|
||||||
|
|
||||||
|
if (($url = @parse_url($url)) !== false) {
|
||||||
|
$lastUrl = parse_url(curl_getinfo($curlSession, CURLINFO_EFFECTIVE_URL));
|
||||||
|
if (!isset($url['scheme'])) {
|
||||||
|
$url['scheme'] = $lastUrl['scheme'];
|
||||||
|
}
|
||||||
|
if (!isset($url['host'])) {
|
||||||
|
$url['host'] = $lastUrl['host'];
|
||||||
|
}
|
||||||
|
if (!isset($url['path'])) {
|
||||||
|
$url['path'] = $lastUrl['path'];
|
||||||
|
}
|
||||||
|
|
||||||
|
return $url['scheme'] . '://' . $url['host'] . $url['path'] . ($url['query'] ? '?' . $url['query'] : '');
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new Exception('Cannot parse WSDL url redirect: ' . $url);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function normalizeStringOrFalse($string)
|
||||||
|
{
|
||||||
|
if ($string === false || $string === '') {
|
||||||
|
$string = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $string;
|
||||||
|
}
|
||||||
|
}
|
126
src/BeSimple/SoapClient/Curl/CurlOptions.php
Normal file
126
src/BeSimple/SoapClient/Curl/CurlOptions.php
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace BeSimple\SoapClient\Curl;
|
||||||
|
|
||||||
|
use BeSimple\SoapClient\Curl\Http\HttpAuthenticationDigestOptions;
|
||||||
|
use BeSimple\SoapClient\Curl\Http\HttpAuthenticationInterface;
|
||||||
|
use BeSimple\SoapClient\Curl\Http\HttpAuthenticationBasicOptions;
|
||||||
|
use BeSimple\SoapClient\Curl\Http\SslCertificateOptions;
|
||||||
|
use BeSimple\SoapClient\SoapServerProxy\SoapServerProxy;
|
||||||
|
|
||||||
|
class CurlOptions
|
||||||
|
{
|
||||||
|
const DEFAULT_USER_AGENT = 'PhpBeSimpleSoap';
|
||||||
|
const SOAP_COMPRESSION_NONE = null;
|
||||||
|
const SOAP_COMPRESSION_GZIP = SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP;
|
||||||
|
const SOAP_COMPRESSION_DEFLATE = SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_DEFLATE;
|
||||||
|
|
||||||
|
private $userAgent;
|
||||||
|
private $followLocationMaxRedirects;
|
||||||
|
private $soapCompression;
|
||||||
|
private $connectionTimeout;
|
||||||
|
private $proxy;
|
||||||
|
private $httpAuthentication;
|
||||||
|
private $sslCertificateOptions;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $userAgent
|
||||||
|
* @param int $followLocationMaxRedirects
|
||||||
|
* @param CurlOptions::SOAP_COMPRESSION_NONE|CurlOptions::SOAP_COMPRESSION_GZIP|CurlOptions::SOAP_COMPRESSION_DEFLATE $soapCompression
|
||||||
|
* @param int $connectionTimeout
|
||||||
|
* @param SoapServerProxy|null $proxy
|
||||||
|
* @param HttpAuthenticationInterface|null $httpAuthentication
|
||||||
|
* @param SslCertificateOptions|null $sslCertificateOptions
|
||||||
|
*/
|
||||||
|
public function __construct(
|
||||||
|
$userAgent,
|
||||||
|
$followLocationMaxRedirects,
|
||||||
|
$soapCompression,
|
||||||
|
$connectionTimeout,
|
||||||
|
SoapServerProxy $proxy = null,
|
||||||
|
HttpAuthenticationInterface $httpAuthentication = null,
|
||||||
|
SslCertificateOptions $sslCertificateOptions = null
|
||||||
|
) {
|
||||||
|
$this->userAgent = $userAgent;
|
||||||
|
$this->followLocationMaxRedirects = $followLocationMaxRedirects;
|
||||||
|
$this->soapCompression = $soapCompression;
|
||||||
|
$this->connectionTimeout = $connectionTimeout;
|
||||||
|
$this->proxy = $proxy;
|
||||||
|
$this->httpAuthentication = $httpAuthentication;
|
||||||
|
$this->sslCertificateOptions = $sslCertificateOptions;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getUserAgent()
|
||||||
|
{
|
||||||
|
return $this->userAgent;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getFollowLocationMaxRedirects()
|
||||||
|
{
|
||||||
|
return $this->followLocationMaxRedirects;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getSoapCompression()
|
||||||
|
{
|
||||||
|
return $this->soapCompression;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getConnectionTimeout()
|
||||||
|
{
|
||||||
|
return $this->connectionTimeout;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getProxy()
|
||||||
|
{
|
||||||
|
return $this->proxy;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getHttpAuthentication()
|
||||||
|
{
|
||||||
|
return $this->httpAuthentication;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getSslCertificateOptions()
|
||||||
|
{
|
||||||
|
return $this->sslCertificateOptions;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function hasProxy()
|
||||||
|
{
|
||||||
|
return $this->proxy !== null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function hasHttpAuthentication()
|
||||||
|
{
|
||||||
|
return $this->httpAuthentication !== null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function hasSslCertificateOptions()
|
||||||
|
{
|
||||||
|
return $this->sslCertificateOptions !== null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function hasHttpAuthenticationBasic()
|
||||||
|
{
|
||||||
|
if ($this->hasHttpAuthentication()) {
|
||||||
|
if ($this->getHttpAuthentication() instanceof HttpAuthenticationBasicOptions) {
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function hasHttpAuthenticationDigest()
|
||||||
|
{
|
||||||
|
if ($this->hasHttpAuthentication()) {
|
||||||
|
if ($this->getHttpAuthentication() instanceof HttpAuthenticationDigestOptions) {
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
80
src/BeSimple/SoapClient/Curl/CurlOptionsBuilder.php
Normal file
80
src/BeSimple/SoapClient/Curl/CurlOptionsBuilder.php
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace BeSimple\SoapClient\Curl;
|
||||||
|
|
||||||
|
use BeSimple\SoapClient\Curl\Http\HttpAuthenticationDigestOptions;
|
||||||
|
use BeSimple\SoapClient\Curl\Http\SslCertificateOptions;
|
||||||
|
use BeSimple\SoapClient\SoapOptions\SoapClientOptions;
|
||||||
|
use BeSimple\SoapClient\SoapServerAuthentication\SoapServerAuthenticationBasic;
|
||||||
|
use BeSimple\SoapClient\SoapServerAuthentication\SoapServerAuthenticationDigest;
|
||||||
|
use BeSimple\SoapClient\Curl\Http\HttpAuthenticationBasicOptions;
|
||||||
|
use Exception;
|
||||||
|
|
||||||
|
class CurlOptionsBuilder
|
||||||
|
{
|
||||||
|
const DEFAULT_MAX_REDIRECTS = 10;
|
||||||
|
const DEFAULT_CONNECTION_TIMEOUT = 120;
|
||||||
|
|
||||||
|
public static function buildDefault()
|
||||||
|
{
|
||||||
|
return new CurlOptions(
|
||||||
|
CurlOptions::DEFAULT_USER_AGENT,
|
||||||
|
self::DEFAULT_MAX_REDIRECTS,
|
||||||
|
CurlOptions::SOAP_COMPRESSION_NONE,
|
||||||
|
self::DEFAULT_CONNECTION_TIMEOUT
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function buildForSoapClient(SoapClientOptions $soapClientOptions)
|
||||||
|
{
|
||||||
|
return new CurlOptions(
|
||||||
|
$soapClientOptions->getUserAgent(),
|
||||||
|
self::DEFAULT_MAX_REDIRECTS,
|
||||||
|
$soapClientOptions->getCompression(),
|
||||||
|
self::DEFAULT_CONNECTION_TIMEOUT,
|
||||||
|
$soapClientOptions->getProxy(),
|
||||||
|
self::getHttpAuthOptions($soapClientOptions),
|
||||||
|
self::getSslCertificateOptions($soapClientOptions)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static function getHttpAuthOptions(SoapClientOptions $soapClientOptions)
|
||||||
|
{
|
||||||
|
if ($soapClientOptions->hasAuthentication()) {
|
||||||
|
if ($soapClientOptions->hasAuthenticationBasic()) {
|
||||||
|
/** @var SoapServerAuthenticationBasic $basicAuthentication */
|
||||||
|
$basicAuthentication = $soapClientOptions->getAuthentication();
|
||||||
|
|
||||||
|
return new HttpAuthenticationBasicOptions(
|
||||||
|
$basicAuthentication->getLogin(),
|
||||||
|
$basicAuthentication->getPassword()
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
||||||
|
if ($soapClientOptions->hasAuthenticationDigest()) {
|
||||||
|
|
||||||
|
return new HttpAuthenticationDigestOptions();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new Exception('Unresolved authentication type: '.get_class($soapClientOptions->getAuthentication()));
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static function getSslCertificateOptions(SoapClientOptions $soapClientOptions)
|
||||||
|
{
|
||||||
|
if ($soapClientOptions->hasAuthenticationDigest()) {
|
||||||
|
/** @var SoapServerAuthenticationDigest $digestAuthentication */
|
||||||
|
$digestAuthentication = $soapClientOptions->getAuthentication();
|
||||||
|
|
||||||
|
return new SslCertificateOptions(
|
||||||
|
$digestAuthentication->getLocalCert(),
|
||||||
|
$digestAuthentication->getPassPhrase()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
90
src/BeSimple/SoapClient/Curl/CurlResponse.php
Normal file
90
src/BeSimple/SoapClient/Curl/CurlResponse.php
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace BeSimple\SoapClient\Curl;
|
||||||
|
|
||||||
|
class CurlResponse
|
||||||
|
{
|
||||||
|
private $httpRequestHeaders;
|
||||||
|
private $httpResponseStatusCode;
|
||||||
|
private $httpResponseStatusMessage;
|
||||||
|
private $httpResponseContentType;
|
||||||
|
private $curlStatus;
|
||||||
|
private $curlErrorMessage;
|
||||||
|
private $responseHeader;
|
||||||
|
private $responseBody;
|
||||||
|
|
||||||
|
public function __construct(
|
||||||
|
$httpRequestHeaders,
|
||||||
|
$httpResponseStatusCode,
|
||||||
|
$httpResponseStatusMessage,
|
||||||
|
$httpResponseContentType,
|
||||||
|
$curlStatus,
|
||||||
|
$responseHeader,
|
||||||
|
$responseBody,
|
||||||
|
$curlErrorMessage = null
|
||||||
|
) {
|
||||||
|
$this->httpRequestHeaders = $httpRequestHeaders;
|
||||||
|
$this->httpResponseStatusCode = $httpResponseStatusCode;
|
||||||
|
$this->httpResponseStatusMessage = $httpResponseStatusMessage;
|
||||||
|
$this->httpResponseContentType = $httpResponseContentType;
|
||||||
|
$this->curlStatus = $curlStatus;
|
||||||
|
$this->curlErrorMessage = $curlErrorMessage;
|
||||||
|
$this->responseHeader = $responseHeader;
|
||||||
|
$this->responseBody = $responseBody;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getHttpRequestHeaders()
|
||||||
|
{
|
||||||
|
return $this->httpRequestHeaders;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getHttpResponseStatusCode()
|
||||||
|
{
|
||||||
|
return $this->httpResponseStatusCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getHttpResponseStatusMessage()
|
||||||
|
{
|
||||||
|
return $this->httpResponseStatusMessage;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getHttpResponseContentType()
|
||||||
|
{
|
||||||
|
return $this->httpResponseContentType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getCurlStatus()
|
||||||
|
{
|
||||||
|
return $this->curlStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function curlStatusSuccess()
|
||||||
|
{
|
||||||
|
return $this->curlStatus === Curl::CURL_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function curlStatusFailed()
|
||||||
|
{
|
||||||
|
return $this->curlStatus === Curl::CURL_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function hasCurlErrorMessage()
|
||||||
|
{
|
||||||
|
return $this->curlErrorMessage !== null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getCurlErrorMessage()
|
||||||
|
{
|
||||||
|
return $this->curlErrorMessage;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getResponseHeader()
|
||||||
|
{
|
||||||
|
return $this->responseHeader;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getResponseBody()
|
||||||
|
{
|
||||||
|
return $this->responseBody;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,34 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace BeSimple\SoapClient\Curl\Http;
|
||||||
|
|
||||||
|
class HttpAuthenticationBasicOptions implements HttpAuthenticationInterface
|
||||||
|
{
|
||||||
|
private $username;
|
||||||
|
private $password;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $username
|
||||||
|
* @param string $password
|
||||||
|
*/
|
||||||
|
public function __construct($username, $password)
|
||||||
|
{
|
||||||
|
$this->username = $username;
|
||||||
|
$this->password = $password;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getUsername()
|
||||||
|
{
|
||||||
|
return $this->username;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getPassword()
|
||||||
|
{
|
||||||
|
return $this->password;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getAuthenticationType()
|
||||||
|
{
|
||||||
|
return HttpAuthenticationInterface::AUTHENTICATION_TYPE_BASIC;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,11 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace BeSimple\SoapClient\Curl\Http;
|
||||||
|
|
||||||
|
class HttpAuthenticationDigestOptions implements HttpAuthenticationInterface
|
||||||
|
{
|
||||||
|
public function getAuthenticationType()
|
||||||
|
{
|
||||||
|
return HttpAuthenticationInterface::AUTHENTICATION_TYPE_DIGEST;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,15 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace BeSimple\SoapClient\Curl\Http;
|
||||||
|
|
||||||
|
interface HttpAuthenticationInterface
|
||||||
|
{
|
||||||
|
const AUTHENTICATION_TYPE_ANY = CURLAUTH_ANY;
|
||||||
|
const AUTHENTICATION_TYPE_BASIC = CURLAUTH_BASIC;
|
||||||
|
const AUTHENTICATION_TYPE_DIGEST = CURLAUTH_DIGEST;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string choice from self::AUTHENTICATION_TYPE_ANY|self::AUTHENTICATION_TYPE_BASIC|self::AUTHENTICATION_TYPE_DIGEST
|
||||||
|
*/
|
||||||
|
public function getAuthenticationType();
|
||||||
|
}
|
64
src/BeSimple/SoapClient/Curl/Http/SslCertificateOptions.php
Normal file
64
src/BeSimple/SoapClient/Curl/Http/SslCertificateOptions.php
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace BeSimple\SoapClient\Curl\Http;
|
||||||
|
|
||||||
|
class SslCertificateOptions
|
||||||
|
{
|
||||||
|
private $certificateLocalPath;
|
||||||
|
private $certificatePassPhrase;
|
||||||
|
private $certificateAuthorityInfo;
|
||||||
|
private $certificateAuthorityPath;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $certificateLocalPath
|
||||||
|
* @param string $certificatePassPhrase
|
||||||
|
* @param string $certificateAuthorityInfo
|
||||||
|
* @param string $certificateAuthorityPath
|
||||||
|
*/
|
||||||
|
public function __construct(
|
||||||
|
$certificateLocalPath,
|
||||||
|
$certificatePassPhrase = null,
|
||||||
|
$certificateAuthorityInfo = null,
|
||||||
|
$certificateAuthorityPath = null
|
||||||
|
) {
|
||||||
|
$this->certificateLocalPath = $certificateLocalPath;
|
||||||
|
$this->certificatePassPhrase = $certificatePassPhrase;
|
||||||
|
$this->certificateAuthorityInfo = $certificateAuthorityInfo;
|
||||||
|
$this->certificateAuthorityPath = $certificateAuthorityPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getCertificateLocalPath()
|
||||||
|
{
|
||||||
|
return $this->certificateLocalPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getCertificatePassPhrase()
|
||||||
|
{
|
||||||
|
return $this->certificatePassPhrase;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getCertificateAuthorityInfo()
|
||||||
|
{
|
||||||
|
return $this->certificateAuthorityInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getCertificateAuthorityPath()
|
||||||
|
{
|
||||||
|
return $this->certificateAuthorityPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function hasCertificatePassPhrase()
|
||||||
|
{
|
||||||
|
return $this->certificatePassPhrase !== null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function hasCertificateAuthorityInfo()
|
||||||
|
{
|
||||||
|
return $this->certificateAuthorityInfo !== null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function hasCertificateAuthorityPath()
|
||||||
|
{
|
||||||
|
return $this->certificateAuthorityPath !== null;
|
||||||
|
}
|
||||||
|
}
|
@ -16,9 +16,10 @@ use BeSimple\SoapCommon\Helper;
|
|||||||
use BeSimple\SoapCommon\Mime\MultiPart as MimeMultiPart;
|
use BeSimple\SoapCommon\Mime\MultiPart as MimeMultiPart;
|
||||||
use BeSimple\SoapCommon\Mime\Parser as MimeParser;
|
use BeSimple\SoapCommon\Mime\Parser as MimeParser;
|
||||||
use BeSimple\SoapCommon\Mime\Part as MimePart;
|
use BeSimple\SoapCommon\Mime\Part as MimePart;
|
||||||
|
use BeSimple\SoapCommon\Mime\Part;
|
||||||
use BeSimple\SoapCommon\SoapRequest;
|
use BeSimple\SoapCommon\SoapRequest;
|
||||||
use BeSimple\SoapCommon\SoapRequestFilter;
|
use BeSimple\SoapCommon\SoapRequestFilter;
|
||||||
use BeSimple\SoapCommon\SoapResponse;
|
use BeSimple\SoapCommon\SoapResponse as CommonSoapResponse;
|
||||||
use BeSimple\SoapCommon\SoapResponseFilter;
|
use BeSimple\SoapCommon\SoapResponseFilter;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -28,111 +29,61 @@ use BeSimple\SoapCommon\SoapResponseFilter;
|
|||||||
*/
|
*/
|
||||||
class MimeFilter implements SoapRequestFilter, SoapResponseFilter
|
class MimeFilter implements SoapRequestFilter, SoapResponseFilter
|
||||||
{
|
{
|
||||||
/**
|
public function filterRequest(SoapRequest $request, $attachmentType)
|
||||||
* Attachment type.
|
|
||||||
*
|
|
||||||
* @var int Helper::ATTACHMENTS_TYPE_SWA | Helper::ATTACHMENTS_TYPE_MTOM
|
|
||||||
*/
|
|
||||||
protected $attachmentType = Helper::ATTACHMENTS_TYPE_SWA;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor.
|
|
||||||
*
|
|
||||||
* @param int $attachmentType Helper::ATTACHMENTS_TYPE_SWA | Helper::ATTACHMENTS_TYPE_MTOM
|
|
||||||
*/
|
|
||||||
public function __construct($attachmentType)
|
|
||||||
{
|
{
|
||||||
$this->attachmentType = $attachmentType;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Reset all properties to default values.
|
|
||||||
*/
|
|
||||||
public function resetFilter()
|
|
||||||
{
|
|
||||||
$this->attachmentType = Helper::ATTACHMENTS_TYPE_SWA;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Modify the given request XML.
|
|
||||||
*
|
|
||||||
* @param \BeSimple\SoapCommon\SoapRequest $request SOAP request
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function filterRequest(SoapRequest $request)
|
|
||||||
{
|
|
||||||
// get attachments from request object
|
|
||||||
$attachmentsToSend = $request->getAttachments();
|
$attachmentsToSend = $request->getAttachments();
|
||||||
|
|
||||||
// build mime message if we have attachments
|
|
||||||
if (count($attachmentsToSend) > 0) {
|
if (count($attachmentsToSend) > 0) {
|
||||||
$multipart = new MimeMultiPart();
|
$multipart = new MimeMultiPart('Part_' . rand(10, 15) . '_' . uniqid() . '.' . uniqid());
|
||||||
$soapPart = new MimePart($request->getContent(), 'text/xml', 'utf-8', MimePart::ENCODING_EIGHT_BIT);
|
$soapPart = new MimePart($request->getContent(), 'text/xml', 'utf-8', MimePart::ENCODING_EIGHT_BIT);
|
||||||
$soapVersion = $request->getVersion();
|
$soapVersion = $request->getVersion();
|
||||||
// change content type headers for MTOM with SOAP 1.1
|
|
||||||
if ($soapVersion == SOAP_1_1 && $this->attachmentType & Helper::ATTACHMENTS_TYPE_MTOM) {
|
if ($soapVersion === SOAP_1_1 && $attachmentType & Helper::ATTACHMENTS_TYPE_MTOM) {
|
||||||
$multipart->setHeader('Content-Type', 'type', 'application/xop+xml');
|
$multipart->setHeader('Content-Type', 'type', 'application/xop+xml');
|
||||||
$multipart->setHeader('Content-Type', 'start-info', 'text/xml');
|
$multipart->setHeader('Content-Type', 'start-info', 'text/xml');
|
||||||
$soapPart->setHeader('Content-Type', 'application/xop+xml');
|
$soapPart->setHeader('Content-Type', 'application/xop+xml');
|
||||||
$soapPart->setHeader('Content-Type', 'type', 'text/xml');
|
$soapPart->setHeader('Content-Type', 'type', 'text/xml');
|
||||||
}
|
} elseif ($soapVersion === SOAP_1_2) {
|
||||||
// change content type headers for SOAP 1.2
|
|
||||||
elseif ($soapVersion == SOAP_1_2) {
|
|
||||||
$multipart->setHeader('Content-Type', 'type', 'application/soap+xml');
|
$multipart->setHeader('Content-Type', 'type', 'application/soap+xml');
|
||||||
$soapPart->setHeader('Content-Type', 'application/soap+xml');
|
$soapPart->setHeader('Content-Type', 'application/soap+xml');
|
||||||
}
|
}
|
||||||
|
|
||||||
$multipart->addPart($soapPart, true);
|
$multipart->addPart($soapPart, true);
|
||||||
foreach ($attachmentsToSend as $cid => $attachment) {
|
foreach ($attachmentsToSend as $cid => $attachment) {
|
||||||
$multipart->addPart($attachment, false);
|
$multipart->addPart($attachment, false);
|
||||||
}
|
}
|
||||||
$request->setContent($multipart->getMimeMessage());
|
$request->setContent($multipart->getMimeMessage());
|
||||||
|
|
||||||
// TODO
|
|
||||||
$headers = $multipart->getHeadersForHttp();
|
$headers = $multipart->getHeadersForHttp();
|
||||||
list(, $contentType) = explode(': ', $headers[0]);
|
list(, $contentType) = explode(': ', $headers[0]);
|
||||||
|
|
||||||
$request->setContentType($contentType);
|
$request->setContentType($contentType);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return $request;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public function filterResponse(CommonSoapResponse $response, $attachmentType)
|
||||||
* Modify the given response XML.
|
|
||||||
*
|
|
||||||
* @param \BeSimple\SoapCommon\SoapResponse $response SOAP response
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function filterResponse(SoapResponse $response)
|
|
||||||
{
|
{
|
||||||
// array to store attachments
|
$multiPartMessage = MimeParser::parseMimeMessage(
|
||||||
$attachmentsRecieved = array();
|
$response->getContent(),
|
||||||
|
['Content-Type' => trim($response->getContentType())]
|
||||||
|
);
|
||||||
|
$soapPart = $multiPartMessage->getMainPart();
|
||||||
|
$attachments = $multiPartMessage->getAttachments();
|
||||||
|
|
||||||
// check content type if it is a multipart mime message
|
$response->setContent($soapPart->getContent());
|
||||||
$responseContentType = $response->getContentType();
|
$response->setContentType($soapPart->getHeader('Content-Type'));
|
||||||
if (false !== stripos($responseContentType, 'multipart/related')) {
|
if (count($attachments) > 0) {
|
||||||
// parse mime message
|
$response->setAttachments($attachments);
|
||||||
$headers = array(
|
|
||||||
'Content-Type' => trim($responseContentType),
|
|
||||||
);
|
|
||||||
$multipart = MimeParser::parseMimeMessage($response->getContent(), $headers);
|
|
||||||
// get soap payload and update SoapResponse object
|
|
||||||
$soapPart = $multipart->getPart();
|
|
||||||
// convert href -> myhref for external references as PHP throws exception in this case
|
|
||||||
// http://svn.php.net/viewvc/php/php-src/branches/PHP_5_4/ext/soap/php_encoding.c?view=markup#l3436
|
|
||||||
$content = preg_replace('/href=(?!#)/', 'myhref=', $soapPart->getContent());
|
|
||||||
$response->setContent($content);
|
|
||||||
$response->setContentType($soapPart->getHeader('Content-Type'));
|
|
||||||
// store attachments
|
|
||||||
$attachments = $multipart->getParts(false);
|
|
||||||
foreach ($attachments as $cid => $attachment) {
|
|
||||||
$attachmentsRecieved[$cid] = $attachment;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// add attachments to response object
|
return $response;
|
||||||
if (count($attachmentsRecieved) > 0) {
|
}
|
||||||
$response->setAttachments($attachmentsRecieved);
|
|
||||||
}
|
private function sanitizePhpExceptionOnHrefs(Part $soapPart)
|
||||||
|
{
|
||||||
|
// convert href -> myhref for external references as PHP throws exception in this case
|
||||||
|
// http://svn.php.net/viewvc/php/php-src/branches/PHP_5_4/ext/soap/php_encoding.c?view=markup#l3436
|
||||||
|
return preg_replace('/href=(?!#)/', 'myhref=', $soapPart->getContent());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,10 +12,23 @@
|
|||||||
|
|
||||||
namespace BeSimple\SoapClient;
|
namespace BeSimple\SoapClient;
|
||||||
|
|
||||||
use BeSimple\SoapCommon\Helper;
|
use BeSimple\SoapBundle\Soap\SoapAttachment;
|
||||||
use BeSimple\SoapCommon\Converter\MtomTypeConverter;
|
use BeSimple\SoapBundle\Soap\SoapAttachmentList;
|
||||||
use BeSimple\SoapCommon\Converter\SwaTypeConverter;
|
use BeSimple\SoapClient\Curl\Curl;
|
||||||
use BeSimple\SoapCommon\SoapMessage;
|
use BeSimple\SoapClient\Curl\CurlOptionsBuilder;
|
||||||
|
use BeSimple\SoapClient\Curl\CurlResponse;
|
||||||
|
use BeSimple\SoapClient\SoapOptions\SoapClientOptions;
|
||||||
|
use BeSimple\SoapCommon\Fault\SoapFaultEnum;
|
||||||
|
use BeSimple\SoapCommon\Fault\SoapFaultParser;
|
||||||
|
use BeSimple\SoapCommon\Fault\SoapFaultPrefixEnum;
|
||||||
|
use BeSimple\SoapCommon\Fault\SoapFaultSourceGetter;
|
||||||
|
use BeSimple\SoapCommon\Mime\PartFactory;
|
||||||
|
use BeSimple\SoapCommon\SoapKernel;
|
||||||
|
use BeSimple\SoapCommon\SoapOptions\SoapOptions;
|
||||||
|
use BeSimple\SoapCommon\SoapRequest;
|
||||||
|
use BeSimple\SoapCommon\SoapRequestFactory;
|
||||||
|
use Exception;
|
||||||
|
use SoapFault;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Extended SoapClient that uses a a cURL wrapper for all underlying HTTP
|
* Extended SoapClient that uses a a cURL wrapper for all underlying HTTP
|
||||||
@ -24,355 +37,340 @@ use BeSimple\SoapCommon\SoapMessage;
|
|||||||
* allows caching of all remote referenced items.
|
* allows caching of all remote referenced items.
|
||||||
*
|
*
|
||||||
* @author Andreas Schamberger <mail@andreass.net>
|
* @author Andreas Schamberger <mail@andreass.net>
|
||||||
|
* @author Petr Bechyně <mail@petrbechyne.com>
|
||||||
*/
|
*/
|
||||||
class SoapClient extends \SoapClient
|
class SoapClient extends \SoapClient
|
||||||
{
|
{
|
||||||
/**
|
use SoapClientNativeMethodsTrait;
|
||||||
* Soap version.
|
|
||||||
*
|
|
||||||
* @var int
|
|
||||||
*/
|
|
||||||
protected $soapVersion = SOAP_1_1;
|
|
||||||
|
|
||||||
/**
|
/** @var SoapOptions */
|
||||||
* Tracing enabled?
|
protected $soapOptions;
|
||||||
*
|
/** @var Curl */
|
||||||
* @var boolean
|
private $curl;
|
||||||
*/
|
|
||||||
protected $tracingEnabled = false;
|
|
||||||
|
|
||||||
/**
|
public function __construct(SoapClientOptions $soapClientOptions, SoapOptions $soapOptions)
|
||||||
* Work around missing header/php://input access in PHP cli webserver by
|
|
||||||
* setting headers additionally as GET parameters and SOAP request body
|
|
||||||
* explicitly as POST variable.
|
|
||||||
*
|
|
||||||
* @var boolean
|
|
||||||
*/
|
|
||||||
private $cliWebserverWorkaround = false;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* cURL instance.
|
|
||||||
*
|
|
||||||
* @var \BeSimple\SoapClient\Curl
|
|
||||||
*/
|
|
||||||
protected $curl = null;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Last request headers.
|
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
private $lastRequestHeaders = '';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Last request.
|
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
private $lastRequest = '';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Last response headers.
|
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
private $lastResponseHeaders = '';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Last response.
|
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
private $lastResponse = '';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Soap kernel.
|
|
||||||
*
|
|
||||||
* @var \BeSimple\SoapClient\SoapKernel
|
|
||||||
*/
|
|
||||||
protected $soapKernel = null;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor.
|
|
||||||
*
|
|
||||||
* @param string $wsdl WSDL file
|
|
||||||
* @param array(string=>mixed) $options Options array
|
|
||||||
*/
|
|
||||||
public function __construct($wsdl, array $options = array())
|
|
||||||
{
|
{
|
||||||
// tracing enabled: store last request/response header and body
|
$this->soapClientOptions = $soapClientOptions;
|
||||||
if (isset($options['trace']) && $options['trace'] === true) {
|
$this->soapOptions = $soapOptions;
|
||||||
$this->tracingEnabled = true;
|
$this->curl = new Curl(
|
||||||
|
CurlOptionsBuilder::buildForSoapClient($soapClientOptions)
|
||||||
|
);
|
||||||
|
|
||||||
|
try {
|
||||||
|
$wsdlPath = $this->loadWsdl(
|
||||||
|
$this->curl,
|
||||||
|
$soapOptions->getWsdlFile(),
|
||||||
|
$soapOptions->getWsdlCacheType(),
|
||||||
|
$soapClientOptions->isResolveRemoteIncludes()
|
||||||
|
);
|
||||||
|
} catch (Exception $e) {
|
||||||
|
throw new SoapFault(
|
||||||
|
SoapFaultEnum::SOAP_FAULT_SOAP_CLIENT_ERROR,
|
||||||
|
'Unable to load WsdlPath ('.$soapOptions->getWsdlFile().') with message: '.$e->getMessage().' in file: '.$e->getFile().' (line: '.$e->getLine().')'
|
||||||
|
);
|
||||||
}
|
}
|
||||||
// store SOAP version
|
|
||||||
if (isset($options['soap_version'])) {
|
@parent::__construct($wsdlPath, $soapClientOptions->toArray() + $soapOptions->toArray());
|
||||||
$this->soapVersion = $options['soap_version'];
|
|
||||||
}
|
|
||||||
// activate cli webserver workaround
|
|
||||||
if (isset($options['cli_webserver_workaround'])) {
|
|
||||||
$this->cliWebserverWorkaround = $options['cli_webserver_workaround'];
|
|
||||||
}
|
|
||||||
$this->curl = new Curl($options);
|
|
||||||
$wsdlFile = $this->loadWsdl($wsdl, $options);
|
|
||||||
// TODO $wsdlHandler = new WsdlHandler($wsdlFile, $this->soapVersion);
|
|
||||||
$this->soapKernel = new SoapKernel();
|
|
||||||
// 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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Perform HTTP request with cURL.
|
* @param string $functionName
|
||||||
*
|
* @param array $arguments
|
||||||
* @param SoapRequest $soapRequest SoapRequest object
|
* @param array|null $options
|
||||||
*
|
* @param SoapAttachment[] $soapAttachments
|
||||||
|
* @param null $inputHeaders
|
||||||
|
* @param array|null $outputHeaders
|
||||||
* @return SoapResponse
|
* @return SoapResponse
|
||||||
*/
|
*/
|
||||||
private function __doHttpRequest(SoapRequest $soapRequest)
|
public function soapCall($functionName, array $arguments, array $soapAttachments = [], array $options = null, $inputHeaders = null, array &$outputHeaders = null)
|
||||||
{
|
{
|
||||||
// HTTP headers
|
$this->setSoapAttachmentsOnRequestToStorage($soapAttachments);
|
||||||
$soapVersion = $soapRequest->getVersion();
|
try {
|
||||||
$soapAction = $soapRequest->getAction();
|
|
||||||
if (SOAP_1_1 == $soapVersion) {
|
|
||||||
$headers = array(
|
|
||||||
'Content-Type:' . $soapRequest->getContentType(),
|
|
||||||
'SOAPAction: "' . $soapAction . '"',
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
$headers = array(
|
|
||||||
'Content-Type:' . $soapRequest->getContentType() . '; action="' . $soapAction . '"',
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
$location = $soapRequest->getLocation();
|
$soapResponseAsObject = parent::__soapCall($functionName, $arguments, $options, $inputHeaders, $outputHeaders);
|
||||||
$content = $soapRequest->getContent();
|
$soapResponse = $this->getSoapResponseFromStorage();
|
||||||
/*
|
$soapResponse->setResponseObject($soapResponseAsObject);
|
||||||
* Work around missing header/php://input access in PHP cli webserver by
|
|
||||||
* setting headers additionally as GET parameters and SOAP request body
|
return $soapResponse;
|
||||||
* explicitly as POST variable
|
|
||||||
*/
|
} catch (SoapFault $soapFault) {
|
||||||
if ($this->cliWebserverWorkaround === true) {
|
if (SoapFaultSourceGetter::isNativeSoapFault($soapFault)) {
|
||||||
if (strpos($location, '?') === false) {
|
$soapFault = $this->decorateNativeSoapFaultWithSoapResponseTracingData($soapFault);
|
||||||
$location .= '?';
|
|
||||||
} else {
|
|
||||||
$location .= '&';
|
|
||||||
}
|
}
|
||||||
$location .= SoapMessage::CONTENT_TYPE_HEADER.'='.urlencode($soapRequest->getContentType());
|
|
||||||
$location .= '&';
|
|
||||||
$location .= SoapMessage::SOAP_ACTION_HEADER.'='.urlencode($soapRequest->getAction());
|
|
||||||
|
|
||||||
$content = http_build_query(array('request' => $content));
|
throw $soapFault;
|
||||||
|
|
||||||
$headers = array();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// execute HTTP request with cURL
|
|
||||||
$responseSuccessfull = $this->curl->exec(
|
|
||||||
$location,
|
|
||||||
$content,
|
|
||||||
$headers
|
|
||||||
);
|
|
||||||
// tracing enabled: store last request header and body
|
|
||||||
if ($this->tracingEnabled === true) {
|
|
||||||
$this->lastRequestHeaders = $this->curl->getRequestHeaders();
|
|
||||||
$this->lastRequest = $soapRequest->getContent();
|
|
||||||
}
|
|
||||||
// in case of an error while making the http request throw a soapFault
|
|
||||||
if ($responseSuccessfull === false) {
|
|
||||||
// get error message from curl
|
|
||||||
$faultstring = $this->curl->getErrorMessage();
|
|
||||||
throw new \SoapFault('HTTP', $faultstring);
|
|
||||||
}
|
|
||||||
// tracing enabled: store last response header and body
|
|
||||||
if ($this->tracingEnabled === true) {
|
|
||||||
$this->lastResponseHeaders = $this->curl->getResponseHeaders();
|
|
||||||
$this->lastResponse = $this->curl->getResponseBody();
|
|
||||||
}
|
|
||||||
// wrap response data in SoapResponse object
|
|
||||||
$soapResponse = SoapResponse::create(
|
|
||||||
$this->curl->getResponseBody(),
|
|
||||||
$soapRequest->getLocation(),
|
|
||||||
$soapRequest->getAction(),
|
|
||||||
$soapRequest->getVersion(),
|
|
||||||
$this->curl->getResponseContentType()
|
|
||||||
);
|
|
||||||
|
|
||||||
return $soapResponse;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Custom request method to be able to modify the SOAP messages.
|
* Custom request method to be able to modify the SOAP messages.
|
||||||
* $oneWay parameter is not used at the moment.
|
* $oneWay parameter is not used at the moment.
|
||||||
*
|
*
|
||||||
* @param string $request Request string
|
* @param mixed $request Request object
|
||||||
* @param string $location Location
|
* @param string $location Location
|
||||||
* @param string $action SOAP action
|
* @param string $action SOAP action
|
||||||
* @param int $version SOAP version
|
* @param int $version SOAP version
|
||||||
* @param int $oneWay 0|1
|
* @param SoapAttachment[] $soapAttachments SOAP attachments array
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function __doRequest($request, $location, $action, $version, $oneWay = 0)
|
|
||||||
{
|
|
||||||
// wrap request data in SoapRequest object
|
|
||||||
$soapRequest = SoapRequest::create($request, $location, $action, $version);
|
|
||||||
|
|
||||||
// do actual SOAP request
|
|
||||||
$soapResponse = $this->__doRequest2($soapRequest);
|
|
||||||
|
|
||||||
// return SOAP response to ext/soap
|
|
||||||
return $soapResponse->getContent();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Runs the currently registered request filters on the request, performs
|
|
||||||
* the HTTP request and runs the response filters.
|
|
||||||
*
|
|
||||||
* @param SoapRequest $soapRequest SOAP request object
|
|
||||||
*
|
*
|
||||||
* @return SoapResponse
|
* @return SoapResponse
|
||||||
*/
|
*/
|
||||||
protected function __doRequest2(SoapRequest $soapRequest)
|
protected function performSoapRequest($request, $location, $action, $version, array $soapAttachments = [])
|
||||||
{
|
{
|
||||||
// run SoapKernel on SoapRequest
|
$soapRequest = $this->createSoapRequest($location, $action, $version, $request, $soapAttachments);
|
||||||
$this->soapKernel->filterRequest($soapRequest);
|
|
||||||
|
|
||||||
// perform HTTP request with cURL
|
return $this->performHttpSoapRequest($soapRequest);
|
||||||
$soapResponse = $this->__doHttpRequest($soapRequest);
|
}
|
||||||
|
|
||||||
// run SoapKernel on SoapResponse
|
protected function getSoapClientOptions()
|
||||||
$this->soapKernel->filterResponse($soapResponse);
|
{
|
||||||
|
return $this->soapClientOptions;
|
||||||
|
}
|
||||||
|
|
||||||
return $soapResponse;
|
protected function getSoapOptions()
|
||||||
|
{
|
||||||
|
return $this->soapOptions;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get last request HTTP headers.
|
* @param string $location Location
|
||||||
|
* @param string $action SOAP action
|
||||||
|
* @param int $version SOAP version
|
||||||
|
* @param string $request SOAP request body
|
||||||
|
* @param SoapAttachment[] $soapAttachments array of SOAP attachments
|
||||||
*
|
*
|
||||||
* @return string
|
* @return SoapRequest
|
||||||
*/
|
*/
|
||||||
public function __getLastRequestHeaders()
|
private function createSoapRequest($location, $action, $version, $request, array $soapAttachments = [])
|
||||||
{
|
{
|
||||||
return $this->lastRequestHeaders;
|
$soapAttachmentList = new SoapAttachmentList($soapAttachments);
|
||||||
}
|
$soapRequest = SoapRequestFactory::create($location, $action, $version, $request);
|
||||||
|
if (count($soapAttachments) > 0) {
|
||||||
/**
|
if ($this->soapOptions->hasAttachments() === true) {
|
||||||
* Get last request HTTP body.
|
$soapRequest->setAttachments(PartFactory::createAttachmentParts($soapAttachments));
|
||||||
*
|
$soapRequest = SoapKernel::filterRequest(
|
||||||
* @return string
|
$soapRequest,
|
||||||
*/
|
$this->getAttachmentFilters(),
|
||||||
public function __getLastRequest()
|
$this->soapOptions->getAttachmentType()
|
||||||
{
|
);
|
||||||
return $this->lastRequest;
|
} else {
|
||||||
}
|
throw new Exception(
|
||||||
|
'Non SWA SoapClient cannot handle SOAP action '.$action.' with attachments: '.implode(', ', $soapAttachmentList->getSoapAttachmentIds())
|
||||||
/**
|
);
|
||||||
* Get last response HTTP headers.
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function __getLastResponseHeaders()
|
|
||||||
{
|
|
||||||
return $this->lastResponseHeaders;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get last response HTTP body.
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function __getLastResponse()
|
|
||||||
{
|
|
||||||
return $this->lastResponse;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get SoapKernel instance.
|
|
||||||
*
|
|
||||||
* @return \BeSimple\SoapClient\SoapKernel
|
|
||||||
*/
|
|
||||||
public function getSoapKernel()
|
|
||||||
{
|
|
||||||
return $this->soapKernel;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Configure filter and type converter for SwA/MTOM.
|
|
||||||
*
|
|
||||||
* @param array &$options SOAP constructor options array.
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
private function configureMime(array &$options)
|
|
||||||
{
|
|
||||||
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);
|
|
||||||
// configure type converter
|
|
||||||
if (Helper::ATTACHMENTS_TYPE_SWA === $options['attachment_type']) {
|
|
||||||
$converter = new SwaTypeConverter();
|
|
||||||
$converter->setKernel($this->soapKernel);
|
|
||||||
} elseif (Helper::ATTACHMENTS_TYPE_MTOM === $options['attachment_type']) {
|
|
||||||
$xmlMimeFilter = new XmlMimeFilter($options['attachment_type']);
|
|
||||||
$this->soapKernel->registerFilter($xmlMimeFilter);
|
|
||||||
$converter = new MtomTypeConverter();
|
|
||||||
$converter->setKernel($this->soapKernel);
|
|
||||||
}
|
}
|
||||||
// configure typemap
|
}
|
||||||
if (!isset($options['typemap'])) {
|
|
||||||
$options['typemap'] = array();
|
return $soapRequest;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Perform HTTP request with cURL.
|
||||||
|
*
|
||||||
|
* @param SoapRequest $soapRequest SoapRequest object
|
||||||
|
* @return SoapResponse
|
||||||
|
* @throws SoapFault
|
||||||
|
*/
|
||||||
|
private function performHttpSoapRequest(SoapRequest $soapRequest)
|
||||||
|
{
|
||||||
|
$curlResponse = $this->curl->executeCurlWithCachedSession(
|
||||||
|
$soapRequest->getLocation(),
|
||||||
|
$soapRequest->getContent(),
|
||||||
|
$this->getHttpHeadersBySoapVersion($soapRequest)
|
||||||
|
);
|
||||||
|
$soapResponseTracingData = new SoapResponseTracingData(
|
||||||
|
$curlResponse->getHttpRequestHeaders(),
|
||||||
|
$soapRequest->getContent(),
|
||||||
|
$curlResponse->getResponseHeader(),
|
||||||
|
$curlResponse->getResponseBody()
|
||||||
|
);
|
||||||
|
|
||||||
|
if ($curlResponse->curlStatusSuccess()) {
|
||||||
|
$soapResponse = $this->returnSoapResponseByTracing(
|
||||||
|
$soapRequest,
|
||||||
|
$curlResponse,
|
||||||
|
$soapResponseTracingData
|
||||||
|
);
|
||||||
|
if ($this->soapOptions->hasAttachments()) {
|
||||||
|
|
||||||
|
return SoapKernel::filterResponse(
|
||||||
|
$soapResponse,
|
||||||
|
$this->getAttachmentFilters(),
|
||||||
|
$this->soapOptions->getAttachmentType()
|
||||||
|
);
|
||||||
}
|
}
|
||||||
$options['typemap'][] = array(
|
|
||||||
'type_name' => $converter->getTypeName(),
|
return $soapResponse;
|
||||||
'type_ns' => $converter->getTypeNamespace(),
|
|
||||||
'from_xml' => function($input) use ($converter) {
|
}
|
||||||
return $converter->convertXmlToPhp($input);
|
if ($curlResponse->curlStatusFailed()) {
|
||||||
},
|
|
||||||
'to_xml' => function($input) use ($converter) {
|
if ($curlResponse->getHttpResponseStatusCode() >= 500) {
|
||||||
return $converter->convertPhpToXml($input);
|
$soapFault = SoapFaultParser::parseSoapFault(
|
||||||
},
|
$curlResponse->getResponseBody()
|
||||||
|
);
|
||||||
|
|
||||||
|
return $this->throwSoapFaultByTracing(
|
||||||
|
$soapFault->faultcode,
|
||||||
|
sprintf(
|
||||||
|
'SOAP HTTP call failed: %s with Message: %s and Code: %s',
|
||||||
|
$curlResponse->getCurlErrorMessage(),
|
||||||
|
$soapFault->getMessage(),
|
||||||
|
$soapFault->faultcode
|
||||||
|
),
|
||||||
|
$soapResponseTracingData
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->throwSoapFaultByTracing(
|
||||||
|
SoapFaultEnum::SOAP_FAULT_HTTP.'-'.$curlResponse->getHttpResponseStatusCode(),
|
||||||
|
$curlResponse->getCurlErrorMessage(),
|
||||||
|
$soapResponseTracingData
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return $this->throwSoapFaultByTracing(
|
||||||
|
SoapFaultEnum::SOAP_FAULT_SOAP_CLIENT_ERROR,
|
||||||
|
'Cannot process curl response with unresolved status: ' . $curlResponse->getCurlStatus(),
|
||||||
|
$soapResponseTracingData
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Downloads WSDL files with cURL. Uses all SoapClient options for
|
* @param Curl $curl
|
||||||
* authentication. Uses the WSDL_CACHE_* constants and the 'soap.wsdl_*'
|
* @param string $wsdlPath
|
||||||
* ini settings. Does only file caching as SoapClient only supports a file
|
* @param int $wsdlCacheType
|
||||||
* name parameter.
|
* @param bool $resolveRemoteIncludes
|
||||||
*
|
|
||||||
* @param string $wsdl WSDL file
|
|
||||||
* @param array(string=>mixed) $options Options array
|
|
||||||
*
|
*
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
private function loadWsdl($wsdl, array $options)
|
private function loadWsdl(Curl $curl, $wsdlPath, $wsdlCacheType, $resolveRemoteIncludes = true)
|
||||||
{
|
{
|
||||||
// option to resolve wsdl/xsd includes
|
$wsdlDownloader = new WsdlDownloader();
|
||||||
$resolveRemoteIncludes = true;
|
|
||||||
if (isset($options['resolve_wsdl_remote_includes'])) {
|
|
||||||
$resolveRemoteIncludes = $options['resolve_wsdl_remote_includes'];
|
|
||||||
}
|
|
||||||
// option to enable cache
|
|
||||||
$wsdlCache = WSDL_CACHE_DISK;
|
|
||||||
if (isset($options['cache_wsdl'])) {
|
|
||||||
$wsdlCache = $options['cache_wsdl'];
|
|
||||||
}
|
|
||||||
$wsdlDownloader = new WsdlDownloader($this->curl, $resolveRemoteIncludes, $wsdlCache);
|
|
||||||
try {
|
try {
|
||||||
$cacheFileName = $wsdlDownloader->download($wsdl);
|
$loadedWsdlFilePath = $wsdlDownloader->getWsdlPath($curl, $wsdlPath, $wsdlCacheType, $resolveRemoteIncludes);
|
||||||
} catch (\RuntimeException $e) {
|
} catch (Exception $e) {
|
||||||
throw new \SoapFault('WSDL', "SOAP-ERROR: Parsing WSDL: Couldn't load from '" . $wsdl . "' : failed to load external entity \"" . $wsdl . "\"");
|
throw new SoapFault(
|
||||||
|
SoapFaultEnum::SOAP_FAULT_WSDL,
|
||||||
|
'Unable to load WsdlPath ('.$wsdlPath.') with message: '.$e->getMessage().' in file: '.$e->getFile().' (line: '.$e->getLine().')'
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $cacheFileName;
|
return $loadedWsdlFilePath;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
private function getHttpHeadersBySoapVersion(SoapRequest $soapRequest)
|
||||||
|
{
|
||||||
|
if ($soapRequest->getVersion() === SOAP_1_1) {
|
||||||
|
|
||||||
|
return [
|
||||||
|
'Content-Type: ' . $soapRequest->getContentType(),
|
||||||
|
'SOAPAction: "' . $soapRequest->getAction() . '"',
|
||||||
|
'Connection: ' . ($this->soapOptions->isConnectionKeepAlive() ? 'Keep-Alive' : 'close'),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
return [
|
||||||
|
'Content-Type: ' . $soapRequest->getContentType() . '; action="' . $soapRequest->getAction() . '"',
|
||||||
|
'Connection: ' . ($this->soapOptions->isConnectionKeepAlive() ? 'Keep-Alive' : 'close'),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getAttachmentFilters()
|
||||||
|
{
|
||||||
|
$filters = [];
|
||||||
|
if ($this->soapOptions->getAttachmentType() !== SoapOptions::SOAP_ATTACHMENTS_TYPE_BASE64) {
|
||||||
|
$filters[] = new MimeFilter();
|
||||||
|
}
|
||||||
|
if ($this->soapOptions->getAttachmentType() === SoapOptions::SOAP_ATTACHMENTS_TYPE_MTOM) {
|
||||||
|
$filters[] = new XmlMimeFilter();
|
||||||
|
}
|
||||||
|
|
||||||
|
return $filters;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function returnSoapResponseByTracing(
|
||||||
|
SoapRequest $soapRequest,
|
||||||
|
CurlResponse $curlResponse,
|
||||||
|
SoapResponseTracingData $soapResponseTracingData,
|
||||||
|
array $soapAttachments = []
|
||||||
|
) {
|
||||||
|
if ($this->soapClientOptions->getTrace() === true) {
|
||||||
|
return SoapResponseFactory::createWithTracingData(
|
||||||
|
$soapRequest,
|
||||||
|
$curlResponse->getResponseBody(),
|
||||||
|
$curlResponse->getHttpResponseContentType(),
|
||||||
|
$soapResponseTracingData,
|
||||||
|
$soapAttachments
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return SoapResponseFactory::create(
|
||||||
|
$soapRequest,
|
||||||
|
$curlResponse->getResponseBody(),
|
||||||
|
$curlResponse->getHttpResponseContentType(),
|
||||||
|
$soapAttachments
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $soapFaultCode
|
||||||
|
* @param string $soapFaultMessage
|
||||||
|
* @param SoapResponseTracingData $soapResponseTracingData
|
||||||
|
* @throws SoapFault
|
||||||
|
*/
|
||||||
|
private function throwSoapFaultByTracing($soapFaultCode, $soapFaultMessage, SoapResponseTracingData $soapResponseTracingData)
|
||||||
|
{
|
||||||
|
if ($this->soapClientOptions->getTrace() === true) {
|
||||||
|
|
||||||
|
throw new SoapFaultWithTracingData(
|
||||||
|
$soapFaultCode,
|
||||||
|
$soapFaultMessage,
|
||||||
|
$soapResponseTracingData
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new SoapFault(
|
||||||
|
$soapFaultCode,
|
||||||
|
$soapFaultMessage
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function decorateNativeSoapFaultWithSoapResponseTracingData(SoapFault $nativePhpSoapFault)
|
||||||
|
{
|
||||||
|
return $this->throwSoapFaultByTracing(
|
||||||
|
$nativePhpSoapFault->faultcode,
|
||||||
|
$nativePhpSoapFault->getMessage(),
|
||||||
|
$this->getSoapResponseTracingDataFromNativeSoapFaultOrStorage($nativePhpSoapFault)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getSoapResponseTracingDataFromNativeSoapFaultOrStorage(SoapFault $nativePhpSoapFault)
|
||||||
|
{
|
||||||
|
if ($nativePhpSoapFault instanceof SoapFaultWithTracingData) {
|
||||||
|
return $nativePhpSoapFault->getSoapResponseTracingData();
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->getSoapResponseTracingDataFromRequestStorage();
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getSoapResponseTracingDataFromRequestStorage()
|
||||||
|
{
|
||||||
|
$lastResponseHeaders = $lastResponse = $lastRequestHeaders = $lastRequest = null;
|
||||||
|
$soapResponse = $this->getSoapResponseFromStorage();
|
||||||
|
if ($soapResponse instanceof SoapResponse) {
|
||||||
|
$lastResponseHeaders = 'Content-Type: ' . $soapResponse->getContentType();
|
||||||
|
$lastResponse = $soapResponse->getResponseContent();
|
||||||
|
|
||||||
|
if ($soapResponse->hasRequest() === true) {
|
||||||
|
$lastRequestHeaders = 'Content-Type: ' . $soapResponse->getRequest()->getContentType();
|
||||||
|
$lastRequest = $soapResponse->getRequest()->getContent();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return new SoapResponseTracingData(
|
||||||
|
$lastRequestHeaders,
|
||||||
|
$lastRequest,
|
||||||
|
$lastResponseHeaders,
|
||||||
|
$lastResponse
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -12,228 +12,44 @@
|
|||||||
|
|
||||||
namespace BeSimple\SoapClient;
|
namespace BeSimple\SoapClient;
|
||||||
|
|
||||||
use BeSimple\SoapCommon\AbstractSoapBuilder;
|
use BeSimple\SoapBundle\Cache;
|
||||||
use BeSimple\SoapCommon\Helper;
|
use BeSimple\SoapClient\SoapOptions\SoapClientOptions;
|
||||||
|
use BeSimple\SoapCommon\SoapOptions\SoapOptions;
|
||||||
|
use Exception;
|
||||||
|
use SoapHeader;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fluent interface builder for SoapClient instance.
|
* Provides a SoapClient instance.
|
||||||
*
|
*
|
||||||
* @author Francis Besset <francis.besset@gmail.com>
|
* @author Francis Besset <francis.besset@gmail.com>
|
||||||
* @author Christian Kerl <christian-kerl@web.de>
|
* @author Christian Kerl <christian-kerl@web.de>
|
||||||
|
* @author Petr Bechyně <mail@petrbechyne.com>
|
||||||
*/
|
*/
|
||||||
class SoapClientBuilder extends AbstractSoapBuilder
|
class SoapClientBuilder
|
||||||
{
|
{
|
||||||
/**
|
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 parent::createWithDefaults()
|
$cache = new Cache($soapOptions);
|
||||||
->withUserAgent('BeSimpleSoap');
|
$cache->validateSettings($soapOptions);
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
return new SoapClient(
|
||||||
* Finally returns a SoapClient instance.
|
$soapClientOptions,
|
||||||
*
|
$soapOptions
|
||||||
* @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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public function buildWithSoapHeader(
|
||||||
* Configure digest authentication.
|
SoapClientOptions $soapClientOptions,
|
||||||
*
|
SoapOptions $soapOptions,
|
||||||
* @param string $certificate Certificate
|
SoapHeader $soapHeader
|
||||||
* @param string $passphrase Passphrase
|
) {
|
||||||
*
|
$soapClient = $this->build($soapClientOptions, $soapOptions);
|
||||||
* @return \BeSimple\SoapClient\SoapClientBuilder
|
if ($soapClient->__setSoapHeaders($soapHeader) === false) {
|
||||||
*/
|
throw new Exception(
|
||||||
public function withDigestAuthentication($certificate, $passphrase = null)
|
'Could not set SoapHeader: '.var_export($soapHeader, true)
|
||||||
{
|
);
|
||||||
$this->soapOptionAuthentication = array(
|
|
||||||
'authentication' => SOAP_AUTHENTICATION_DIGEST,
|
|
||||||
'local_cert' => $certificate,
|
|
||||||
);
|
|
||||||
|
|
||||||
if ($passphrase) {
|
|
||||||
$this->soapOptionAuthentication['passphrase'] = $passphrase;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this;
|
return $soapClient;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
/**
|
|
||||||
* Configure proxy.
|
|
||||||
*
|
|
||||||
* @param string $host Host
|
|
||||||
* @param int $port Port
|
|
||||||
* @param string $username Username
|
|
||||||
* @param string $password Password
|
|
||||||
*
|
|
||||||
* @return \BeSimple\SoapClient\SoapClientBuilder
|
|
||||||
*/
|
|
||||||
public function withProxy($host, $port, $username = null, $password = null)
|
|
||||||
{
|
|
||||||
$this->soapOptions['proxy_host'] = $host;
|
|
||||||
$this->soapOptions['proxy_port'] = $port;
|
|
||||||
|
|
||||||
if ($username) {
|
|
||||||
$this->soapOptions['proxy_login'] = $username;
|
|
||||||
$this->soapOptions['proxy_password'] = $password;
|
|
||||||
}
|
|
||||||
|
|
||||||
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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -0,0 +1,7 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace BeSimple\SoapClient;
|
||||||
|
|
||||||
|
class SoapClientMessageWithAttachments
|
||||||
|
{
|
||||||
|
}
|
176
src/BeSimple/SoapClient/SoapClientNativeMethodsTrait.php
Normal file
176
src/BeSimple/SoapClient/SoapClientNativeMethodsTrait.php
Normal file
@ -0,0 +1,176 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace BeSimple\SoapClient;
|
||||||
|
|
||||||
|
use BeSimple\SoapBundle\Soap\SoapAttachment;
|
||||||
|
use BeSimple\SoapClient\SoapOptions\SoapClientOptions;
|
||||||
|
use BeSimple\SoapCommon\SoapOptions\SoapOptions;
|
||||||
|
use Exception;
|
||||||
|
|
||||||
|
trait SoapClientNativeMethodsTrait
|
||||||
|
{
|
||||||
|
protected $soapClientOptions;
|
||||||
|
/** @var SoapAttachment[] */
|
||||||
|
private $soapAttachmentsOnRequestStorage;
|
||||||
|
/** @var SoapResponse */
|
||||||
|
private $soapResponseStorage;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $functionName
|
||||||
|
* @param array $arguments
|
||||||
|
* @param array|null $options
|
||||||
|
* @param SoapAttachment[] $soapAttachments
|
||||||
|
* @param null $inputHeaders
|
||||||
|
* @param array|null $outputHeaders
|
||||||
|
* @return SoapResponse
|
||||||
|
*/
|
||||||
|
abstract public function soapCall($functionName, array $arguments, array $soapAttachments = [], array $options = null, $inputHeaders = null, array &$outputHeaders = null);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param mixed $request Request object
|
||||||
|
* @param string $location Location
|
||||||
|
* @param string $action SOAP action
|
||||||
|
* @param int $version SOAP version
|
||||||
|
* @param SoapAttachment[] $soapAttachments SOAP attachments array
|
||||||
|
* @return SoapResponse
|
||||||
|
*/
|
||||||
|
abstract protected function performSoapRequest($request, $location, $action, $version, array $soapAttachments = []);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return SoapClientOptions
|
||||||
|
*/
|
||||||
|
abstract protected function getSoapClientOptions();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return SoapOptions
|
||||||
|
*/
|
||||||
|
abstract protected function getSoapOptions();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Avoid using __call directly, it's deprecated even in \SoapClient.
|
||||||
|
*
|
||||||
|
* @deprecated
|
||||||
|
*/
|
||||||
|
public function __call($function_name, $arguments)
|
||||||
|
{
|
||||||
|
throw new Exception(
|
||||||
|
'The __call method is deprecated. Use __soapCall/soapCall instead.'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Using __soapCall returns only response string, use soapCall instead.
|
||||||
|
*
|
||||||
|
* @param string $function_name
|
||||||
|
* @param array $arguments
|
||||||
|
* @param array|null $options
|
||||||
|
* @param null $input_headers
|
||||||
|
* @param array|null $output_headers
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function __soapCall($function_name, $arguments, $options = null, $input_headers = null, &$output_headers = null)
|
||||||
|
{
|
||||||
|
return $this->soapCall($function_name, $arguments, $options, $input_headers, $output_headers)->getResponseContent();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is not performing any HTTP requests, but it is getting data from SoapClient that are needed for this Client
|
||||||
|
*
|
||||||
|
* @param string $request Request string
|
||||||
|
* @param string $location Location
|
||||||
|
* @param string $action SOAP action
|
||||||
|
* @param int $version SOAP version
|
||||||
|
* @param int $oneWay 0|1
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function __doRequest($request, $location, $action, $version, $oneWay = 0)
|
||||||
|
{
|
||||||
|
$soapResponse = $this->performSoapRequest(
|
||||||
|
$request,
|
||||||
|
$location,
|
||||||
|
$action,
|
||||||
|
$version,
|
||||||
|
$this->getSoapAttachmentsOnRequestFromStorage()
|
||||||
|
);
|
||||||
|
$this->setSoapResponseToStorage($soapResponse);
|
||||||
|
|
||||||
|
return $soapResponse->getResponseContent();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @deprecated */
|
||||||
|
public function __getLastRequestHeaders()
|
||||||
|
{
|
||||||
|
$this->checkTracing();
|
||||||
|
|
||||||
|
throw new Exception(
|
||||||
|
'The __getLastRequestHeaders method is now deprecated. Use callSoapRequest instead and get the tracing information from SoapResponseTracingData.'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @deprecated */
|
||||||
|
public function __getLastRequest()
|
||||||
|
{
|
||||||
|
$this->checkTracing();
|
||||||
|
|
||||||
|
throw new Exception(
|
||||||
|
'The __getLastRequest method is now deprecated. Use callSoapRequest instead and get the tracing information from SoapResponseTracingData.'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @deprecated */
|
||||||
|
public function __getLastResponseHeaders()
|
||||||
|
{
|
||||||
|
$this->checkTracing();
|
||||||
|
|
||||||
|
throw new Exception(
|
||||||
|
'The __getLastResponseHeaders method is now deprecated. Use callSoapRequest instead and get the tracing information from SoapResponseTracingData.'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @deprecated */
|
||||||
|
public function __getLastResponse()
|
||||||
|
{
|
||||||
|
$this->checkTracing();
|
||||||
|
|
||||||
|
throw new Exception(
|
||||||
|
'The __getLastResponse method is now deprecated. Use callSoapRequest instead and get the tracing information from SoapResponseTracingData.'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function checkTracing()
|
||||||
|
{
|
||||||
|
if ($this->getSoapClientOptions()->getTrace() === false) {
|
||||||
|
throw new Exception('SoapClientOptions tracing disabled, turn on trace attribute');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private function setSoapResponseToStorage(SoapResponse $soapResponseStorage)
|
||||||
|
{
|
||||||
|
$this->soapResponseStorage = $soapResponseStorage;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param SoapAttachment[] $soapAttachments
|
||||||
|
*/
|
||||||
|
private function setSoapAttachmentsOnRequestToStorage(array $soapAttachments)
|
||||||
|
{
|
||||||
|
$this->soapAttachmentsOnRequestStorage = $soapAttachments;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getSoapAttachmentsOnRequestFromStorage()
|
||||||
|
{
|
||||||
|
$soapAttachmentsOnRequest = $this->soapAttachmentsOnRequestStorage;
|
||||||
|
$this->soapAttachmentsOnRequestStorage = null;
|
||||||
|
|
||||||
|
return $soapAttachmentsOnRequest;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getSoapResponseFromStorage()
|
||||||
|
{
|
||||||
|
$soapResponse = $this->soapResponseStorage;
|
||||||
|
$this->soapResponseStorage = null;
|
||||||
|
|
||||||
|
return $soapResponse;
|
||||||
|
}
|
||||||
|
}
|
105
src/BeSimple/SoapClient/SoapClientOptionsBuilder.php
Normal file
105
src/BeSimple/SoapClient/SoapClientOptionsBuilder.php
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
<?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\SoapClient\Curl\CurlOptions;
|
||||||
|
use BeSimple\SoapClient\SoapOptions\SoapClientOptions;
|
||||||
|
use BeSimple\SoapClient\SoapServerAuthentication\SoapServerAuthenticationInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides a SoapClient instance.
|
||||||
|
*
|
||||||
|
* @author Francis Besset <francis.besset@gmail.com>
|
||||||
|
* @author Christian Kerl <christian-kerl@web.de>
|
||||||
|
* @author Petr Bechyně <mail@petrbechyne.com>
|
||||||
|
*/
|
||||||
|
class SoapClientOptionsBuilder
|
||||||
|
{
|
||||||
|
public static function createWithDefaults()
|
||||||
|
{
|
||||||
|
return new SoapClientOptions(
|
||||||
|
SoapClientOptions::SOAP_CLIENT_TRACE_ON,
|
||||||
|
SoapClientOptions::SOAP_CLIENT_EXCEPTIONS_ON,
|
||||||
|
CurlOptions::DEFAULT_USER_AGENT,
|
||||||
|
SoapClientOptions::SOAP_CLIENT_COMPRESSION_NONE
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function createWithTracing()
|
||||||
|
{
|
||||||
|
return new SoapClientOptions(
|
||||||
|
SoapClientOptions::SOAP_CLIENT_TRACE_ON,
|
||||||
|
SoapClientOptions::SOAP_CLIENT_EXCEPTIONS_ON,
|
||||||
|
CurlOptions::DEFAULT_USER_AGENT,
|
||||||
|
SoapClientOptions::SOAP_CLIENT_COMPRESSION_NONE
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function createWithEndpointLocation($endpointLocation)
|
||||||
|
{
|
||||||
|
return new SoapClientOptions(
|
||||||
|
SoapClientOptions::SOAP_CLIENT_TRACE_ON,
|
||||||
|
SoapClientOptions::SOAP_CLIENT_EXCEPTIONS_ON,
|
||||||
|
CurlOptions::DEFAULT_USER_AGENT,
|
||||||
|
SoapClientOptions::SOAP_CLIENT_COMPRESSION_NONE,
|
||||||
|
SoapClientOptions::SOAP_CLIENT_AUTHENTICATION_NONE,
|
||||||
|
SoapClientOptions::SOAP_CLIENT_PROXY_NONE,
|
||||||
|
$endpointLocation
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function createWithAuthentication(SoapServerAuthenticationInterface $authentication)
|
||||||
|
{
|
||||||
|
return new SoapClientOptions(
|
||||||
|
SoapClientOptions::SOAP_CLIENT_TRACE_ON,
|
||||||
|
SoapClientOptions::SOAP_CLIENT_EXCEPTIONS_ON,
|
||||||
|
CurlOptions::DEFAULT_USER_AGENT,
|
||||||
|
SoapClientOptions::SOAP_CLIENT_COMPRESSION_NONE,
|
||||||
|
$authentication
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function createWithAuthenticationAndEndpointLocation($endpointLocation, SoapServerAuthenticationInterface $authentication)
|
||||||
|
{
|
||||||
|
return new SoapClientOptions(
|
||||||
|
SoapClientOptions::SOAP_CLIENT_TRACE_ON,
|
||||||
|
SoapClientOptions::SOAP_CLIENT_EXCEPTIONS_ON,
|
||||||
|
CurlOptions::DEFAULT_USER_AGENT,
|
||||||
|
SoapClientOptions::SOAP_CLIENT_COMPRESSION_NONE,
|
||||||
|
$authentication,
|
||||||
|
SoapClientOptions::SOAP_CLIENT_PROXY_NONE,
|
||||||
|
$endpointLocation
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param SoapServerAuthenticationInterface $authentication
|
||||||
|
* @param bool $resolveRemoteIncludes
|
||||||
|
* @return SoapClientOptions
|
||||||
|
*/
|
||||||
|
public static function createWithAuthenticationAndResolveRemoteIncludes(
|
||||||
|
SoapServerAuthenticationInterface $authentication,
|
||||||
|
$resolveRemoteIncludes
|
||||||
|
) {
|
||||||
|
return new SoapClientOptions(
|
||||||
|
SoapClientOptions::SOAP_CLIENT_TRACE_ON,
|
||||||
|
SoapClientOptions::SOAP_CLIENT_EXCEPTIONS_ON,
|
||||||
|
CurlOptions::DEFAULT_USER_AGENT,
|
||||||
|
SoapClientOptions::SOAP_CLIENT_COMPRESSION_NONE,
|
||||||
|
$authentication,
|
||||||
|
SoapClientOptions::SOAP_CLIENT_PROXY_NONE,
|
||||||
|
SoapClientOptions::SOAP_CLIENT_ENDPOINT_LOCATION_NONE,
|
||||||
|
$resolveRemoteIncludes
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
21
src/BeSimple/SoapClient/SoapFaultWithTracingData.php
Normal file
21
src/BeSimple/SoapClient/SoapFaultWithTracingData.php
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace BeSimple\SoapClient;
|
||||||
|
|
||||||
|
use SoapFault;
|
||||||
|
|
||||||
|
class SoapFaultWithTracingData extends SoapFault
|
||||||
|
{
|
||||||
|
private $soapResponseTracingData;
|
||||||
|
|
||||||
|
public function __construct($code = 0, $message = "", SoapResponseTracingData $soapResponseTracingData)
|
||||||
|
{
|
||||||
|
$this->soapResponseTracingData = $soapResponseTracingData;
|
||||||
|
parent::__construct($code, $message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getSoapResponseTracingData()
|
||||||
|
{
|
||||||
|
return $this->soapResponseTracingData;
|
||||||
|
}
|
||||||
|
}
|
@ -1,47 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is part of the BeSimpleSoapCommon.
|
|
||||||
*
|
|
||||||
* (c) Christian Kerl <christian-kerl@web.de>
|
|
||||||
* (c) Francis Besset <francis.besset@gmail.com>
|
|
||||||
* (c) Andreas Schamberger <mail@andreass.net>
|
|
||||||
*
|
|
||||||
* 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\SoapKernel as CommonSoapKernel;
|
|
||||||
use BeSimple\SoapCommon\SoapRequest as CommonSoapRequest;
|
|
||||||
use BeSimple\SoapCommon\SoapResponse as CommonSoapResponse;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* SoapKernel for Client.
|
|
||||||
*
|
|
||||||
* @author Andreas Schamberger <mail@andreass.net>
|
|
||||||
*/
|
|
||||||
class SoapKernel extends CommonSoapKernel
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
|
||||||
public function filterRequest(CommonSoapRequest $request)
|
|
||||||
{
|
|
||||||
$request->setAttachments($this->attachments);
|
|
||||||
$this->attachments = array();
|
|
||||||
|
|
||||||
parent::filterRequest($request);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
|
||||||
public function filterResponse(CommonSoapResponse $response)
|
|
||||||
{
|
|
||||||
parent::filterResponse($response);
|
|
||||||
|
|
||||||
$this->attachments = $response->getAttachments();
|
|
||||||
}
|
|
||||||
}
|
|
157
src/BeSimple/SoapClient/SoapOptions/SoapClientOptions.php
Normal file
157
src/BeSimple/SoapClient/SoapOptions/SoapClientOptions.php
Normal file
@ -0,0 +1,157 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace BeSimple\SoapClient\SoapOptions;
|
||||||
|
|
||||||
|
use BeSimple\SoapClient\Curl\CurlOptions;
|
||||||
|
use BeSimple\SoapClient\SoapServerAuthentication\SoapServerAuthenticationBasic;
|
||||||
|
use BeSimple\SoapClient\SoapServerAuthentication\SoapServerAuthenticationDigest;
|
||||||
|
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 = CurlOptions::SOAP_COMPRESSION_NONE;
|
||||||
|
const SOAP_CLIENT_COMPRESSION_GZIP = CurlOptions::SOAP_COMPRESSION_GZIP;
|
||||||
|
const SOAP_CLIENT_COMPRESSION_DEFLATE = CurlOptions::SOAP_COMPRESSION_DEFLATE;
|
||||||
|
const SOAP_CLIENT_AUTHENTICATION_NONE = null;
|
||||||
|
const SOAP_CLIENT_PROXY_NONE = null;
|
||||||
|
const SOAP_CLIENT_ENDPOINT_LOCATION_NONE = null;
|
||||||
|
const SOAP_CLIENT_RESOLVE_REMOTE_INCLUDES_ON = true;
|
||||||
|
const SOAP_CLIENT_RESOLVE_REMOTE_INCLUDES_OFF = false;
|
||||||
|
|
||||||
|
private $trace;
|
||||||
|
private $exceptions;
|
||||||
|
private $userAgent;
|
||||||
|
private $compression;
|
||||||
|
private $authentication;
|
||||||
|
private $proxy;
|
||||||
|
private $location;
|
||||||
|
private $resolveRemoteIncludes;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param bool $trace = self::SOAP_CLIENT_TRACE_ON|self::SOAP_CLIENT_TRACE_OFF
|
||||||
|
* @param bool $exceptions = self::SOAP_CLIENT_EXCEPTIONS_ON|self::SOAP_CLIENT_EXCEPTIONS_OFF
|
||||||
|
* @param string $userAgent
|
||||||
|
* @param int|null $compression = self::SOAP_CLIENT_COMPRESSION_NONE|self::SOAP_CLIENT_COMPRESSION_GZIP|self::SOAP_CLIENT_COMPRESSION_DEFLATE
|
||||||
|
* @param SoapServerAuthenticationInterface|null $authentication
|
||||||
|
* @param SoapServerProxy|null $proxy
|
||||||
|
* @param string|null $location
|
||||||
|
* @param bool $resolveRemoteIncludes = self::SOAP_CLIENT_RESOLVE_REMOTE_INCLUDES_ON|self::SOAP_CLIENT_RESOLVE_REMOTE_INCLUDES_OFF
|
||||||
|
*/
|
||||||
|
public function __construct(
|
||||||
|
$trace,
|
||||||
|
$exceptions,
|
||||||
|
$userAgent,
|
||||||
|
$compression = null,
|
||||||
|
SoapServerAuthenticationInterface $authentication = null,
|
||||||
|
SoapServerProxy $proxy = null,
|
||||||
|
$location = null,
|
||||||
|
$resolveRemoteIncludes = false
|
||||||
|
) {
|
||||||
|
$this->trace = $trace;
|
||||||
|
$this->exceptions = $exceptions;
|
||||||
|
$this->userAgent = $userAgent;
|
||||||
|
$this->compression = $compression;
|
||||||
|
$this->authentication = $authentication;
|
||||||
|
$this->proxy = $proxy;
|
||||||
|
$this->location = $location;
|
||||||
|
$this->resolveRemoteIncludes = $resolveRemoteIncludes;
|
||||||
|
}
|
||||||
|
|
||||||
|
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 hasAuthenticationBasic()
|
||||||
|
{
|
||||||
|
return $this->hasAuthentication() && $this->getAuthentication() instanceof SoapServerAuthenticationBasic;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function hasAuthenticationDigest()
|
||||||
|
{
|
||||||
|
return $this->hasAuthentication() && $this->getAuthentication() instanceof SoapServerAuthenticationDigest;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function hasProxy()
|
||||||
|
{
|
||||||
|
return $this->proxy !== null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function hasLocation()
|
||||||
|
{
|
||||||
|
return $this->location !== null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getAuthentication()
|
||||||
|
{
|
||||||
|
return $this->authentication;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getProxy()
|
||||||
|
{
|
||||||
|
return $this->proxy;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getLocation()
|
||||||
|
{
|
||||||
|
return $this->location;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function isResolveRemoteIncludes()
|
||||||
|
{
|
||||||
|
return $this->resolveRemoteIncludes;
|
||||||
|
}
|
||||||
|
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
if ($this->hasLocation()) {
|
||||||
|
$optionsAsArray['location'] = $this->getLocation();
|
||||||
|
}
|
||||||
|
|
||||||
|
return $optionsAsArray;
|
||||||
|
}
|
||||||
|
}
|
@ -1,48 +0,0 @@
|
|||||||
<?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;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,46 +1,61 @@
|
|||||||
<?php
|
<?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;
|
namespace BeSimple\SoapClient;
|
||||||
|
|
||||||
|
use BeSimple\SoapCommon\SoapRequest;
|
||||||
use BeSimple\SoapCommon\SoapResponse as CommonSoapResponse;
|
use BeSimple\SoapCommon\SoapResponse as CommonSoapResponse;
|
||||||
|
|
||||||
/**
|
|
||||||
* SoapResponse class for SoapClient. Provides factory function for response object.
|
|
||||||
*
|
|
||||||
* @author Andreas Schamberger <mail@andreass.net>
|
|
||||||
*/
|
|
||||||
class SoapResponse extends CommonSoapResponse
|
class SoapResponse extends CommonSoapResponse
|
||||||
{
|
{
|
||||||
/**
|
/** @var mixed */
|
||||||
* Factory function for SoapResponse.
|
protected $responseObject;
|
||||||
*
|
/** @var SoapResponseTracingData */
|
||||||
* @param string $content Content
|
protected $tracingData;
|
||||||
* @param string $location Location
|
/** @var SoapRequest */
|
||||||
* @param string $action SOAP action
|
protected $request;
|
||||||
* @param string $version SOAP version
|
|
||||||
* @param string $contentType Content type header
|
|
||||||
*
|
|
||||||
* @return BeSimple\SoapClient\SoapResponse
|
|
||||||
*/
|
|
||||||
public static function create($content, $location, $action, $version, $contentType)
|
|
||||||
{
|
|
||||||
$response = new SoapResponse();
|
|
||||||
$response->setContent($content);
|
|
||||||
$response->setLocation($location);
|
|
||||||
$response->setAction($action);
|
|
||||||
$response->setVersion($version);
|
|
||||||
$response->setContentType($contentType);
|
|
||||||
|
|
||||||
return $response;
|
public function getResponseContent()
|
||||||
|
{
|
||||||
|
return $this->getContent();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getResponseObject()
|
||||||
|
{
|
||||||
|
return $this->responseObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setResponseObject($responseObject)
|
||||||
|
{
|
||||||
|
$this->responseObject = $responseObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function hasTracingData()
|
||||||
|
{
|
||||||
|
return $this->tracingData !== null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getTracingData()
|
||||||
|
{
|
||||||
|
return $this->tracingData;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setTracingData(SoapResponseTracingData $tracingData)
|
||||||
|
{
|
||||||
|
$this->tracingData = $tracingData;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function hasRequest()
|
||||||
|
{
|
||||||
|
return $this->request !== null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setRequest(SoapRequest $request)
|
||||||
|
{
|
||||||
|
$this->request = $request;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getRequest()
|
||||||
|
{
|
||||||
|
return $this->request;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
91
src/BeSimple/SoapClient/SoapResponseFactory.php
Normal file
91
src/BeSimple/SoapClient/SoapResponseFactory.php
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
<?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\SoapBundle\Soap\SoapAttachment;
|
||||||
|
use BeSimple\SoapCommon\Mime\PartFactory;
|
||||||
|
use BeSimple\SoapCommon\SoapRequest;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SoapResponseFactory for SoapClient. Provides factory function for SoapResponse object.
|
||||||
|
*
|
||||||
|
* @author Andreas Schamberger <mail@andreass.net>
|
||||||
|
* @author Petr Bechyně <mail@petrbechyne.com>
|
||||||
|
*/
|
||||||
|
class SoapResponseFactory
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Factory method for SoapClient\SoapResponse.
|
||||||
|
*
|
||||||
|
* @param SoapRequest $soapRequest related request object
|
||||||
|
* @param string $content Content
|
||||||
|
* @param string $contentType Content type header
|
||||||
|
* @param SoapAttachment[] $attachments SOAP attachments
|
||||||
|
* @return SoapResponse
|
||||||
|
*/
|
||||||
|
public static function create(
|
||||||
|
SoapRequest $soapRequest,
|
||||||
|
$content,
|
||||||
|
$contentType,
|
||||||
|
array $attachments = []
|
||||||
|
) {
|
||||||
|
$response = new SoapResponse();
|
||||||
|
$response->setRequest($soapRequest);
|
||||||
|
$response->setContent($content);
|
||||||
|
$response->setLocation($soapRequest->getLocation());
|
||||||
|
$response->setAction($soapRequest->getAction());
|
||||||
|
$response->setVersion($soapRequest->getVersion());
|
||||||
|
$response->setContentType($contentType);
|
||||||
|
if (count($attachments) > 0) {
|
||||||
|
$response->setAttachments(
|
||||||
|
PartFactory::createAttachmentParts($attachments)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $response;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Factory method for SoapClient\SoapResponse with SoapResponseTracingData.
|
||||||
|
*
|
||||||
|
* @param SoapRequest $soapRequest related request object
|
||||||
|
* @param string $content Content
|
||||||
|
* @param string $contentType Content type header
|
||||||
|
* @param SoapResponseTracingData $tracingData Data value object suitable for tracing SOAP traffic
|
||||||
|
* @param SoapAttachment[] $attachments SOAP attachments
|
||||||
|
* @return SoapResponse
|
||||||
|
*/
|
||||||
|
public static function createWithTracingData(
|
||||||
|
SoapRequest $soapRequest,
|
||||||
|
$content,
|
||||||
|
$contentType,
|
||||||
|
SoapResponseTracingData $tracingData,
|
||||||
|
array $attachments = []
|
||||||
|
) {
|
||||||
|
$response = new SoapResponse();
|
||||||
|
$response->setRequest($soapRequest);
|
||||||
|
$response->setContent($content);
|
||||||
|
$response->setLocation($soapRequest->getLocation());
|
||||||
|
$response->setAction($soapRequest->getAction());
|
||||||
|
$response->setVersion($soapRequest->getVersion());
|
||||||
|
$response->setContentType($contentType);
|
||||||
|
$response->setTracingData($tracingData);
|
||||||
|
if (count($attachments) > 0) {
|
||||||
|
$response->setAttachments(
|
||||||
|
PartFactory::createAttachmentParts($attachments)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $response;
|
||||||
|
}
|
||||||
|
}
|
39
src/BeSimple/SoapClient/SoapResponseTracingData.php
Normal file
39
src/BeSimple/SoapClient/SoapResponseTracingData.php
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace BeSimple\SoapClient;
|
||||||
|
|
||||||
|
class SoapResponseTracingData
|
||||||
|
{
|
||||||
|
private $lastRequestHeaders;
|
||||||
|
private $lastRequest;
|
||||||
|
private $lastResponseHeaders;
|
||||||
|
private $lastResponse;
|
||||||
|
|
||||||
|
public function __construct($lastRequestHeaders, $lastRequest, $lastResponseHeaders, $lastResponse)
|
||||||
|
{
|
||||||
|
$this->lastRequestHeaders = $lastRequestHeaders;
|
||||||
|
$this->lastRequest = $lastRequest;
|
||||||
|
$this->lastResponseHeaders = $lastResponseHeaders;
|
||||||
|
$this->lastResponse = $lastResponse;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getLastRequestHeaders()
|
||||||
|
{
|
||||||
|
return $this->lastRequestHeaders;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getLastRequest()
|
||||||
|
{
|
||||||
|
return $this->lastRequest;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getLastResponseHeaders()
|
||||||
|
{
|
||||||
|
return $this->lastResponseHeaders;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getLastResponse()
|
||||||
|
{
|
||||||
|
return $this->lastResponse;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,39 @@
|
|||||||
|
<?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(),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,52 @@
|
|||||||
|
<?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;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,16 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace BeSimple\SoapClient\SoapServerAuthentication;
|
||||||
|
|
||||||
|
interface SoapServerAuthenticationInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
public function getAuthentication();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function toArray();
|
||||||
|
}
|
84
src/BeSimple/SoapClient/SoapServerProxy/SoapServerProxy.php
Normal file
84
src/BeSimple/SoapClient/SoapServerProxy/SoapServerProxy.php
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
<?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;
|
||||||
|
}
|
||||||
|
}
|
@ -1,56 +0,0 @@
|
|||||||
<?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\Tests;
|
|
||||||
|
|
||||||
use Symfony\Component\Process\PhpExecutableFinder;
|
|
||||||
use Symfony\Component\Process\ProcessBuilder;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author francis.besset@gmail.com <francis.besset@gmail.com>
|
|
||||||
*/
|
|
||||||
abstract class AbstractWebServerTest extends \PHPUnit_Framework_TestCase
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @var ProcessBuilder
|
|
||||||
*/
|
|
||||||
static protected $webserver;
|
|
||||||
static protected $websererPortLength;
|
|
||||||
|
|
||||||
public static function setUpBeforeClass()
|
|
||||||
{
|
|
||||||
if (version_compare(PHP_VERSION, '5.4.0', '<')) {
|
|
||||||
self::markTestSkipped('PHP Webserver is available from PHP 5.4');
|
|
||||||
}
|
|
||||||
|
|
||||||
$phpFinder = new PhpExecutableFinder();
|
|
||||||
self::$webserver = ProcessBuilder::create(array(
|
|
||||||
'exec', // used exec binary (https://github.com/symfony/symfony/issues/5759)
|
|
||||||
$phpFinder->find(),
|
|
||||||
'-S',
|
|
||||||
sprintf('localhost:%d', WEBSERVER_PORT),
|
|
||||||
'-t',
|
|
||||||
__DIR__.DIRECTORY_SEPARATOR.'Fixtures',
|
|
||||||
))->getProcess();
|
|
||||||
|
|
||||||
self::$webserver->start();
|
|
||||||
usleep(100000);
|
|
||||||
|
|
||||||
self::$websererPortLength = strlen(WEBSERVER_PORT);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static function tearDownAfterClass()
|
|
||||||
{
|
|
||||||
self::$webserver->stop(0);
|
|
||||||
usleep(100000);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,7 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace BeSimple\SoapClient\Tests\AxisInterop\Fixtures;
|
|
||||||
|
|
||||||
class AttachmentRequest extends AttachmentType
|
|
||||||
{
|
|
||||||
}
|
|
@ -1,9 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace BeSimple\SoapClient\Tests\AxisInterop\Fixtures;
|
|
||||||
|
|
||||||
class AttachmentType
|
|
||||||
{
|
|
||||||
public $fileName;
|
|
||||||
public $binaryData;
|
|
||||||
}
|
|
@ -1,11 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace BeSimple\SoapClient\Tests\AxisInterop\Fixtures;
|
|
||||||
|
|
||||||
class BookInformation
|
|
||||||
{
|
|
||||||
public $type;
|
|
||||||
public $isbn;
|
|
||||||
public $author;
|
|
||||||
public $title;
|
|
||||||
}
|
|
@ -1,89 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<definitions targetNamespace="http://ws.apache.org/axis2/mtomsample/" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://ws.apache.org/axis2/mtomsample/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xmime="http://www.w3.org/2005/05/xmlmime" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/">
|
|
||||||
<types>
|
|
||||||
<xsd:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://ws.apache.org/axis2/mtomsample/" xmlns="http://schemas.xmlsoap.org/wsdl/">
|
|
||||||
<xsd:import namespace="http://www.w3.org/2005/05/xmlmime"/>
|
|
||||||
<xsd:complexType name="AttachmentType">
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element minOccurs="0" name="fileName" type="xsd:string"/>
|
|
||||||
<xsd:element minOccurs="0" name="binaryData" type="xmime:base64Binary"/>
|
|
||||||
</xsd:sequence>
|
|
||||||
</xsd:complexType>
|
|
||||||
<xsd:element name="AttachmentRequest" type="tns:AttachmentType"/>
|
|
||||||
<xsd:element name="AttachmentResponse" type="xsd:string"/>
|
|
||||||
</xsd:schema>
|
|
||||||
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xmime="http://www.w3.org/2005/05/xmlmime" attributeFormDefault="unqualified" elementFormDefault="unqualified" targetNamespace="http://www.w3.org/2005/05/xmlmime">
|
|
||||||
<xs:attribute name="contentType">
|
|
||||||
<xs:simpleType>
|
|
||||||
<xs:restriction base="xs:string">
|
|
||||||
<xs:minLength value="3"/>
|
|
||||||
</xs:restriction>
|
|
||||||
</xs:simpleType>
|
|
||||||
</xs:attribute>
|
|
||||||
<xs:attribute name="expectedContentTypes" type="xs:string"/>
|
|
||||||
<xs:complexType name="base64Binary">
|
|
||||||
<xs:simpleContent>
|
|
||||||
<xs:extension base="xs:base64Binary">
|
|
||||||
<xs:attribute ref="xmime:contentType"/>
|
|
||||||
</xs:extension>
|
|
||||||
</xs:simpleContent>
|
|
||||||
</xs:complexType>
|
|
||||||
<xs:complexType name="hexBinary">
|
|
||||||
<xs:simpleContent>
|
|
||||||
<xs:extension base="xs:hexBinary">
|
|
||||||
<xs:attribute ref="xmime:contentType"/>
|
|
||||||
</xs:extension>
|
|
||||||
</xs:simpleContent>
|
|
||||||
</xs:complexType>
|
|
||||||
</xs:schema>
|
|
||||||
|
|
||||||
</types>
|
|
||||||
<message name="AttachmentResponse">
|
|
||||||
<part name="part1" element="tns:AttachmentResponse">
|
|
||||||
</part>
|
|
||||||
</message>
|
|
||||||
<message name="AttachmentRequest">
|
|
||||||
<part name="part1" element="tns:AttachmentRequest">
|
|
||||||
</part>
|
|
||||||
</message>
|
|
||||||
<portType name="MTOMServicePortType">
|
|
||||||
<operation name="attachment">
|
|
||||||
<input message="tns:AttachmentRequest" wsaw:Action="attachment">
|
|
||||||
</input>
|
|
||||||
<output message="tns:AttachmentResponse" wsaw:Action="http://schemas.xmlsoap.org/wsdl/MTOMServicePortType/AttachmentResponse">
|
|
||||||
</output>
|
|
||||||
</operation>
|
|
||||||
</portType>
|
|
||||||
<binding name="MTOMServiceSOAP11Binding" type="tns:MTOMServicePortType">
|
|
||||||
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
|
|
||||||
<operation name="attachment">
|
|
||||||
<soap:operation soapAction="attachment" style="document"/>
|
|
||||||
<input>
|
|
||||||
<soap:body use="literal"/>
|
|
||||||
</input>
|
|
||||||
<output>
|
|
||||||
<soap:body use="literal"/>
|
|
||||||
</output>
|
|
||||||
</operation>
|
|
||||||
</binding>
|
|
||||||
<binding name="MTOMServiceSOAP12Binding" type="tns:MTOMServicePortType">
|
|
||||||
<soap12:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
|
|
||||||
<operation name="attachment">
|
|
||||||
<soap12:operation soapAction="attachment" style="document"/>
|
|
||||||
<input>
|
|
||||||
<soap12:body use="literal"/>
|
|
||||||
</input>
|
|
||||||
<output>
|
|
||||||
<soap12:body use="literal"/>
|
|
||||||
</output>
|
|
||||||
</operation>
|
|
||||||
</binding>
|
|
||||||
<service name="MTOMSample">
|
|
||||||
<port name="MTOMSampleSOAP12port_http" binding="tns:MTOMServiceSOAP12Binding">
|
|
||||||
<soap12:address location="http://localhost:8080/axis2/services/MTOMSample.MTOMSampleSOAP12port_http/"/>
|
|
||||||
</port>
|
|
||||||
<port name="MTOMSampleSOAP11port_http" binding="tns:MTOMServiceSOAP11Binding">
|
|
||||||
<soap:address location="http://localhost:8080/axis2/services/MTOMSample.MTOMSampleSOAP11port_http/"/>
|
|
||||||
</port>
|
|
||||||
</service>
|
|
||||||
</definitions>
|
|
@ -1,162 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:ns1="http://org.apache.axis2/xsd" xmlns:ns="http://service.besimple" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" targetNamespace="http://service.besimple">
|
|
||||||
<wsdl:documentation>BeSimpleSwaService</wsdl:documentation>
|
|
||||||
<wsdl:types>
|
|
||||||
<xs:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://service.besimple">
|
|
||||||
<xs:complexType name="Exception">
|
|
||||||
<xs:sequence>
|
|
||||||
<xs:element minOccurs="0" name="Exception" nillable="true" type="xs:anyType"/>
|
|
||||||
</xs:sequence>
|
|
||||||
</xs:complexType>
|
|
||||||
<xs:element name="Exception">
|
|
||||||
<xs:complexType>
|
|
||||||
<xs:sequence>
|
|
||||||
<xs:element minOccurs="0" name="Exception" nillable="true" type="ns:Exception"/>
|
|
||||||
</xs:sequence>
|
|
||||||
</xs:complexType>
|
|
||||||
</xs:element>
|
|
||||||
<xs:element name="uploadFile">
|
|
||||||
<xs:complexType>
|
|
||||||
<xs:sequence>
|
|
||||||
<xs:element minOccurs="0" name="data" nillable="true" type="xs:base64Binary"/>
|
|
||||||
<xs:element minOccurs="0" name="name" nillable="true" type="xs:string"/>
|
|
||||||
</xs:sequence>
|
|
||||||
</xs:complexType>
|
|
||||||
</xs:element>
|
|
||||||
<xs:element name="uploadFileResponse">
|
|
||||||
<xs:complexType>
|
|
||||||
<xs:sequence>
|
|
||||||
<xs:element minOccurs="0" name="return" nillable="true" type="xs:string"/>
|
|
||||||
</xs:sequence>
|
|
||||||
</xs:complexType>
|
|
||||||
</xs:element>
|
|
||||||
<xs:element name="downloadFile">
|
|
||||||
<xs:complexType>
|
|
||||||
<xs:sequence>
|
|
||||||
<xs:element minOccurs="0" name="name" nillable="true" type="xs:string"/>
|
|
||||||
</xs:sequence>
|
|
||||||
</xs:complexType>
|
|
||||||
</xs:element>
|
|
||||||
<xs:element name="downloadFileResponse">
|
|
||||||
<xs:complexType>
|
|
||||||
<xs:sequence>
|
|
||||||
<xs:element minOccurs="0" name="data" nillable="true" type="xs:base64Binary"/>
|
|
||||||
</xs:sequence>
|
|
||||||
</xs:complexType>
|
|
||||||
</xs:element>
|
|
||||||
</xs:schema>
|
|
||||||
</wsdl:types>
|
|
||||||
<wsdl:message name="downloadFileRequest">
|
|
||||||
<wsdl:part name="parameters" element="ns:downloadFile"/>
|
|
||||||
</wsdl:message>
|
|
||||||
<wsdl:message name="downloadFileResponse">
|
|
||||||
<wsdl:part name="parameters" element="ns:downloadFileResponse"/>
|
|
||||||
</wsdl:message>
|
|
||||||
<wsdl:message name="Exception">
|
|
||||||
<wsdl:part name="parameters" element="ns:Exception"/>
|
|
||||||
</wsdl:message>
|
|
||||||
<wsdl:message name="uploadFileRequest">
|
|
||||||
<wsdl:part name="parameters" element="ns:uploadFile"/>
|
|
||||||
</wsdl:message>
|
|
||||||
<wsdl:message name="uploadFileResponse">
|
|
||||||
<wsdl:part name="parameters" element="ns:uploadFileResponse"/>
|
|
||||||
</wsdl:message>
|
|
||||||
<wsdl:portType name="BeSimpleSwaServicePortType">
|
|
||||||
<wsdl:operation name="downloadFile">
|
|
||||||
<wsdl:input message="ns:downloadFileRequest" wsaw:Action="urn:downloadFile"/>
|
|
||||||
<wsdl:output message="ns:downloadFileResponse" wsaw:Action="urn:downloadFileResponse"/>
|
|
||||||
<wsdl:fault message="ns:Exception" name="Exception" wsaw:Action="urn:downloadFileException"/>
|
|
||||||
</wsdl:operation>
|
|
||||||
<wsdl:operation name="uploadFile">
|
|
||||||
<wsdl:input message="ns:uploadFileRequest" wsaw:Action="urn:uploadFile"/>
|
|
||||||
<wsdl:output message="ns:uploadFileResponse" wsaw:Action="urn:uploadFileResponse"/>
|
|
||||||
<wsdl:fault message="ns:Exception" name="Exception" wsaw:Action="urn:uploadFileException"/>
|
|
||||||
</wsdl:operation>
|
|
||||||
</wsdl:portType>
|
|
||||||
<wsdl:binding name="BeSimpleSwaServiceSoap11Binding" type="ns:BeSimpleSwaServicePortType">
|
|
||||||
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
|
|
||||||
<wsdl:operation name="downloadFile">
|
|
||||||
<soap:operation soapAction="urn:downloadFile" style="document"/>
|
|
||||||
<wsdl:input>
|
|
||||||
<soap:body use="literal"/>
|
|
||||||
</wsdl:input>
|
|
||||||
<wsdl:output>
|
|
||||||
<soap:body use="literal"/>
|
|
||||||
</wsdl:output>
|
|
||||||
<wsdl:fault name="Exception">
|
|
||||||
<soap:fault use="literal" name="Exception"/>
|
|
||||||
</wsdl:fault>
|
|
||||||
</wsdl:operation>
|
|
||||||
<wsdl:operation name="uploadFile">
|
|
||||||
<soap:operation soapAction="urn:uploadFile" style="document"/>
|
|
||||||
<wsdl:input>
|
|
||||||
<soap:body use="literal"/>
|
|
||||||
</wsdl:input>
|
|
||||||
<wsdl:output>
|
|
||||||
<soap:body use="literal"/>
|
|
||||||
</wsdl:output>
|
|
||||||
<wsdl:fault name="Exception">
|
|
||||||
<soap:fault use="literal" name="Exception"/>
|
|
||||||
</wsdl:fault>
|
|
||||||
</wsdl:operation>
|
|
||||||
</wsdl:binding>
|
|
||||||
<wsdl:binding name="BeSimpleSwaServiceSoap12Binding" type="ns:BeSimpleSwaServicePortType">
|
|
||||||
<soap12:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
|
|
||||||
<wsdl:operation name="downloadFile">
|
|
||||||
<soap12:operation soapAction="urn:downloadFile" style="document"/>
|
|
||||||
<wsdl:input>
|
|
||||||
<soap12:body use="literal"/>
|
|
||||||
</wsdl:input>
|
|
||||||
<wsdl:output>
|
|
||||||
<soap12:body use="literal"/>
|
|
||||||
</wsdl:output>
|
|
||||||
<wsdl:fault name="Exception">
|
|
||||||
<soap12:fault use="literal" name="Exception"/>
|
|
||||||
</wsdl:fault>
|
|
||||||
</wsdl:operation>
|
|
||||||
<wsdl:operation name="uploadFile">
|
|
||||||
<soap12:operation soapAction="urn:uploadFile" style="document"/>
|
|
||||||
<wsdl:input>
|
|
||||||
<soap12:body use="literal"/>
|
|
||||||
</wsdl:input>
|
|
||||||
<wsdl:output>
|
|
||||||
<soap12:body use="literal"/>
|
|
||||||
</wsdl:output>
|
|
||||||
<wsdl:fault name="Exception">
|
|
||||||
<soap12:fault use="literal" name="Exception"/>
|
|
||||||
</wsdl:fault>
|
|
||||||
</wsdl:operation>
|
|
||||||
</wsdl:binding>
|
|
||||||
<wsdl:binding name="BeSimpleSwaServiceHttpBinding" type="ns:BeSimpleSwaServicePortType">
|
|
||||||
<http:binding verb="POST"/>
|
|
||||||
<wsdl:operation name="downloadFile">
|
|
||||||
<http:operation location="BeSimpleSwaService/downloadFile"/>
|
|
||||||
<wsdl:input>
|
|
||||||
<mime:content type="text/xml" part="downloadFile"/>
|
|
||||||
</wsdl:input>
|
|
||||||
<wsdl:output>
|
|
||||||
<mime:content type="text/xml" part="downloadFile"/>
|
|
||||||
</wsdl:output>
|
|
||||||
</wsdl:operation>
|
|
||||||
<wsdl:operation name="uploadFile">
|
|
||||||
<http:operation location="BeSimpleSwaService/uploadFile"/>
|
|
||||||
<wsdl:input>
|
|
||||||
<mime:content type="text/xml" part="uploadFile"/>
|
|
||||||
</wsdl:input>
|
|
||||||
<wsdl:output>
|
|
||||||
<mime:content type="text/xml" part="uploadFile"/>
|
|
||||||
</wsdl:output>
|
|
||||||
</wsdl:operation>
|
|
||||||
</wsdl:binding>
|
|
||||||
<wsdl:service name="BeSimpleSwaService">
|
|
||||||
<wsdl:port name="BeSimpleSwaServiceHttpSoap11Endpoint" binding="ns:BeSimpleSwaServiceSoap11Binding">
|
|
||||||
<soap:address location="http://localhost:8080/axis2/services/BeSimpleSwaService.BeSimpleSwaServiceHttpSoap11Endpoint/"/>
|
|
||||||
</wsdl:port>
|
|
||||||
<wsdl:port name="BeSimpleSwaServiceHttpSoap12Endpoint" binding="ns:BeSimpleSwaServiceSoap12Binding">
|
|
||||||
<soap12:address location="http://localhost:8080/axis2/services/BeSimpleSwaService.BeSimpleSwaServiceHttpSoap12Endpoint/"/>
|
|
||||||
</wsdl:port>
|
|
||||||
<wsdl:port name="BeSimpleSwaServiceHttpEndpoint" binding="ns:BeSimpleSwaServiceHttpBinding">
|
|
||||||
<http:address location="http://localhost:8080/axis2/services/BeSimpleSwaService.BeSimpleSwaServiceHttpEndpoint/"/>
|
|
||||||
</wsdl:port>
|
|
||||||
</wsdl:service>
|
|
||||||
</wsdl:definitions>
|
|
@ -1,184 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<wsdl:definitions targetNamespace="http://ws.sosnoski.com/library/wsdl"
|
|
||||||
xmlns:wns="http://ws.sosnoski.com/library/wsdl"
|
|
||||||
xmlns:tns="http://ws.sosnoski.com/library/types"
|
|
||||||
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
|
|
||||||
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/">
|
|
||||||
<wsdl:types>
|
|
||||||
|
|
||||||
<schema elementFormDefault="qualified"
|
|
||||||
targetNamespace="http://ws.sosnoski.com/library/wsdl"
|
|
||||||
xmlns="http://www.w3.org/2001/XMLSchema">
|
|
||||||
|
|
||||||
<import namespace="http://ws.sosnoski.com/library/types"/>
|
|
||||||
|
|
||||||
<element name="getBook">
|
|
||||||
<complexType>
|
|
||||||
<sequence>
|
|
||||||
<element name="isbn" type="string"/>
|
|
||||||
</sequence>
|
|
||||||
</complexType>
|
|
||||||
</element>
|
|
||||||
|
|
||||||
<element name="getBookResponse">
|
|
||||||
<complexType>
|
|
||||||
<sequence>
|
|
||||||
<element name="getBookReturn" minOccurs="0" type="tns:BookInformation"/>
|
|
||||||
</sequence>
|
|
||||||
</complexType>
|
|
||||||
</element>
|
|
||||||
|
|
||||||
<element name="getBooksByType">
|
|
||||||
<complexType>
|
|
||||||
<sequence>
|
|
||||||
<element name="type" type="string"/>
|
|
||||||
</sequence>
|
|
||||||
</complexType>
|
|
||||||
</element>
|
|
||||||
|
|
||||||
<element name="getBooksByTypeResponse">
|
|
||||||
<complexType>
|
|
||||||
<sequence>
|
|
||||||
<element name="getBooksByTypeReturn" minOccurs="0" maxOccurs="unbounded" type="tns:BookInformation"/>
|
|
||||||
</sequence>
|
|
||||||
</complexType>
|
|
||||||
</element>
|
|
||||||
|
|
||||||
<element name="addBook">
|
|
||||||
<complexType>
|
|
||||||
<sequence>
|
|
||||||
<element name="type" type="string"/>
|
|
||||||
<element name="isbn" type="string"/>
|
|
||||||
<element name="author" minOccurs="0" maxOccurs="unbounded" type="string"/>
|
|
||||||
<element name="title" type="string"/>
|
|
||||||
</sequence>
|
|
||||||
</complexType>
|
|
||||||
</element>
|
|
||||||
|
|
||||||
<element name="addBookResponse">
|
|
||||||
<complexType>
|
|
||||||
<sequence>
|
|
||||||
<element name="addBookReturn" type="boolean"/>
|
|
||||||
</sequence>
|
|
||||||
</complexType>
|
|
||||||
</element>
|
|
||||||
|
|
||||||
</schema>
|
|
||||||
|
|
||||||
<schema elementFormDefault="qualified"
|
|
||||||
targetNamespace="http://ws.sosnoski.com/library/types"
|
|
||||||
xmlns="http://www.w3.org/2001/XMLSchema">
|
|
||||||
|
|
||||||
<complexType name="BookInformation">
|
|
||||||
<sequence>
|
|
||||||
<element name="author" minOccurs="0" maxOccurs="unbounded" type="string"/>
|
|
||||||
<element name="title" type="string"/>
|
|
||||||
</sequence>
|
|
||||||
<attribute name="type" use="required" type="string"/>
|
|
||||||
<attribute name="isbn" use="required" type="string"/>
|
|
||||||
</complexType>
|
|
||||||
|
|
||||||
</schema>
|
|
||||||
|
|
||||||
</wsdl:types>
|
|
||||||
|
|
||||||
<wsdl:message name="getBookRequest">
|
|
||||||
<wsdl:part element="wns:getBook" name="parameters"/>
|
|
||||||
</wsdl:message>
|
|
||||||
|
|
||||||
<wsdl:message name="getBookResponse">
|
|
||||||
<wsdl:part element="wns:getBookResponse" name="parameters"/>
|
|
||||||
</wsdl:message>
|
|
||||||
|
|
||||||
<wsdl:message name="getBooksByTypeRequest">
|
|
||||||
<wsdl:part element="wns:getBooksByType" name="parameters"/>
|
|
||||||
</wsdl:message>
|
|
||||||
|
|
||||||
<wsdl:message name="getBooksByTypeResponse">
|
|
||||||
<wsdl:part element="wns:getBooksByTypeResponse" name="parameters"/>
|
|
||||||
</wsdl:message>
|
|
||||||
|
|
||||||
<wsdl:message name="addBookRequest">
|
|
||||||
<wsdl:part element="wns:addBook" name="parameters"/>
|
|
||||||
</wsdl:message>
|
|
||||||
|
|
||||||
<wsdl:message name="addBookResponse">
|
|
||||||
<wsdl:part element="wns:addBookResponse" name="parameters"/>
|
|
||||||
</wsdl:message>
|
|
||||||
|
|
||||||
<wsdl:portType name="Library">
|
|
||||||
|
|
||||||
<wsdl:operation name="getBook">
|
|
||||||
<wsdl:input message="wns:getBookRequest" name="getBookRequest"/>
|
|
||||||
<wsdl:output message="wns:getBookResponse" name="getBookResponse"/>
|
|
||||||
</wsdl:operation>
|
|
||||||
|
|
||||||
<wsdl:operation name="getBooksByType">
|
|
||||||
<wsdl:input message="wns:getBooksByTypeRequest" name="getBooksByTypeRequest"/>
|
|
||||||
<wsdl:output message="wns:getBooksByTypeResponse" name="getBooksByTypeResponse"/>
|
|
||||||
</wsdl:operation>
|
|
||||||
|
|
||||||
<wsdl:operation name="addBook">
|
|
||||||
<wsdl:input message="wns:addBookRequest" name="addBookRequest"/>
|
|
||||||
<wsdl:output message="wns:addBookResponse" name="addBookResponse"/>
|
|
||||||
</wsdl:operation>
|
|
||||||
|
|
||||||
</wsdl:portType>
|
|
||||||
|
|
||||||
<wsdl:binding name="LibrarySoapBinding" type="wns:Library">
|
|
||||||
|
|
||||||
<wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
|
|
||||||
|
|
||||||
<wsdl:operation name="getBook">
|
|
||||||
|
|
||||||
<wsdlsoap:operation soapAction="urn:getBook"/>
|
|
||||||
|
|
||||||
<wsdl:input name="getBookRequest">
|
|
||||||
<wsdlsoap:body use="literal"/>
|
|
||||||
</wsdl:input>
|
|
||||||
|
|
||||||
<wsdl:output name="getBookResponse">
|
|
||||||
<wsdlsoap:body use="literal"/>
|
|
||||||
</wsdl:output>
|
|
||||||
|
|
||||||
</wsdl:operation>
|
|
||||||
|
|
||||||
<wsdl:operation name="getBooksByType">
|
|
||||||
|
|
||||||
<wsdlsoap:operation soapAction="urn:getBooksByType"/>
|
|
||||||
|
|
||||||
<wsdl:input name="getBooksByTypeRequest">
|
|
||||||
<wsdlsoap:body use="literal"/>
|
|
||||||
</wsdl:input>
|
|
||||||
|
|
||||||
<wsdl:output name="getBooksByTypeResponse">
|
|
||||||
<wsdlsoap:body use="literal"/>
|
|
||||||
</wsdl:output>
|
|
||||||
|
|
||||||
</wsdl:operation>
|
|
||||||
|
|
||||||
<wsdl:operation name="addBook">
|
|
||||||
|
|
||||||
<wsdlsoap:operation soapAction="urn:addBook"/>
|
|
||||||
|
|
||||||
<wsdl:input name="addBookRequest">
|
|
||||||
<wsdlsoap:body use="literal"/>
|
|
||||||
</wsdl:input>
|
|
||||||
|
|
||||||
<wsdl:output name="addBookResponse">
|
|
||||||
<wsdlsoap:body use="literal"/>
|
|
||||||
</wsdl:output>
|
|
||||||
|
|
||||||
</wsdl:operation>
|
|
||||||
|
|
||||||
</wsdl:binding>
|
|
||||||
|
|
||||||
<wsdl:service name="library-signencr">
|
|
||||||
|
|
||||||
<wsdl:port binding="wns:LibrarySoapBinding" name="library">
|
|
||||||
<wsdlsoap:address location="http://localhost:8080/axis2/services/library-signencr"/>
|
|
||||||
</wsdl:port>
|
|
||||||
|
|
||||||
</wsdl:service>
|
|
||||||
|
|
||||||
</wsdl:definitions>
|
|
@ -1,184 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<wsdl:definitions targetNamespace="http://ws.sosnoski.com/library/wsdl"
|
|
||||||
xmlns:wns="http://ws.sosnoski.com/library/wsdl"
|
|
||||||
xmlns:tns="http://ws.sosnoski.com/library/types"
|
|
||||||
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
|
|
||||||
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/">
|
|
||||||
<wsdl:types>
|
|
||||||
|
|
||||||
<schema elementFormDefault="qualified"
|
|
||||||
targetNamespace="http://ws.sosnoski.com/library/wsdl"
|
|
||||||
xmlns="http://www.w3.org/2001/XMLSchema">
|
|
||||||
|
|
||||||
<import namespace="http://ws.sosnoski.com/library/types"/>
|
|
||||||
|
|
||||||
<element name="getBook">
|
|
||||||
<complexType>
|
|
||||||
<sequence>
|
|
||||||
<element name="isbn" type="string"/>
|
|
||||||
</sequence>
|
|
||||||
</complexType>
|
|
||||||
</element>
|
|
||||||
|
|
||||||
<element name="getBookResponse">
|
|
||||||
<complexType>
|
|
||||||
<sequence>
|
|
||||||
<element name="getBookReturn" minOccurs="0" type="tns:BookInformation"/>
|
|
||||||
</sequence>
|
|
||||||
</complexType>
|
|
||||||
</element>
|
|
||||||
|
|
||||||
<element name="getBooksByType">
|
|
||||||
<complexType>
|
|
||||||
<sequence>
|
|
||||||
<element name="type" type="string"/>
|
|
||||||
</sequence>
|
|
||||||
</complexType>
|
|
||||||
</element>
|
|
||||||
|
|
||||||
<element name="getBooksByTypeResponse">
|
|
||||||
<complexType>
|
|
||||||
<sequence>
|
|
||||||
<element name="getBooksByTypeReturn" minOccurs="0" maxOccurs="unbounded" type="tns:BookInformation"/>
|
|
||||||
</sequence>
|
|
||||||
</complexType>
|
|
||||||
</element>
|
|
||||||
|
|
||||||
<element name="addBook">
|
|
||||||
<complexType>
|
|
||||||
<sequence>
|
|
||||||
<element name="type" type="string"/>
|
|
||||||
<element name="isbn" type="string"/>
|
|
||||||
<element name="author" minOccurs="0" maxOccurs="unbounded" type="string"/>
|
|
||||||
<element name="title" type="string"/>
|
|
||||||
</sequence>
|
|
||||||
</complexType>
|
|
||||||
</element>
|
|
||||||
|
|
||||||
<element name="addBookResponse">
|
|
||||||
<complexType>
|
|
||||||
<sequence>
|
|
||||||
<element name="addBookReturn" type="boolean"/>
|
|
||||||
</sequence>
|
|
||||||
</complexType>
|
|
||||||
</element>
|
|
||||||
|
|
||||||
</schema>
|
|
||||||
|
|
||||||
<schema elementFormDefault="qualified"
|
|
||||||
targetNamespace="http://ws.sosnoski.com/library/types"
|
|
||||||
xmlns="http://www.w3.org/2001/XMLSchema">
|
|
||||||
|
|
||||||
<complexType name="BookInformation">
|
|
||||||
<sequence>
|
|
||||||
<element name="author" minOccurs="0" maxOccurs="unbounded" type="string"/>
|
|
||||||
<element name="title" type="string"/>
|
|
||||||
</sequence>
|
|
||||||
<attribute name="type" use="required" type="string"/>
|
|
||||||
<attribute name="isbn" use="required" type="string"/>
|
|
||||||
</complexType>
|
|
||||||
|
|
||||||
</schema>
|
|
||||||
|
|
||||||
</wsdl:types>
|
|
||||||
|
|
||||||
<wsdl:message name="getBookRequest">
|
|
||||||
<wsdl:part element="wns:getBook" name="parameters"/>
|
|
||||||
</wsdl:message>
|
|
||||||
|
|
||||||
<wsdl:message name="getBookResponse">
|
|
||||||
<wsdl:part element="wns:getBookResponse" name="parameters"/>
|
|
||||||
</wsdl:message>
|
|
||||||
|
|
||||||
<wsdl:message name="getBooksByTypeRequest">
|
|
||||||
<wsdl:part element="wns:getBooksByType" name="parameters"/>
|
|
||||||
</wsdl:message>
|
|
||||||
|
|
||||||
<wsdl:message name="getBooksByTypeResponse">
|
|
||||||
<wsdl:part element="wns:getBooksByTypeResponse" name="parameters"/>
|
|
||||||
</wsdl:message>
|
|
||||||
|
|
||||||
<wsdl:message name="addBookRequest">
|
|
||||||
<wsdl:part element="wns:addBook" name="parameters"/>
|
|
||||||
</wsdl:message>
|
|
||||||
|
|
||||||
<wsdl:message name="addBookResponse">
|
|
||||||
<wsdl:part element="wns:addBookResponse" name="parameters"/>
|
|
||||||
</wsdl:message>
|
|
||||||
|
|
||||||
<wsdl:portType name="Library">
|
|
||||||
|
|
||||||
<wsdl:operation name="getBook">
|
|
||||||
<wsdl:input message="wns:getBookRequest" name="getBookRequest"/>
|
|
||||||
<wsdl:output message="wns:getBookResponse" name="getBookResponse"/>
|
|
||||||
</wsdl:operation>
|
|
||||||
|
|
||||||
<wsdl:operation name="getBooksByType">
|
|
||||||
<wsdl:input message="wns:getBooksByTypeRequest" name="getBooksByTypeRequest"/>
|
|
||||||
<wsdl:output message="wns:getBooksByTypeResponse" name="getBooksByTypeResponse"/>
|
|
||||||
</wsdl:operation>
|
|
||||||
|
|
||||||
<wsdl:operation name="addBook">
|
|
||||||
<wsdl:input message="wns:addBookRequest" name="addBookRequest"/>
|
|
||||||
<wsdl:output message="wns:addBookResponse" name="addBookResponse"/>
|
|
||||||
</wsdl:operation>
|
|
||||||
|
|
||||||
</wsdl:portType>
|
|
||||||
|
|
||||||
<wsdl:binding name="LibrarySoapBinding" type="wns:Library">
|
|
||||||
|
|
||||||
<wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
|
|
||||||
|
|
||||||
<wsdl:operation name="getBook">
|
|
||||||
|
|
||||||
<wsdlsoap:operation soapAction="urn:getBook"/>
|
|
||||||
|
|
||||||
<wsdl:input name="getBookRequest">
|
|
||||||
<wsdlsoap:body use="literal"/>
|
|
||||||
</wsdl:input>
|
|
||||||
|
|
||||||
<wsdl:output name="getBookResponse">
|
|
||||||
<wsdlsoap:body use="literal"/>
|
|
||||||
</wsdl:output>
|
|
||||||
|
|
||||||
</wsdl:operation>
|
|
||||||
|
|
||||||
<wsdl:operation name="getBooksByType">
|
|
||||||
|
|
||||||
<wsdlsoap:operation soapAction="urn:getBooksByType"/>
|
|
||||||
|
|
||||||
<wsdl:input name="getBooksByTypeRequest">
|
|
||||||
<wsdlsoap:body use="literal"/>
|
|
||||||
</wsdl:input>
|
|
||||||
|
|
||||||
<wsdl:output name="getBooksByTypeResponse">
|
|
||||||
<wsdlsoap:body use="literal"/>
|
|
||||||
</wsdl:output>
|
|
||||||
|
|
||||||
</wsdl:operation>
|
|
||||||
|
|
||||||
<wsdl:operation name="addBook">
|
|
||||||
|
|
||||||
<wsdlsoap:operation soapAction="urn:addBook"/>
|
|
||||||
|
|
||||||
<wsdl:input name="addBookRequest">
|
|
||||||
<wsdlsoap:body use="literal"/>
|
|
||||||
</wsdl:input>
|
|
||||||
|
|
||||||
<wsdl:output name="addBookResponse">
|
|
||||||
<wsdlsoap:body use="literal"/>
|
|
||||||
</wsdl:output>
|
|
||||||
|
|
||||||
</wsdl:operation>
|
|
||||||
|
|
||||||
</wsdl:binding>
|
|
||||||
|
|
||||||
<wsdl:service name="library-username">
|
|
||||||
|
|
||||||
<wsdl:port binding="wns:LibrarySoapBinding" name="library">
|
|
||||||
<wsdlsoap:address location="http://localhost:8080/axis2/services/library-username"/>
|
|
||||||
</wsdl:port>
|
|
||||||
|
|
||||||
</wsdl:service>
|
|
||||||
|
|
||||||
</wsdl:definitions>
|
|
@ -1,11 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace BeSimple\SoapClient\Tests\AxisInterop\Fixtures;
|
|
||||||
|
|
||||||
class addBook
|
|
||||||
{
|
|
||||||
public $type;
|
|
||||||
public $isbn;
|
|
||||||
public $author;
|
|
||||||
public $title;
|
|
||||||
}
|
|
@ -1,8 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace BeSimple\SoapClient\Tests\AxisInterop\Fixtures;
|
|
||||||
|
|
||||||
class addBookResponse
|
|
||||||
{
|
|
||||||
public $addBookReturn;
|
|
||||||
}
|
|
@ -1,9 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace BeSimple\SoapClient\Tests\AxisInterop\Fixtures;
|
|
||||||
|
|
||||||
class base64Binary
|
|
||||||
{
|
|
||||||
public $_;
|
|
||||||
public $contentType;
|
|
||||||
}
|
|
@ -1,17 +0,0 @@
|
|||||||
-----BEGIN CERTIFICATE-----
|
|
||||||
MIICoDCCAgkCBEnhw2IwDQYJKoZIhvcNAQEFBQAwgZYxCzAJBgNVBAYTAk5aMRMw
|
|
||||||
EQYDVQQIEwpXZWxsaW5ndG9uMRowGAYDVQQHExFQYXJhcGFyYXVtdSBCZWFjaDEq
|
|
||||||
MCgGA1UEChMhU29zbm9za2kgU29mdHdhcmUgQXNzb2NpYXRlcyBMdGQuMRAwDgYD
|
|
||||||
VQQLEwdVbmtub3duMRgwFgYDVQQDEw9EZW5uaXMgU29zbm9za2kwHhcNMDkwNDEy
|
|
||||||
MTAzMzA2WhcNMzYwODI3MTAzMzA2WjCBljELMAkGA1UEBhMCTloxEzARBgNVBAgT
|
|
||||||
CldlbGxpbmd0b24xGjAYBgNVBAcTEVBhcmFwYXJhdW11IEJlYWNoMSowKAYDVQQK
|
|
||||||
EyFTb3Nub3NraSBTb2Z0d2FyZSBBc3NvY2lhdGVzIEx0ZC4xEDAOBgNVBAsTB1Vu
|
|
||||||
a25vd24xGDAWBgNVBAMTD0Rlbm5pcyBTb3Nub3NraTCBnzANBgkqhkiG9w0BAQEF
|
|
||||||
AAOBjQAwgYkCgYEAhOVyNK8xyxtb4DnKtU6mF9KoiFqCk7eKoLE26+9h410CtTkx
|
|
||||||
zWAfgnR+8i+LPbdsPY+yXAo6NYpCCKolXfDLe+AG2GwnMZGrIl6+BLF3hqTmIXBF
|
|
||||||
TLGUmC7A7uBTivaWgdH1w3hb33rASoVU67BVtQ3QQi99juZX4vU9o9pScocCAwEA
|
|
||||||
ATANBgkqhkiG9w0BAQUFAAOBgQBMNPo1KAGbz8Jl6HGbtAcetieSJ3bEAXmv1tcj
|
|
||||||
ysBS67AXzdu1Ac+onHh2EpzBM7kuGbw+trU+AhulooPpewIQRApXP1F0KHRDcbqW
|
|
||||||
jwvknS6HnomN9572giLGKn2601bHiRUj35hiA8aLmMUBppIRPFFAoQ0QUBCPx+m8
|
|
||||||
/0n33w==
|
|
||||||
-----END CERTIFICATE-----
|
|
@ -1,14 +0,0 @@
|
|||||||
-----BEGIN PRIVATE KEY-----
|
|
||||||
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAITlcjSvMcsbW+A5yrVOphfSqIha
|
|
||||||
gpO3iqCxNuvvYeNdArU5Mc1gH4J0fvIviz23bD2PslwKOjWKQgiqJV3wy3vgBthsJzGRqyJevgSx
|
|
||||||
d4ak5iFwRUyxlJguwO7gU4r2loHR9cN4W996wEqFVOuwVbUN0EIvfY7mV+L1PaPaUnKHAgMBAAEC
|
|
||||||
gYAZ6UqtLwN8YGc3fs0hMKZ9upsViuAuwPiMgED/G3twgzAF+ZLWQkmie+hMfCyf6eV200+pVm0n
|
|
||||||
Bz/8xH/oowxpX0Kk3szoB4vFghjU84GKUcrbhu/NRIm7l3drnfbzqhQkHDCx6n1CotI4Gs49cDWu
|
|
||||||
4uEAuxJkEIVY553unZjZgQJBAOJVIallNKmD0iQlvtWRmRzpmYDjt9vhNY6WBTIOx6SDn9SRaoSA
|
|
||||||
fkipQ2HXo04r78TQ674+zfZ1lRTkFG7px6ECQQCWUPHp3pSZOM1oGzJrNvNaw+MizZAZjq34npHm
|
|
||||||
9GRquFLG7BlCaI9QNGE7pN2ryYsYCRUMaM2e4GR0tUXxVGknAkAgrxqFU9AfCqI2Bh1gyf3KZxF7
|
|
||||||
w2axofwR8ygc6nV6FGfoUneHWubhp0/LuVAj4cRmL6Vbe8ZSaPh2Y9lviuMBAkEAicP8Q+1E4j1m
|
|
||||||
PPEYP51oYprANOiUFmhnWEL00+jPk+QFsd03tV6hYs/vAbwzkjuwqMHCMdJoCiH8z95IEUvc5wJA
|
|
||||||
MvLOuZdu4dmhOXg/YKsbMSPjFNEVskLQNSXqw6O2wIrpPg1NQvBBAOTbiuZj3vind4VPos1wc4vB
|
|
||||||
QocvdUC6dA==
|
|
||||||
-----END PRIVATE KEY-----
|
|
@ -1,8 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace BeSimple\SoapClient\Tests\AxisInterop\Fixtures;
|
|
||||||
|
|
||||||
class downloadFile
|
|
||||||
{
|
|
||||||
public $name;
|
|
||||||
}
|
|
@ -1,8 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace BeSimple\SoapClient\Tests\AxisInterop\Fixtures;
|
|
||||||
|
|
||||||
class downloadFileResponse
|
|
||||||
{
|
|
||||||
public $data;
|
|
||||||
}
|
|
@ -1,8 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace BeSimple\SoapClient\Tests\AxisInterop\Fixtures;
|
|
||||||
|
|
||||||
class getBook
|
|
||||||
{
|
|
||||||
public $isbn;
|
|
||||||
}
|
|
@ -1,8 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace BeSimple\SoapClient\Tests\AxisInterop\Fixtures;
|
|
||||||
|
|
||||||
class getBookResponse
|
|
||||||
{
|
|
||||||
public $getBookReturn;
|
|
||||||
}
|
|
@ -1,8 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace BeSimple\SoapClient\Tests\AxisInterop\Fixtures;
|
|
||||||
|
|
||||||
class getBooksByType
|
|
||||||
{
|
|
||||||
public $type;
|
|
||||||
}
|
|
@ -1,8 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace BeSimple\SoapClient\Tests\AxisInterop\Fixtures;
|
|
||||||
|
|
||||||
class getBooksByTypeResponse
|
|
||||||
{
|
|
||||||
public $getBooksByTypeReturn;
|
|
||||||
}
|
|
Binary file not shown.
Before Width: | Height: | Size: 74 KiB |
@ -1,17 +0,0 @@
|
|||||||
-----BEGIN CERTIFICATE-----
|
|
||||||
MIICoDCCAgkCBEnhwzMwDQYJKoZIhvcNAQEFBQAwgZYxCzAJBgNVBAYTAk5aMRMw
|
|
||||||
EQYDVQQIEwpXZWxsaW5ndG9uMRowGAYDVQQHExFQYXJhcGFyYXVtdSBCZWFjaDEq
|
|
||||||
MCgGA1UEChMhU29zbm9za2kgU29mdHdhcmUgQXNzb2NpYXRlcyBMdGQuMRAwDgYD
|
|
||||||
VQQLEwdVbmtub3duMRgwFgYDVQQDEw9EZW5uaXMgU29zbm9za2kwHhcNMDkwNDEy
|
|
||||||
MTAzMjE5WhcNMzYwODI3MTAzMjE5WjCBljELMAkGA1UEBhMCTloxEzARBgNVBAgT
|
|
||||||
CldlbGxpbmd0b24xGjAYBgNVBAcTEVBhcmFwYXJhdW11IEJlYWNoMSowKAYDVQQK
|
|
||||||
EyFTb3Nub3NraSBTb2Z0d2FyZSBBc3NvY2lhdGVzIEx0ZC4xEDAOBgNVBAsTB1Vu
|
|
||||||
a25vd24xGDAWBgNVBAMTD0Rlbm5pcyBTb3Nub3NraTCBnzANBgkqhkiG9w0BAQEF
|
|
||||||
AAOBjQAwgYkCgYEA1H3mjQCF9uce2jmm/Yq9kE4ytfvkp4c8G90cDfJXJvOiGQds
|
|
||||||
p2vDZXKuCkHQ7vsBBXPNTt8J/d8ZbEwyuB9Ccz5pJqi6Ig6Y2/mEsPthDyh5SrJV
|
|
||||||
yQ/wxUGwmfSuwdrIMnplMTq+OR9BOfT3CvjSvuy9d6BQNo4wOMkDvmZTtI8CAwEA
|
|
||||||
ATANBgkqhkiG9w0BAQUFAAOBgQCqv4475QaqlKcN2QCZJbLVKZEX+76XLQurGkgf
|
|
||||||
2fCgesRHjfUfOHyTTlhWQdEKTcBB2XviUyyW6I//fmKfXUIiQqvgh4LHdXRPEXDf
|
|
||||||
Y9nr89MjyQpDlnl6AlrvSej30a9iwVRUeVk4d6gxWHMRonKBFgh+TGexxUXHtPkf
|
|
||||||
B1Pdtg==
|
|
||||||
-----END CERTIFICATE-----
|
|
@ -1,9 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace BeSimple\SoapClient\Tests\AxisInterop\Fixtures;
|
|
||||||
|
|
||||||
class uploadFile
|
|
||||||
{
|
|
||||||
public $data;
|
|
||||||
public $name;
|
|
||||||
}
|
|
@ -1,8 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace BeSimple\SoapClient\Tests\AxisInterop\Fixtures;
|
|
||||||
|
|
||||||
class uploadFileResponse
|
|
||||||
{
|
|
||||||
public $return;
|
|
||||||
}
|
|
@ -1,51 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Deploy "axis_services/sample-mtom.aar" to Apache Axis2 to get this
|
|
||||||
* example to work.
|
|
||||||
*
|
|
||||||
* Apache Axis2 MTOM example.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
use BeSimple\SoapCommon\Helper as BeSimpleSoapHelper;
|
|
||||||
use BeSimple\SoapClient\SoapClient as BeSimpleSoapClient;
|
|
||||||
|
|
||||||
use BeSimple\SoapClient\Tests\AxisInterop\Fixtures\AttachmentRequest;
|
|
||||||
use BeSimple\SoapClient\Tests\AxisInterop\Fixtures\AttachmentType;
|
|
||||||
use BeSimple\SoapClient\Tests\AxisInterop\Fixtures\base64Binary;
|
|
||||||
|
|
||||||
use BeSimple\SoapClient\Tests\AxisInterop\TestCase;
|
|
||||||
|
|
||||||
class MtomAxisInteropTest extends TestCase
|
|
||||||
{
|
|
||||||
private $options = array(
|
|
||||||
'soap_version' => SOAP_1_1,
|
|
||||||
'features' => SOAP_SINGLE_ELEMENT_ARRAYS, // make sure that result is array for size=1
|
|
||||||
'attachment_type' => BeSimpleSoapHelper::ATTACHMENTS_TYPE_MTOM,
|
|
||||||
'cache_wsdl' => WSDL_CACHE_NONE,
|
|
||||||
'classmap' => array(
|
|
||||||
'base64Binary' => 'BeSimple\SoapClient\Tests\AxisInterop\Fixtures\base64Binary',
|
|
||||||
'AttachmentRequest' => 'BeSimple\SoapClient\Tests\AxisInterop\Fixtures\AttachmentRequest',
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
public function testAttachment()
|
|
||||||
{
|
|
||||||
$sc = new BeSimpleSoapClient(__DIR__.'/Fixtures/MTOM.wsdl', $this->options);
|
|
||||||
|
|
||||||
$b64 = new base64Binary();
|
|
||||||
$b64->_ = 'This is a test. :)';
|
|
||||||
$b64->contentType = 'text/plain';
|
|
||||||
|
|
||||||
$attachment = new AttachmentRequest();
|
|
||||||
$attachment->fileName = 'test123.txt';
|
|
||||||
$attachment->binaryData = $b64;
|
|
||||||
|
|
||||||
$this->assertEquals('File saved succesfully.', $sc->attachment($attachment));
|
|
||||||
|
|
||||||
// $fileCreatedByServer = __DIR__.'/'.$attachment->fileName;
|
|
||||||
// $this->assertEquals($b64->_, file_get_contents($fileCreatedByServer));
|
|
||||||
// unlink($fileCreatedByServer);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,38 +0,0 @@
|
|||||||
<project name="BeSimpleSwaService" default="generate.service">
|
|
||||||
<property environment="env" />
|
|
||||||
<property name="axis2.home" value="C:/axis2" />
|
|
||||||
<property name="axis2.repo" value="${axis2.home}/repository" />
|
|
||||||
<property name="build.dir" value="build" />
|
|
||||||
<property name="filename" value="besimple-swa.aar" />
|
|
||||||
|
|
||||||
<path id="axis.classpath">
|
|
||||||
<fileset dir="${axis2.home}/lib">
|
|
||||||
<include name="*.jar" />
|
|
||||||
</fileset>
|
|
||||||
</path>
|
|
||||||
|
|
||||||
<target name="generate.service" depends="compile">
|
|
||||||
<jar destfile="${build.dir}/${filename}">
|
|
||||||
<fileset dir="resources/">
|
|
||||||
<include name="META-INF/services.xml" />
|
|
||||||
</fileset>
|
|
||||||
<fileset dir="${build.dir}/classes">
|
|
||||||
<include name="besimple/service/**/*.class" />
|
|
||||||
</fileset>
|
|
||||||
</jar>
|
|
||||||
<copy file="${build.dir}/${filename}" tofile="../axis_services/${filename}" overwrite="true" />
|
|
||||||
<copy file="${build.dir}/${filename}" tofile="${axis2.repo}/services/${filename}" overwrite="true" />
|
|
||||||
<antcall target="clean" />
|
|
||||||
</target>
|
|
||||||
|
|
||||||
<target name="compile">
|
|
||||||
<mkdir dir="${build.dir}/classes" />
|
|
||||||
<javac debug="on" srcdir="src" destdir="${build.dir}/classes">
|
|
||||||
<classpath refid="axis.classpath" />
|
|
||||||
</javac>
|
|
||||||
</target>
|
|
||||||
|
|
||||||
<target name="clean">
|
|
||||||
<delete dir="${build.dir}" />
|
|
||||||
</target>
|
|
||||||
</project>
|
|
@ -1,15 +0,0 @@
|
|||||||
<serviceGroup>
|
|
||||||
<service name="BeSimpleSwaService">
|
|
||||||
<description>BeSimple test service for SwA.</description>
|
|
||||||
<parameter name="enableSwA">true</parameter>
|
|
||||||
<parameter name="ServiceClass" locked="false">besimple.service.BeSimpleSwaService</parameter>
|
|
||||||
<operation name="uploadFile">
|
|
||||||
<actionMapping>urn:uploadFile</actionMapping>
|
|
||||||
<messageReceiver class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/>
|
|
||||||
</operation>
|
|
||||||
<operation name="downloadFile">
|
|
||||||
<actionMapping>urn:downloadFile</actionMapping>
|
|
||||||
<messageReceiver class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/>
|
|
||||||
</operation>
|
|
||||||
</service>
|
|
||||||
</serviceGroup>
|
|
@ -1,78 +0,0 @@
|
|||||||
package besimple.service;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.FileOutputStream;
|
|
||||||
|
|
||||||
import javax.xml.namespace.QName;
|
|
||||||
|
|
||||||
import javax.activation.DataHandler;
|
|
||||||
import javax.activation.FileDataSource;
|
|
||||||
|
|
||||||
import org.apache.axiom.attachments.Attachments;
|
|
||||||
import org.apache.axiom.om.OMAbstractFactory;
|
|
||||||
import org.apache.axiom.om.OMAttribute;
|
|
||||||
import org.apache.axiom.om.OMElement;
|
|
||||||
import org.apache.axiom.om.OMFactory;
|
|
||||||
import org.apache.axiom.om.OMNamespace;
|
|
||||||
|
|
||||||
import org.apache.axis2.context.MessageContext;
|
|
||||||
import org.apache.axis2.context.OperationContext;
|
|
||||||
import org.apache.axis2.wsdl.WSDLConstants;
|
|
||||||
|
|
||||||
public class BeSimpleSwaService {
|
|
||||||
|
|
||||||
String namespace = "http://service.besimple";
|
|
||||||
|
|
||||||
public OMElement uploadFile(OMElement element) throws Exception {
|
|
||||||
OMElement dataElement = (OMElement)element.getFirstChildWithName(new QName(namespace, "data"));
|
|
||||||
OMAttribute hrefAttribute = dataElement.getAttribute(new QName("href"));
|
|
||||||
|
|
||||||
String contentID = hrefAttribute.getAttributeValue();
|
|
||||||
contentID = contentID.trim();
|
|
||||||
if (contentID.substring(0, 3).equalsIgnoreCase("cid")) {
|
|
||||||
contentID = contentID.substring(4);
|
|
||||||
}
|
|
||||||
OMElement nameElement = (OMElement)element.getFirstChildWithName(new QName(namespace, "name"));
|
|
||||||
String name = nameElement.getText();
|
|
||||||
|
|
||||||
MessageContext msgCtx = MessageContext.getCurrentMessageContext();
|
|
||||||
Attachments attachment = msgCtx.getAttachmentMap();
|
|
||||||
DataHandler dataHandler = attachment.getDataHandler(contentID);
|
|
||||||
|
|
||||||
File file = new File(name);
|
|
||||||
FileOutputStream fileOutputStream = new FileOutputStream(file);
|
|
||||||
dataHandler.writeTo(fileOutputStream);
|
|
||||||
fileOutputStream.flush();
|
|
||||||
fileOutputStream.close();
|
|
||||||
|
|
||||||
OMFactory factory = OMAbstractFactory.getOMFactory();
|
|
||||||
OMNamespace omNs = factory.createOMNamespace(namespace, "swa");
|
|
||||||
OMElement wrapperElement = factory.createOMElement("uploadFileResponse", omNs);
|
|
||||||
OMElement returnElement = factory.createOMElement("return", omNs, wrapperElement);
|
|
||||||
returnElement.setText("File saved succesfully.");
|
|
||||||
|
|
||||||
return wrapperElement;
|
|
||||||
}
|
|
||||||
|
|
||||||
public OMElement downloadFile(OMElement element) throws Exception {
|
|
||||||
OMElement nameElement = (OMElement)element.getFirstChildWithName(new QName(namespace, "name"));
|
|
||||||
String name = nameElement.getText();
|
|
||||||
|
|
||||||
MessageContext msgCtxIn = MessageContext.getCurrentMessageContext();
|
|
||||||
OperationContext operationContext = msgCtxIn.getOperationContext();
|
|
||||||
MessageContext msgCtxOut = operationContext.getMessageContext(WSDLConstants.MESSAGE_LABEL_OUT_VALUE);
|
|
||||||
|
|
||||||
FileDataSource fileDataSource = new FileDataSource(name);
|
|
||||||
DataHandler dataHandler = new DataHandler(fileDataSource);
|
|
||||||
|
|
||||||
String contentID = "cid:" + msgCtxOut.addAttachment(dataHandler);
|
|
||||||
|
|
||||||
OMFactory factory = OMAbstractFactory.getOMFactory();
|
|
||||||
OMNamespace omNs = factory.createOMNamespace(namespace, "swa");
|
|
||||||
OMElement wrapperElement = factory.createOMElement("downloadFileResponse", omNs);
|
|
||||||
OMElement dataElement = factory.createOMElement("data", omNs, wrapperElement);
|
|
||||||
dataElement.addAttribute("href", contentID, null);
|
|
||||||
|
|
||||||
return wrapperElement;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,77 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Deploy "axis_services/besimple-swa.aar" to Apache Axis2 to get this
|
|
||||||
* example to work.
|
|
||||||
*
|
|
||||||
* Run ant to rebuild aar.
|
|
||||||
*
|
|
||||||
* Example based on:
|
|
||||||
* http://axis.apache.org/axis2/java/core/docs/mtom-guide.html#a3
|
|
||||||
* http://wso2.org/library/1675
|
|
||||||
*
|
|
||||||
* Doesn't work directly with ?wsdl served by Apache Axis!
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
use BeSimple\SoapCommon\Helper as BeSimpleSoapHelper;
|
|
||||||
use BeSimple\SoapClient\SoapClient as BeSimpleSoapClient;
|
|
||||||
|
|
||||||
use BeSimple\SoapClient\Tests\AxisInterop\Fixtures\uploadFile;
|
|
||||||
use BeSimple\SoapClient\Tests\AxisInterop\Fixtures\uploadFileResponse;
|
|
||||||
use BeSimple\SoapClient\Tests\AxisInterop\Fixtures\downloadFile;
|
|
||||||
use BeSimple\SoapClient\Tests\AxisInterop\Fixtures\downloadFileResponse;
|
|
||||||
|
|
||||||
use BeSimple\SoapClient\Tests\AxisInterop\TestCase;
|
|
||||||
|
|
||||||
class SwaAxisInteropTest extends TestCase
|
|
||||||
{
|
|
||||||
private $options = array(
|
|
||||||
'soap_version' => SOAP_1_1,
|
|
||||||
'features' => SOAP_SINGLE_ELEMENT_ARRAYS, // make sure that result is array for size=1
|
|
||||||
'attachment_type' => BeSimpleSoapHelper::ATTACHMENTS_TYPE_SWA,
|
|
||||||
'cache_wsdl' => WSDL_CACHE_NONE,
|
|
||||||
'classmap' => array(
|
|
||||||
'downloadFile' => 'BeSimple\SoapClient\Tests\AxisInterop\Fixtures\downloadFile',
|
|
||||||
'downloadFileResponse' => 'BeSimple\SoapClient\Tests\AxisInterop\Fixtures\downloadFileResponse',
|
|
||||||
'uploadFile' => 'BeSimple\SoapClient\Tests\AxisInterop\Fixtures\uploadFile',
|
|
||||||
'uploadFileResponse' => 'BeSimple\SoapClient\Tests\AxisInterop\Fixtures\uploadFileResponse',
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
public function testUploadDownloadText()
|
|
||||||
{
|
|
||||||
$sc = new BeSimpleSoapClient(__DIR__.'/Fixtures/SwA.wsdl', $this->options);
|
|
||||||
|
|
||||||
$upload = new uploadFile();
|
|
||||||
$upload->name = 'upload.txt';
|
|
||||||
$upload->data = 'This is a test. :)';
|
|
||||||
$result = $sc->uploadFile($upload);
|
|
||||||
|
|
||||||
$this->assertEquals('File saved succesfully.', $result->return);
|
|
||||||
|
|
||||||
$download = new downloadFile();
|
|
||||||
$download->name = 'upload.txt';
|
|
||||||
$result = $sc->downloadFile($download);
|
|
||||||
|
|
||||||
$this->assertEquals($upload->data, $result->data);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testUploadDownloadImage()
|
|
||||||
{
|
|
||||||
$sc = new BeSimpleSoapClient(__DIR__.'/Fixtures/SwA.wsdl', $this->options);
|
|
||||||
|
|
||||||
$upload = new uploadFile();
|
|
||||||
$upload->name = 'image.jpg';
|
|
||||||
$upload->data = file_get_contents(__DIR__.'/Fixtures/image.jpg'); // source: http://www.freeimageslive.com/galleries/light/pics/swirl3768.jpg;
|
|
||||||
$result = $sc->uploadFile($upload);
|
|
||||||
|
|
||||||
$this->assertEquals('File saved succesfully.', $result->return);
|
|
||||||
|
|
||||||
$download = new downloadFile();
|
|
||||||
$download->name = 'image.jpg';
|
|
||||||
$result = $sc->downloadFile($download);
|
|
||||||
|
|
||||||
$this->assertEquals($upload->data, $result->data);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,23 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace BeSimple\SoapClient\Tests\AxisInterop;
|
|
||||||
|
|
||||||
class TestCase extends \PHPUnit_Framework_TestCase
|
|
||||||
{
|
|
||||||
protected function setUp()
|
|
||||||
{
|
|
||||||
$ch = curl_init('http://localhost:8080/');
|
|
||||||
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
|
|
||||||
curl_setopt($ch, CURLOPT_HEADER, true);
|
|
||||||
curl_setopt($ch, CURLOPT_NOBODY, true);
|
|
||||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
|
||||||
|
|
||||||
if (curl_exec($ch) === false) {
|
|
||||||
$this->markTestSkipped(
|
|
||||||
'The Axis server is not started on port 8080.'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
curl_close($ch);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,59 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Deploy "axis_services/version2.aar" to Apache Axis2 to get this example to
|
|
||||||
* work.
|
|
||||||
*
|
|
||||||
* To rebuild the "axis_services/version2.aar" the following steps need to be
|
|
||||||
* done to build a working Apache Axis2 version service with SOAP session
|
|
||||||
* enabled.
|
|
||||||
*
|
|
||||||
* 1) Go to $AXIS_HOME/samples/version and edit the following files:
|
|
||||||
*
|
|
||||||
* resources/META-INF/services.xml:
|
|
||||||
* <service name="Version2" scope="soapsession">
|
|
||||||
* ...
|
|
||||||
* </service>
|
|
||||||
*
|
|
||||||
* build.xml:
|
|
||||||
* replace version.aar with version2.aar
|
|
||||||
*
|
|
||||||
* 2) Run ant build.xml in "$AXIS_HOME/samples/version"
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
use BeSimple\SoapClient\SoapClient as BeSimpleSoapClient;
|
|
||||||
use BeSimple\SoapClient\WsAddressingFilter as BeSimpleWsAddressingFilter;
|
|
||||||
|
|
||||||
use BeSimple\SoapClient\Tests\AxisInterop\TestCase;
|
|
||||||
|
|
||||||
class WsAddressingAxisInteropTest extends TestCase
|
|
||||||
{
|
|
||||||
private $options = array(
|
|
||||||
'soap_version' => SOAP_1_2,
|
|
||||||
'features' => SOAP_SINGLE_ELEMENT_ARRAYS, // make sure that result is array for size=1
|
|
||||||
);
|
|
||||||
|
|
||||||
public function testSession()
|
|
||||||
{
|
|
||||||
$sc = new BeSimpleSoapClient('http://localhost:8080/axis2/services/Version2?wsdl', $this->options);
|
|
||||||
$soapKernel = $sc->getSoapKernel();
|
|
||||||
$wsaFilter = new BeSimpleWsAddressingFilter();
|
|
||||||
$soapKernel->registerFilter($wsaFilter);
|
|
||||||
|
|
||||||
$wsaFilter->setReplyTo(BeSimpleWsAddressingFilter::ENDPOINT_REFERENCE_ANONYMOUS);
|
|
||||||
$wsaFilter->setMessageId();
|
|
||||||
|
|
||||||
$version = $sc->getVersion();
|
|
||||||
|
|
||||||
$soapSessionId1 = $wsaFilter->getReferenceParameter('http://ws.apache.org/namespaces/axis2', 'ServiceGroupId');
|
|
||||||
|
|
||||||
$wsaFilter->addReferenceParameter('http://ws.apache.org/namespaces/axis2', 'axis2', 'ServiceGroupId', $soapSessionId1);
|
|
||||||
|
|
||||||
$version = $sc->getVersion();
|
|
||||||
|
|
||||||
$soapSessionId2 = $wsaFilter->getReferenceParameter('http://ws.apache.org/namespaces/axis2', 'ServiceGroupId');
|
|
||||||
|
|
||||||
$this->assertEquals($soapSessionId1, $soapSessionId2);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,106 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Deploy "axis_services/library-signencr.aar" to Apache Axis2 to get this
|
|
||||||
* example to work.
|
|
||||||
*
|
|
||||||
* Links:
|
|
||||||
* http://www.dcc.uchile.cl/~pcamacho/tutorial/web/xmlsec/xmlsec.html
|
|
||||||
* http://www.aleksey.com/xmlsec/xmldsig-verifier.html
|
|
||||||
*
|
|
||||||
* Using code from axis example:
|
|
||||||
* http://www.ibm.com/developerworks/java/library/j-jws5/index.html
|
|
||||||
*
|
|
||||||
* Download key tool to export private key
|
|
||||||
* http://couchpotato.net/pkeytool/
|
|
||||||
*
|
|
||||||
* keytool -export -alias serverkey -keystore server.keystore -storepass nosecret -file servercert.cer
|
|
||||||
* openssl x509 -out servercert.pem -outform pem -in servercert.pem -inform der
|
|
||||||
*
|
|
||||||
* keytool -export -alias clientkey -keystore client.keystore -storepass nosecret -file clientcert.cer
|
|
||||||
* openssl x509 -out clientcert.pem -outform pem -in clientcert.pem -inform der
|
|
||||||
* java -jar pkeytool.jar -exportkey -keystore client.keystore -storepass nosecret -keypass clientpass -rfc -alias clientkey -file clientkey.pem
|
|
||||||
*
|
|
||||||
* C:\Program Files\Java\jre6\bin\keytool -export -alias serverkey -keystore server.keystore -storepass nosecret -file servercert.cer
|
|
||||||
* C:\xampp\apache\bin\openssl x509 -out servercert.pem -outform pem -in servercert.cer -inform der
|
|
||||||
*
|
|
||||||
* C:\Program Files\Java\jre6\bin\keytool -export -alias clientkey -keystore client.keystore -storepass nosecret -file clientcert.cer
|
|
||||||
* C:\xampp\apache\bin\openssl x509 -out clientcert.pem -outform pem -in clientcert.cer -inform der
|
|
||||||
* java -jar C:\axis2\pkeytool\pkeytool.jar -exportkey -keystore client.keystore -storepass nosecret -keypass clientpass -rfc -alias clientkey -file clientkey.pem
|
|
||||||
*
|
|
||||||
* build.properties:
|
|
||||||
* server-policy=hash-policy-server.xml
|
|
||||||
*
|
|
||||||
* allows both text and digest!
|
|
||||||
*/
|
|
||||||
|
|
||||||
use ass\XmlSecurity\Key as XmlSecurityKey;
|
|
||||||
|
|
||||||
use BeSimple\SoapClient\SoapClient as BeSimpleSoapClient;
|
|
||||||
use BeSimple\SoapClient\WsSecurityFilter as BeSimpleWsSecurityFilter;
|
|
||||||
use BeSimple\SoapCommon\WsSecurityKey as BeSimpleWsSecurityKey;
|
|
||||||
|
|
||||||
use BeSimple\SoapClient\Tests\AxisInterop\Fixtures\getBook;
|
|
||||||
use BeSimple\SoapClient\Tests\AxisInterop\Fixtures\getBookResponse;
|
|
||||||
use BeSimple\SoapClient\Tests\AxisInterop\Fixtures\getBooksByType;
|
|
||||||
use BeSimple\SoapClient\Tests\AxisInterop\Fixtures\getBooksByTypeResponse;
|
|
||||||
use BeSimple\SoapClient\Tests\AxisInterop\Fixtures\addBook;
|
|
||||||
use BeSimple\SoapClient\Tests\AxisInterop\Fixtures\addBookResponse;
|
|
||||||
use BeSimple\SoapClient\Tests\AxisInterop\Fixtures\BookInformation;
|
|
||||||
|
|
||||||
use BeSimple\SoapClient\Tests\AxisInterop\TestCase;
|
|
||||||
|
|
||||||
class WsSecuritySigEncAxisInteropTest extends TestCase
|
|
||||||
{
|
|
||||||
private $options = array(
|
|
||||||
'soap_version' => SOAP_1_2,
|
|
||||||
'features' => SOAP_SINGLE_ELEMENT_ARRAYS, // make sure that result is array for size=1
|
|
||||||
'classmap' => array(
|
|
||||||
'getBook' => 'BeSimple\SoapClient\Tests\AxisInterop\Fixtures\getBook',
|
|
||||||
'getBookResponse' => 'BeSimple\SoapClient\Tests\AxisInterop\Fixtures\getBookResponse',
|
|
||||||
'getBooksByType' => 'BeSimple\SoapClient\Tests\AxisInterop\Fixtures\getBooksByType',
|
|
||||||
'getBooksByTypeResponse' => 'BeSimple\SoapClient\Tests\AxisInterop\Fixtures\getBooksByTypeResponse',
|
|
||||||
'addBook' => 'BeSimple\SoapClient\Tests\AxisInterop\Fixtures\addBook',
|
|
||||||
'addBookResponse' => 'BeSimple\SoapClient\Tests\AxisInterop\Fixtures\addBookResponse',
|
|
||||||
'BookInformation' => 'BeSimple\SoapClient\Tests\AxisInterop\Fixtures\BookInformation',
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
public function testSigEnc()
|
|
||||||
{
|
|
||||||
$sc = new BeSimpleSoapClient(__DIR__.'/Fixtures/WsSecuritySigEnc.wsdl', $this->options);
|
|
||||||
|
|
||||||
$wssFilter = new BeSimpleWsSecurityFilter();
|
|
||||||
// user key for signature and encryption
|
|
||||||
$securityKeyUser = new BeSimpleWsSecurityKey();
|
|
||||||
$securityKeyUser->addPrivateKey(XmlSecurityKey::RSA_SHA1, __DIR__.'/Fixtures/clientkey.pem', true);
|
|
||||||
$securityKeyUser->addPublicKey(XmlSecurityKey::RSA_SHA1, __DIR__.'/Fixtures/clientcert.pem', true);
|
|
||||||
$wssFilter->setUserSecurityKeyObject($securityKeyUser);
|
|
||||||
// service key for encryption
|
|
||||||
$securityKeyService = new BeSimpleWsSecurityKey();
|
|
||||||
$securityKeyService->addPrivateKey(XmlSecurityKey::TRIPLEDES_CBC);
|
|
||||||
$securityKeyService->addPublicKey(XmlSecurityKey::RSA_1_5, __DIR__.'/Fixtures/servercert.pem', true);
|
|
||||||
$wssFilter->setServiceSecurityKeyObject($securityKeyService);
|
|
||||||
// TOKEN_REFERENCE_SUBJECT_KEY_IDENTIFIER | TOKEN_REFERENCE_SECURITY_TOKEN | TOKEN_REFERENCE_THUMBPRINT_SHA1
|
|
||||||
$wssFilter->setSecurityOptionsSignature(BeSimpleWsSecurityFilter::TOKEN_REFERENCE_SECURITY_TOKEN);
|
|
||||||
$wssFilter->setSecurityOptionsEncryption(BeSimpleWsSecurityFilter::TOKEN_REFERENCE_THUMBPRINT_SHA1);
|
|
||||||
|
|
||||||
$soapKernel = $sc->getSoapKernel();
|
|
||||||
$soapKernel->registerFilter($wssFilter);
|
|
||||||
|
|
||||||
$gb = new getBook();
|
|
||||||
$gb->isbn = '0061020052';
|
|
||||||
$result = $sc->getBook($gb);
|
|
||||||
$this->assertInstanceOf('BeSimple\SoapClient\Tests\AxisInterop\Fixtures\BookInformation', $result->getBookReturn);
|
|
||||||
|
|
||||||
$ab = new addBook();
|
|
||||||
$ab->isbn = '0445203498';
|
|
||||||
$ab->title = 'The Dragon Never Sleeps';
|
|
||||||
$ab->author = 'Cook, Glen';
|
|
||||||
$ab->type = 'scifi';
|
|
||||||
|
|
||||||
$this->assertTrue((bool) $sc->addBook($ab));
|
|
||||||
|
|
||||||
// getBooksByType("scifi");
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,96 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Deploy "axis_services/library-username-digest.aar" to Apache Axis2 to get
|
|
||||||
* this example to work.
|
|
||||||
*
|
|
||||||
* Using code from axis example:
|
|
||||||
* http://www.ibm.com/developerworks/java/library/j-jws4/index.html
|
|
||||||
*
|
|
||||||
* build.properties:
|
|
||||||
* server-policy=hash-policy-server.xml
|
|
||||||
*
|
|
||||||
* allows both text and digest!
|
|
||||||
*/
|
|
||||||
|
|
||||||
use BeSimple\SoapClient\SoapClient as BeSimpleSoapClient;
|
|
||||||
use BeSimple\SoapClient\WsSecurityFilter as BeSimpleWsSecurityFilter;
|
|
||||||
|
|
||||||
use BeSimple\SoapClient\Tests\AxisInterop\Fixtures\getBook;
|
|
||||||
use BeSimple\SoapClient\Tests\AxisInterop\Fixtures\getBookResponse;
|
|
||||||
use BeSimple\SoapClient\Tests\AxisInterop\Fixtures\getBooksByType;
|
|
||||||
use BeSimple\SoapClient\Tests\AxisInterop\Fixtures\getBooksByTypeResponse;
|
|
||||||
use BeSimple\SoapClient\Tests\AxisInterop\Fixtures\addBook;
|
|
||||||
use BeSimple\SoapClient\Tests\AxisInterop\Fixtures\addBookResponse;
|
|
||||||
use BeSimple\SoapClient\Tests\AxisInterop\Fixtures\BookInformation;
|
|
||||||
|
|
||||||
use BeSimple\SoapClient\Tests\AxisInterop\TestCase;
|
|
||||||
|
|
||||||
class WsSecurityUserPassAxisInteropTest extends TestCase
|
|
||||||
{
|
|
||||||
private $options = array(
|
|
||||||
'soap_version' => SOAP_1_2,
|
|
||||||
'features' => SOAP_SINGLE_ELEMENT_ARRAYS, // make sure that result is array for size=1
|
|
||||||
'classmap' => array(
|
|
||||||
'getBook' => 'BeSimple\SoapClient\Tests\AxisInterop\Fixtures\getBook',
|
|
||||||
'getBookResponse' => 'BeSimple\SoapClient\Tests\AxisInterop\Fixtures\getBookResponse',
|
|
||||||
'getBooksByType' => 'BeSimple\SoapClient\Tests\AxisInterop\Fixtures\getBooksByType',
|
|
||||||
'getBooksByTypeResponse' => 'BeSimple\SoapClient\Tests\AxisInterop\Fixtures\getBooksByTypeResponse',
|
|
||||||
'addBook' => 'BeSimple\SoapClient\Tests\AxisInterop\Fixtures\addBook',
|
|
||||||
'addBookResponse' => 'BeSimple\SoapClient\Tests\AxisInterop\Fixtures\addBookResponse',
|
|
||||||
'BookInformation' => 'BeSimple\SoapClient\Tests\AxisInterop\Fixtures\BookInformation',
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
public function testUserPassText()
|
|
||||||
{
|
|
||||||
$sc = new BeSimpleSoapClient(__DIR__.'/Fixtures/WsSecurityUserPass.wsdl', $this->options);
|
|
||||||
|
|
||||||
$wssFilter = new BeSimpleWsSecurityFilter(true, 600);
|
|
||||||
$wssFilter->addUserData('libuser', 'books', BeSimpleWsSecurityFilter::PASSWORD_TYPE_TEXT);
|
|
||||||
|
|
||||||
$soapKernel = $sc->getSoapKernel();
|
|
||||||
$soapKernel->registerFilter($wssFilter);
|
|
||||||
|
|
||||||
$gb = new getBook();
|
|
||||||
$gb->isbn = '0061020052';
|
|
||||||
$result = $sc->getBook($gb);
|
|
||||||
$this->assertInstanceOf('BeSimple\SoapClient\Tests\AxisInterop\Fixtures\BookInformation', $result->getBookReturn);
|
|
||||||
|
|
||||||
$ab = new addBook();
|
|
||||||
$ab->isbn = '0445203498';
|
|
||||||
$ab->title = 'The Dragon Never Sleeps';
|
|
||||||
$ab->author = 'Cook, Glen';
|
|
||||||
$ab->type = 'scifi';
|
|
||||||
|
|
||||||
$this->assertTrue((bool) $sc->addBook($ab));
|
|
||||||
|
|
||||||
// getBooksByType("scifi");
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testUserPassDigest()
|
|
||||||
{
|
|
||||||
$sc = new BeSimpleSoapClient(__DIR__.'/Fixtures/WsSecurityUserPass.wsdl', $this->options);
|
|
||||||
|
|
||||||
$wssFilter = new BeSimpleWsSecurityFilter(true, 600);
|
|
||||||
$wssFilter->addUserData( 'libuser', 'books', BeSimpleWsSecurityFilter::PASSWORD_TYPE_DIGEST );
|
|
||||||
|
|
||||||
$soapKernel = $sc->getSoapKernel();
|
|
||||||
$soapKernel->registerFilter($wssFilter);
|
|
||||||
|
|
||||||
$gb = new getBook();
|
|
||||||
$gb->isbn = '0061020052';
|
|
||||||
$result = $sc->getBook($gb);
|
|
||||||
$this->assertInstanceOf('BeSimple\SoapClient\Tests\AxisInterop\Fixtures\BookInformation', $result->getBookReturn);
|
|
||||||
|
|
||||||
$ab = new addBook();
|
|
||||||
$ab->isbn = '0445203498';
|
|
||||||
$ab->title = 'The Dragon Never Sleeps';
|
|
||||||
$ab->author = 'Cook, Glen';
|
|
||||||
$ab->type = 'scifi';
|
|
||||||
|
|
||||||
$this->assertTrue((bool) $sc->addBook($ab));
|
|
||||||
|
|
||||||
// getBooksByType("scifi");
|
|
||||||
}
|
|
||||||
}
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1,107 +0,0 @@
|
|||||||
<?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\Tests;
|
|
||||||
|
|
||||||
use BeSimple\SoapClient\Curl;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Andreas Schamberger <mail@andreass.net>
|
|
||||||
*/
|
|
||||||
class CurlTest extends AbstractWebserverTest
|
|
||||||
{
|
|
||||||
public function testExec()
|
|
||||||
{
|
|
||||||
$curl = new Curl();
|
|
||||||
|
|
||||||
$this->assertTrue($curl->exec(sprintf('http://localhost:%d/curl.txt', WEBSERVER_PORT)));
|
|
||||||
$this->assertTrue($curl->exec(sprintf('http://localhost:%d/404.txt', WEBSERVER_PORT)));
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testGetErrorMessage()
|
|
||||||
{
|
|
||||||
$curl = new Curl();
|
|
||||||
|
|
||||||
$curl->exec('http://unknown/curl.txt');
|
|
||||||
$this->assertEquals('Could not connect to host', $curl->getErrorMessage());
|
|
||||||
|
|
||||||
$curl->exec(sprintf('xyz://localhost:%d/@404.txt', WEBSERVER_PORT));
|
|
||||||
$this->assertEquals('Unknown protocol. Only http and https are allowed.', $curl->getErrorMessage());
|
|
||||||
|
|
||||||
$curl->exec('');
|
|
||||||
$this->assertEquals('Unable to parse URL', $curl->getErrorMessage());
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testGetRequestHeaders()
|
|
||||||
{
|
|
||||||
$curl = new Curl();
|
|
||||||
|
|
||||||
$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();
|
|
||||||
|
|
||||||
$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());
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testGetResponseBody()
|
|
||||||
{
|
|
||||||
$curl = new Curl();
|
|
||||||
|
|
||||||
$curl->exec(sprintf('http://localhost:%d/curl.txt', WEBSERVER_PORT));
|
|
||||||
$this->assertEquals('This is a testfile for cURL.', $curl->getResponseBody());
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testGetResponseContentType()
|
|
||||||
{
|
|
||||||
$curl = new Curl();
|
|
||||||
|
|
||||||
$curl->exec(sprintf('http://localhost:%d/curl.txt', WEBSERVER_PORT));
|
|
||||||
$this->assertEquals('text/plain; charset=UTF-8', $curl->getResponseContentType());
|
|
||||||
|
|
||||||
$curl->exec(sprintf('http://localhost:%d/404.txt', WEBSERVER_PORT));
|
|
||||||
$this->assertEquals('text/html; charset=UTF-8', $curl->getResponseContentType());
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testGetResponseHeaders()
|
|
||||||
{
|
|
||||||
$curl = new Curl();
|
|
||||||
|
|
||||||
$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();
|
|
||||||
|
|
||||||
$curl->exec(sprintf('http://localhost:%d/curl.txt', WEBSERVER_PORT));
|
|
||||||
$this->assertEquals(200, $curl->getResponseStatusCode());
|
|
||||||
|
|
||||||
$curl->exec(sprintf('http://localhost:%d/404.txt', WEBSERVER_PORT));
|
|
||||||
$this->assertEquals(404, $curl->getResponseStatusCode());
|
|
||||||
}
|
|
||||||
}
|
|
@ -1 +0,0 @@
|
|||||||
This is a testfile for cURL.
|
|
@ -1,47 +0,0 @@
|
|||||||
<?xml version="1.0"?>
|
|
||||||
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://foobar/soap/User/1.0/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" name="User" targetNamespace="http://foobar/soap/User/1.0/">
|
|
||||||
<portType name="UserPortType">
|
|
||||||
<operation name="login" parameterOrder="username password">
|
|
||||||
<input message="tns:loginRequest"/>
|
|
||||||
<output message="tns:loginResponse"/>
|
|
||||||
</operation>
|
|
||||||
</portType>
|
|
||||||
<binding name="UserBinding" type="tns:UserPortType">
|
|
||||||
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
|
|
||||||
<operation name="login">
|
|
||||||
<soap:operation soapAction="http://foobar/soap/User/1.0/login"/>
|
|
||||||
<input>
|
|
||||||
<soap:body parts="username password" use="literal" namespace="http://foobar/soap/User/1.0/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
|
|
||||||
</input>
|
|
||||||
<output>
|
|
||||||
<soap:body parts="return" use="literal" namespace="http://foobar/soap/User/1.0/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
|
|
||||||
</output>
|
|
||||||
</operation>
|
|
||||||
</binding>
|
|
||||||
<service name="UserService">
|
|
||||||
<port name="UserPort" binding="tns:UserBinding">
|
|
||||||
<soap:address location="http://foobar/soap/user"/>
|
|
||||||
</port>
|
|
||||||
</service>
|
|
||||||
<types>
|
|
||||||
<xsd:schema targetNamespace="http://foobar/soap/User/1.0/">
|
|
||||||
<xsd:complexType name="User">
|
|
||||||
<xsd:all>
|
|
||||||
<xsd:element name="id" type="xsd:int" nillable="true"/>
|
|
||||||
<xsd:element name="username" type="xsd:string"/>
|
|
||||||
<xsd:element name="email" type="xsd:string"/>
|
|
||||||
<xsd:element name="language" type="xsd:string"/>
|
|
||||||
<xsd:element name="apiKey" type="xsd:string"/>
|
|
||||||
<xsd:element name="subscriptionEndAt" type="xsd:dateTime" nillable="true"/>
|
|
||||||
</xsd:all>
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:schema>
|
|
||||||
</types>
|
|
||||||
<message name="loginRequest">
|
|
||||||
<part name="username" type="xsd:string"/>
|
|
||||||
<part name="password" type="xsd:string"/>
|
|
||||||
</message>
|
|
||||||
<message name="loginResponse">
|
|
||||||
<part name="return" type="tns:User"/>
|
|
||||||
</message>
|
|
||||||
</definitions>
|
|
@ -1,15 +0,0 @@
|
|||||||
<?xml version="1.0"?>
|
|
||||||
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
|
|
||||||
|
|
||||||
<xs:element name="note">
|
|
||||||
<xs:complexType>
|
|
||||||
<xs:sequence>
|
|
||||||
<xs:element name="to" type="xs:string"/>
|
|
||||||
<xs:element name="from" type="xs:string"/>
|
|
||||||
<xs:element name="heading" type="xs:string"/>
|
|
||||||
<xs:element name="body" type="xs:string"/>
|
|
||||||
</xs:sequence>
|
|
||||||
</xs:complexType>
|
|
||||||
</xs:element>
|
|
||||||
|
|
||||||
</xs:schema>
|
|
@ -1,15 +0,0 @@
|
|||||||
<?xml version="1.0"?>
|
|
||||||
<wsdl:types xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
|
|
||||||
<xs:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://test.sample">
|
|
||||||
<xs:element name="note">
|
|
||||||
<xs:complexType>
|
|
||||||
<xs:sequence>
|
|
||||||
<xs:element name="to" type="xs:string"/>
|
|
||||||
<xs:element name="from" type="xs:string"/>
|
|
||||||
<xs:element name="heading" type="xs:string"/>
|
|
||||||
<xs:element name="body" type="xs:string"/>
|
|
||||||
</xs:sequence>
|
|
||||||
</xs:complexType>
|
|
||||||
</xs:element>
|
|
||||||
</xs:schema>
|
|
||||||
</wsdl:types>
|
|
@ -1,5 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
|
|
||||||
<wsdl:documentation>wsdlincludetest</wsdl:documentation>
|
|
||||||
<wsdl:include location="http://%location%/wsdl_include.wsdl"/>
|
|
||||||
</wsdl:definitions>
|
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user