diff --git a/composer.json b/composer.json
index 6ae1be8..546d544 100644
--- a/composer.json
+++ b/composer.json
@@ -36,7 +36,10 @@
"besimple/soap-server": "self.version"
},
"require-dev": {
- "mikey179/vfsStream": "dev-master"
+ "ext-mcrypt": "*",
+ "mikey179/vfsStream": "dev-master",
+ "symfony/filesystem": ">=2.3,<2.4-dev",
+ "symfony/process": ">=2.3,<2.4-dev"
},
"autoload": {
"psr-0": { "BeSimple\\": "src/" }
diff --git a/phpunit.xml.dist b/phpunit.xml.dist
index 09ecd8f..eaf287b 100644
--- a/phpunit.xml.dist
+++ b/phpunit.xml.dist
@@ -12,6 +12,10 @@
bootstrap="vendor/autoload.php"
>
+
+
+
+
./src/BeSimple/*/Tests/
diff --git a/src/BeSimple/SoapBundle/composer.json b/src/BeSimple/SoapBundle/composer.json
index 6dd3701..3f973dd 100644
--- a/src/BeSimple/SoapBundle/composer.json
+++ b/src/BeSimple/SoapBundle/composer.json
@@ -24,9 +24,9 @@
"ext-soap": "*",
"besimple/soap-common": "self.version",
"ass/xmlsecurity": "dev-master",
- "zendframework/zend-soap": "2.1.*",
- "zendframework/zend-mime": "2.1.*",
"zendframework/zend-mail": "2.1.*",
+ "zendframework/zend-mime": "2.1.*",
+ "zendframework/zend-soap": "2.1.*",
"symfony/http-foundation": ">=2.0,<2.4-dev"
},
"suggest": {
diff --git a/src/BeSimple/SoapClient/.gitignore b/src/BeSimple/SoapClient/.gitignore
index c49a5d8..db0e5ff 100644
--- a/src/BeSimple/SoapClient/.gitignore
+++ b/src/BeSimple/SoapClient/.gitignore
@@ -1,3 +1,4 @@
vendor/
composer.lock
phpunit.xml
+Tests/Fixtures/build_include/
diff --git a/src/BeSimple/SoapClient/Tests/AbstractWebserverTest.php b/src/BeSimple/SoapClient/Tests/AbstractWebserverTest.php
new file mode 100644
index 0000000..a7bc6d4
--- /dev/null
+++ b/src/BeSimple/SoapClient/Tests/AbstractWebserverTest.php
@@ -0,0 +1,56 @@
+
+ * (c) Francis Besset
+ *
+ * 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
+ */
+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);
+ }
+}
diff --git a/src/BeSimple/SoapClient/Tests/CurlTest.php b/src/BeSimple/SoapClient/Tests/CurlTest.php
index f8fc24b..a7e8541 100644
--- a/src/BeSimple/SoapClient/Tests/CurlTest.php
+++ b/src/BeSimple/SoapClient/Tests/CurlTest.php
@@ -17,167 +17,91 @@ use BeSimple\SoapClient\Curl;
/**
* @author Andreas Schamberger
*/
-class CurlTest extends \PHPUnit_Framework_TestCase
+class CurlTest extends AbstractWebserverTest
{
- protected $webserverProcessId;
-
- protected function startPhpWebserver()
- {
- $this->markTestSkipped('Start a local webserver is not the best practice');
-
- $dir = __DIR__.DIRECTORY_SEPARATOR.'Fixtures';
- if ('Windows' == substr(php_uname('s'), 0, 7)) {
- $powershellCommand = "\$app = start-process php.exe -ArgumentList '-S localhost:8000 -t ".$dir."' -WindowStyle 'Hidden' -passthru; Echo \$app.Id;";
- $shellCommand = 'powershell -command "& {'.$powershellCommand.'}"';
- } else {
- $shellCommand = "nohup php -S localhost:8000 -t ".$dir." &";
- }
- $output = array();
- exec($shellCommand, $output);
- $this->webserverProcessId = $output[0]; // pid is in first element
- }
-
- protected function stopPhpWebserver()
- {
- if (!is_null($this->webserverProcessId)) {
- if ('Windows' == substr(php_uname('s'), 0, 7 )) {
- exec('TASKKILL /F /PID ' . $this->webserverProcessId);
- } else {
- exec('kill ' . $this->webserverProcessId);
- }
- $this->webserverProcessId = null;
- }
- }
-
public function testExec()
{
- $this->startPhpWebserver();
-
$curl = new Curl();
- $this->assertTrue($curl->exec('http://localhost:8000/curl.txt'));
- $this->assertTrue($curl->exec('http://localhost:8000/404.txt'));
-
- $this->stopPhpWebserver();
+ $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()
{
- $this->startPhpWebserver();
-
$curl = new Curl();
$curl->exec('http://unknown/curl.txt');
$this->assertEquals('Could not connect to host', $curl->getErrorMessage());
- $curl->exec('xyz://localhost:8000/@404.txt');
+ $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());
-
- $this->stopPhpWebserver();
}
public function testGetRequestHeaders()
{
- $this->startPhpWebserver();
-
$curl = new Curl();
- $curl->exec('http://localhost:8000/curl.txt');
- $this->assertEquals(136, strlen($curl->getRequestHeaders()));
+ $curl->exec(sprintf('http://localhost:%d/curl.txt', WEBSERVER_PORT));
+ $this->assertEquals(132 + self::$websererPortLength, strlen($curl->getRequestHeaders()));
- $curl->exec('http://localhost:8000/404.txt');
- $this->assertEquals(135, strlen($curl->getRequestHeaders()));
-
- $this->stopPhpWebserver();
+ $curl->exec(sprintf('http://localhost:%s/404.txt', WEBSERVER_PORT));
+ $this->assertEquals(131 + self::$websererPortLength, strlen($curl->getRequestHeaders()));
}
public function testGetResponse()
{
- $this->startPhpWebserver();
-
$curl = new Curl();
- $curl->exec('http://localhost:8000/curl.txt');
- $this->assertEquals(150, strlen($curl->getResponse()));
+ $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('http://localhost:8000/404.txt');
- $this->assertEquals(1282, strlen($curl->getResponse()));
-
- $this->stopPhpWebserver();
+ $curl->exec(sprintf('http://localhost:%d/404.txt', WEBSERVER_PORT));
+ $this->assertSame('Not Found', $curl->getResponseStatusMessage());
}
public function testGetResponseBody()
{
- $this->startPhpWebserver();
-
$curl = new Curl();
- $curl->exec('http://localhost:8000/curl.txt');
+ $curl->exec(sprintf('http://localhost:%d/curl.txt', WEBSERVER_PORT));
$this->assertEquals('This is a testfile for cURL.', $curl->getResponseBody());
-
- $this->stopPhpWebserver();
}
public function testGetResponseContentType()
{
- $this->startPhpWebserver();
-
$curl = new Curl();
- $curl->exec('http://localhost:8000/curl.txt');
+ $curl->exec(sprintf('http://localhost:%d/curl.txt', WEBSERVER_PORT));
$this->assertEquals('text/plain; charset=UTF-8', $curl->getResponseContentType());
- $curl->exec('http://localhost:8000/404.txt');
+ $curl->exec(sprintf('http://localhost:%d/404.txt', WEBSERVER_PORT));
$this->assertEquals('text/html; charset=UTF-8', $curl->getResponseContentType());
-
- $this->stopPhpWebserver();
}
public function testGetResponseHeaders()
{
- $this->startPhpWebserver();
-
$curl = new Curl();
- $curl->exec('http://localhost:8000/curl.txt');
- $this->assertEquals(122, strlen($curl->getResponseHeaders()));
+ $curl->exec(sprintf('http://localhost:%d/curl.txt', WEBSERVER_PORT));
+ $this->assertEquals(117 + self::$websererPortLength, strlen($curl->getResponseHeaders()));
- $curl->exec('http://localhost:8000/404.txt');
- $this->assertEquals(130, strlen($curl->getResponseHeaders()));
-
- $this->stopPhpWebserver();
+ $curl->exec(sprintf('http://localhost:%d/404.txt', WEBSERVER_PORT));
+ $this->assertEquals(124 + self::$websererPortLength, strlen($curl->getResponseHeaders()));
}
public function testGetResponseStatusCode()
{
- $this->startPhpWebserver();
-
$curl = new Curl();
- $curl->exec('http://localhost:8000/curl.txt');
+ $curl->exec(sprintf('http://localhost:%d/curl.txt', WEBSERVER_PORT));
$this->assertEquals(200, $curl->getResponseStatusCode());
- $curl->exec('http://localhost:8000/404.txt');
+ $curl->exec(sprintf('http://localhost:%d/404.txt', WEBSERVER_PORT));
$this->assertEquals(404, $curl->getResponseStatusCode());
-
- $this->stopPhpWebserver();
- }
-
- public function testGetResponseStatusMessage()
- {
- $this->startPhpWebserver();
-
- $curl = new Curl();
-
- $curl->exec('http://localhost:8000/curl.txt');
- $this->assertEquals('OK', $curl->getResponseStatusMessage());
-
- $curl->exec('http://localhost:8000/404.txt');
- $this->assertEquals('Not Found', $curl->getResponseStatusMessage());
-
- $this->stopPhpWebserver();
}
}
diff --git a/src/BeSimple/SoapClient/Tests/Fixtures/wsdlinclude/wsdlinctest_absolute.xml b/src/BeSimple/SoapClient/Tests/Fixtures/wsdlinclude/wsdlinctest_absolute.xml
index dae033e..2f59ba1 100644
--- a/src/BeSimple/SoapClient/Tests/Fixtures/wsdlinclude/wsdlinctest_absolute.xml
+++ b/src/BeSimple/SoapClient/Tests/Fixtures/wsdlinclude/wsdlinctest_absolute.xml
@@ -1,5 +1,5 @@
wsdlincludetest
-
+
diff --git a/src/BeSimple/SoapClient/Tests/Fixtures/xsdinclude/xsdinctest_absolute.xml b/src/BeSimple/SoapClient/Tests/Fixtures/xsdinclude/xsdinctest_absolute.xml
index dc1b373..166e549 100644
--- a/src/BeSimple/SoapClient/Tests/Fixtures/xsdinclude/xsdinctest_absolute.xml
+++ b/src/BeSimple/SoapClient/Tests/Fixtures/xsdinclude/xsdinctest_absolute.xml
@@ -3,7 +3,7 @@
xsdinctest
-
+
diff --git a/src/BeSimple/SoapClient/Tests/WsdlDownloaderTest.php b/src/BeSimple/SoapClient/Tests/WsdlDownloaderTest.php
index 8f3825f..27f419e 100644
--- a/src/BeSimple/SoapClient/Tests/WsdlDownloaderTest.php
+++ b/src/BeSimple/SoapClient/Tests/WsdlDownloaderTest.php
@@ -13,256 +13,273 @@
namespace BeSimple\SoapClient\Tests;
use BeSimple\SoapClient\WsdlDownloader;
+use BeSimple\SoapCommon\Cache;
use BeSimple\SoapClient\Curl;
+use Symfony\Component\Filesystem\Filesystem;
+use org\bovigo\vfs\vfsStream;
+use org\bovigo\vfs\vfsStreamWrapper;
/**
* @author Andreas Schamberger
+ * @author Francis Besset
*/
-class WsdlDownloaderTest extends \PHPUnit_Framework_TestCase
+class WsdlDownloaderTest extends AbstractWebserverTest
{
- protected $webserverProcessId;
+ static protected $filesystem;
- protected function startPhpWebserver()
+ static protected $fixturesPath;
+
+ /**
+ * @dataProvider provideDownload
+ */
+ public function testDownload($source, $regexp, $nbDownloads)
{
- $this->markTestSkipped('Start a local webserver is not the best practice');
+ $wsdlCacheDir = vfsStream::setup('wsdl');
+ $wsdlCacheUrl = $wsdlCacheDir->url('wsdl');
- $dir = __DIR__.DIRECTORY_SEPARATOR.'Fixtures';
- if ('Windows' == substr(php_uname('s'), 0, 7)) {
- $powershellCommand = "\$app = start-process php.exe -ArgumentList '-S localhost:8000 -t ".$dir."' -WindowStyle 'Hidden' -passthru; Echo \$app.Id;";
- $shellCommand = 'powershell -command "& {'.$powershellCommand.'}"';
- } else {
- $shellCommand = "nohup php -S localhost:8000 -t ".$dir." &";
- }
- $output = array();
- exec($shellCommand, $output);
- $this->webserverProcessId = $output[0]; // pid is in first element
+ Cache::setEnabled(Cache::ENABLED);
+ Cache::setDirectory($wsdlCacheUrl);
+ $cacheDirForRegExp = preg_quote($wsdlCacheUrl, '#');
+
+ $wsdlDownloader = new WsdlDownloader(new Curl());
+ $this->assertCount(0, $wsdlCacheDir->getChildren());
+
+ $cacheFileName = $wsdlDownloader->download($source);
+ $this->assertCount($nbDownloads, $wsdlCacheDir->getChildren());
+
+ $this->assertRegExp('#'.sprintf($regexp, $cacheDirForRegExp).'#', file_get_contents($cacheFileName));
}
- protected function stopPhpWebserver()
+ public function provideDownload()
{
- if (!is_null($this->webserverProcessId)) {
- if ('Windows' == substr(php_uname('s'), 0, 7)) {
- exec('TASKKILL /F /PID ' . $this->webserverProcessId);
- } else {
- exec('kill ' . $this->webserverProcessId);
- }
- $this->webserverProcessId = null;
- }
- }
-
- public function testDownload()
- {
- $this->startPhpWebserver();
-
- $curl = new Curl();
- $wd = new WsdlDownloader($curl);
-
- $cacheDir = ini_get('soap.wsdl_cache_dir');
- if (!is_dir($cacheDir)) {
- $cacheDir = sys_get_temp_dir();
- $cacheDirForRegExp = preg_quote($cacheDir);
- }
-
- $tests = array(
- 'localWithAbsolutePath' => array(
- 'source' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/xsdinclude/xsdinctest_absolute.xml',
- 'assertRegExp' => '~.*'.$cacheDirForRegExp.'\\\wsdl_.*\.cache.*~',
+ return array(
+ array(
+ __DIR__.DIRECTORY_SEPARATOR.'Fixtures/build_include/xsdinctest_absolute.xml',
+ '%s/wsdl_[a-f0-9]{32}\.cache',
+ 2,
),
- 'localWithRelativePath' => array(
- 'source' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/xsdinclude/xsdinctest_relative.xml',
- 'assertRegExp' => '~.*\.\./type_include\.xsd.*~',
+ array(
+ __DIR__.DIRECTORY_SEPARATOR.'Fixtures/xsdinclude/xsdinctest_relative.xml',
+ '\.\./type_include\.xsd',
+ 1,
),
- 'remoteWithAbsolutePath' => array(
- 'source' => 'http://localhost:8000/xsdinclude/xsdinctest_absolute.xml',
- 'assertRegExp' => '~.*'.$cacheDirForRegExp.'\\\wsdl_.*\.cache.*~',
+ array(
+ sprintf('http://localhost:%d/build_include/xsdinctest_absolute.xml', WEBSERVER_PORT),
+ '%s/wsdl_[a-f0-9]{32}\.cache',
+ 2,
),
- 'remoteWithAbsolutePath' => array(
- 'source' => 'http://localhost:8000/xsdinclude/xsdinctest_relative.xml',
- 'assertRegExp' => '~.*'.$cacheDirForRegExp.'\\\wsdl_.*\.cache.*~',
+ array(
+ sprintf('http://localhost:%d/xsdinclude/xsdinctest_relative.xml', WEBSERVER_PORT),
+ '%s/wsdl_[a-f0-9]{32}\.cache',
+ 2,
),
);
-
- foreach ($tests as $name => $values) {
- $cacheFileName = $wd->download($values['source']);
- $result = file_get_contents($cacheFileName);
- $this->assertRegExp($values['assertRegExp'], $result, $name);
- unlink($cacheFileName);
- }
-
- $this->stopPhpWebserver();
}
public function testIsRemoteFile()
{
- $curl = new Curl();
- $wd = new WsdlDownloader($curl);
+ $wsdlDownloader = new WsdlDownloader(new Curl());
- $class = new \ReflectionClass($wd);
- $method = $class->getMethod('isRemoteFile');
- $method->setAccessible(true);
+ $r = new \ReflectionClass($wsdlDownloader);
+ $m = $r->getMethod('isRemoteFile');
+ $m->setAccessible(true);
- $this->assertTrue($method->invoke($wd, 'http://www.php.net/'));
- $this->assertTrue($method->invoke($wd, 'http://localhost/'));
- $this->assertTrue($method->invoke($wd, 'http://mylocaldomain/'));
- $this->assertTrue($method->invoke($wd, 'http://www.php.net/dir/test.html'));
- $this->assertTrue($method->invoke($wd, 'http://localhost/dir/test.html'));
- $this->assertTrue($method->invoke($wd, 'http://mylocaldomain/dir/test.html'));
- $this->assertTrue($method->invoke($wd, 'https://www.php.net/'));
- $this->assertTrue($method->invoke($wd, 'https://localhost/'));
- $this->assertTrue($method->invoke($wd, 'https://mylocaldomain/'));
- $this->assertTrue($method->invoke($wd, 'https://www.php.net/dir/test.html'));
- $this->assertTrue($method->invoke($wd, 'https://localhost/dir/test.html'));
- $this->assertTrue($method->invoke($wd, 'https://mylocaldomain/dir/test.html'));
- $this->assertFalse($method->invoke($wd, 'c:/dir/test.html'));
- $this->assertFalse($method->invoke($wd, '/dir/test.html'));
- $this->assertFalse($method->invoke($wd, '../dir/test.html'));
+ $this->assertTrue($m->invoke($wsdlDownloader, 'http://www.php.net/'));
+ $this->assertTrue($m->invoke($wsdlDownloader, 'http://localhost/'));
+ $this->assertTrue($m->invoke($wsdlDownloader, 'http://mylocaldomain/'));
+ $this->assertTrue($m->invoke($wsdlDownloader, 'http://www.php.net/dir/test.html'));
+ $this->assertTrue($m->invoke($wsdlDownloader, 'http://localhost/dir/test.html'));
+ $this->assertTrue($m->invoke($wsdlDownloader, 'http://mylocaldomain/dir/test.html'));
+ $this->assertTrue($m->invoke($wsdlDownloader, 'https://www.php.net/'));
+ $this->assertTrue($m->invoke($wsdlDownloader, 'https://localhost/'));
+ $this->assertTrue($m->invoke($wsdlDownloader, 'https://mylocaldomain/'));
+ $this->assertTrue($m->invoke($wsdlDownloader, 'https://www.php.net/dir/test.html'));
+ $this->assertTrue($m->invoke($wsdlDownloader, 'https://localhost/dir/test.html'));
+ $this->assertTrue($m->invoke($wsdlDownloader, 'https://mylocaldomain/dir/test.html'));
+ $this->assertFalse($m->invoke($wsdlDownloader, 'c:/dir/test.html'));
+ $this->assertFalse($m->invoke($wsdlDownloader, '/dir/test.html'));
+ $this->assertFalse($m->invoke($wsdlDownloader, '../dir/test.html'));
}
- public function testResolveWsdlIncludes()
+ /**
+ * @dataProvider provideResolveWsdlIncludes
+ */
+ public function testResolveWsdlIncludes($source, $cacheFile, $remoteParentUrl, $regexp, $nbDownloads)
{
- $this->startPhpWebserver();
+ $wsdlCacheDir = vfsStream::setup('wsdl');
+ $wsdlCacheUrl = $wsdlCacheDir->url('wsdl');
- $curl = new Curl();
- $wd = new WsdlDownloader($curl);
+ Cache::setEnabled(Cache::ENABLED);
+ Cache::setDirectory($wsdlCacheUrl);
+ $cacheDirForRegExp = preg_quote($wsdlCacheUrl, '#');
- $class = new \ReflectionClass($wd);
- $method = $class->getMethod('resolveRemoteIncludes');
- $method->setAccessible(true);
+ $wsdlDownloader = new WsdlDownloader(new Curl());
+ $r = new \ReflectionClass($wsdlDownloader);
+ $m = $r->getMethod('resolveRemoteIncludes');
+ $m->setAccessible(true);
- $cacheDir = ini_get('soap.wsdl_cache_dir');
- if (!is_dir($cacheDir)) {
- $cacheDir = sys_get_temp_dir();
- $cacheDirForRegExp = preg_quote($cacheDir);
- }
+ $this->assertCount(0, $wsdlCacheDir->getChildren());
- $remoteUrlAbsolute = 'http://localhost:8000/wsdlinclude/wsdlinctest_absolute.xml';
- $remoteUrlRelative = 'http://localhost:8000/wsdlinclude/wsdlinctest_relative.xml';
- $tests = array(
- 'localWithAbsolutePath' => array(
- 'source' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/wsdlinclude/wsdlinctest_absolute.xml',
- 'cacheFile' => $cacheDir.'/cache_local_absolute.xml',
- 'remoteParentUrl' => null,
- 'assertRegExp' => '~.*'.$cacheDirForRegExp.'\\\wsdl_.*\.cache.*~',
- ),
- 'localWithRelativePath' => array(
- 'source' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/wsdlinclude/wsdlinctest_relative.xml',
- 'cacheFile' => $cacheDir.'/cache_local_relative.xml',
- 'remoteParentUrl' => null,
- 'assertRegExp' => '~.*\.\./wsdl_include\.wsdl.*~',
- ),
- 'remoteWithAbsolutePath' => array(
- 'source' => $remoteUrlAbsolute,
- 'cacheFile' => $cacheDir.'/cache_remote_absolute.xml',
- 'remoteParentUrl' => $remoteUrlAbsolute,
- 'assertRegExp' => '~.*'.$cacheDirForRegExp.'\\\wsdl_.*\.cache.*~',
- ),
- 'remoteWithAbsolutePath' => array(
- 'source' => $remoteUrlRelative,
- 'cacheFile' => $cacheDir.'/cache_remote_relative.xml',
- 'remoteParentUrl' => $remoteUrlRelative,
- 'assertRegExp' => '~.*'.$cacheDirForRegExp.'\\\wsdl_.*\.cache.*~',
- ),
- );
+ $cacheFile = sprintf($cacheFile, $wsdlCacheUrl);
+ $m->invoke($wsdlDownloader, file_get_contents($source), $cacheFile, $remoteParentUrl);
+ $this->assertCount($nbDownloads, $wsdlCacheDir->getChildren());
- foreach ($tests as $name => $values) {
- $wsdl = file_get_contents($values['source']);
- $method->invoke($wd, $wsdl, $values['cacheFile'], $values['remoteParentUrl']);
- $result = file_get_contents($values['cacheFile']);
- $this->assertRegExp($values['assertRegExp'], $result, $name);
- unlink($values['cacheFile']);
- }
-
- $this->stopPhpWebserver();
+ $this->assertRegExp('#'.sprintf($regexp, $cacheDirForRegExp).'#', file_get_contents($cacheFile));
}
- public function testResolveXsdIncludes()
+ public function provideResolveWsdlIncludes()
{
- $this->startPhpWebserver();
+ $remoteUrlAbsolute = sprintf('http://localhost:%d/build_include/wsdlinctest_absolute.xml', WEBSERVER_PORT);
+ $remoteUrlRelative = sprintf('http://localhost:%d/wsdlinclude/wsdlinctest_relative.xml', WEBSERVER_PORT);
- $curl = new Curl();
- $wd = new WsdlDownloader($curl);
-
- $class = new \ReflectionClass($wd);
- $method = $class->getMethod('resolveRemoteIncludes');
- $method->setAccessible(true);
-
- $cacheDir = ini_get('soap.wsdl_cache_dir');
- if (!is_dir($cacheDir)) {
- $cacheDir = sys_get_temp_dir();
- $cacheDirForRegExp = preg_quote($cacheDir);
- }
-
- $remoteUrlAbsolute = 'http://localhost:8000/xsdinclude/xsdinctest_absolute.xml';
- $remoteUrlRelative = 'http://localhost:8000/xsdinclude/xsdinctest_relative.xml';
- $tests = array(
- 'localWithAbsolutePath' => array(
- 'source' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/xsdinclude/xsdinctest_absolute.xml',
- 'cacheFile' => $cacheDir.'/cache_local_absolute.xml',
- 'remoteParentUrl' => null,
- 'assertRegExp' => '~.*'.$cacheDirForRegExp.'\\\wsdl_.*\.cache.*~',
+ return array(
+ array(
+ __DIR__.DIRECTORY_SEPARATOR.'Fixtures/build_include/wsdlinctest_absolute.xml',
+ '%s/cache_local_absolute.xml',
+ null,
+ '%s/wsdl_[a-f0-9]{32}.cache',
+ 2,
),
- 'localWithRelativePath' => array(
- 'source' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/xsdinclude/xsdinctest_relative.xml',
- 'cacheFile' => $cacheDir.'/cache_local_relative.xml',
- 'remoteParentUrl' => null,
- 'assertRegExp' => '~.*\.\./type_include\.xsd.*~',
+ array(
+ __DIR__.DIRECTORY_SEPARATOR.'Fixtures/wsdlinclude/wsdlinctest_relative.xml',
+ '%s/cache_local_relative.xml',
+ null,
+ '\.\./wsdl_include\.wsdl',
+ 1,
),
- 'remoteWithAbsolutePath' => array(
- 'source' => $remoteUrlAbsolute,
- 'cacheFile' => $cacheDir.'/cache_remote_absolute.xml',
- 'remoteParentUrl' => $remoteUrlAbsolute,
- 'assertRegExp' => '~.*'.$cacheDirForRegExp.'\\\wsdl_.*\.cache.*~',
+ array(
+ $remoteUrlAbsolute,
+ '%s/cache_remote_absolute.xml',
+ $remoteUrlAbsolute,
+ '%s/wsdl_[a-f0-9]{32}\.cache',
+ 2,
),
- 'remoteWithAbsolutePath' => array(
- 'source' => $remoteUrlRelative,
- 'cacheFile' => $cacheDir.'/cache_remote_relative.xml',
- 'remoteParentUrl' => $remoteUrlRelative,
- 'assertRegExp' => '~.*'.$cacheDirForRegExp.'\\\wsdl_.*\.cache.*~',
+ array(
+ $remoteUrlRelative,
+ '%s/cache_remote_relative.xml',
+ $remoteUrlRelative,
+ '%s/wsdl_[a-f0-9]{32}\.cache',
+ 2
),
);
+ }
- foreach ($tests as $name => $values) {
- $wsdl = file_get_contents($values['source']);
- $method->invoke($wd, $wsdl, $values['cacheFile'], $values['remoteParentUrl']);
- $result = file_get_contents($values['cacheFile']);
- $this->assertRegExp($values['assertRegExp'], $result, $name);
- unlink($values['cacheFile']);
- }
+ /**
+ * @dataProvider provideResolveXsdIncludes
+ */
+ public function testResolveXsdIncludes($source, $cacheFile, $remoteParentUrl, $regexp, $nbDownloads)
+ {
+ $wsdlCacheDir = vfsStream::setup('wsdl');
+ $wsdlCacheUrl = $wsdlCacheDir->url('wsdl');
- $this->stopPhpWebserver();
+ Cache::setEnabled(Cache::ENABLED);
+ Cache::setDirectory($wsdlCacheUrl);
+ $cacheDirForRegExp = preg_quote($wsdlCacheUrl, '#');
+
+ $wsdlDownloader = new WsdlDownloader(new Curl());
+ $r = new \ReflectionClass($wsdlDownloader);
+ $m = $r->getMethod('resolveRemoteIncludes');
+ $m->setAccessible(true);
+
+ $this->assertCount(0, $wsdlCacheDir->getChildren());
+
+ $cacheFile = sprintf($cacheFile, $wsdlCacheUrl);
+ $m->invoke($wsdlDownloader, file_get_contents($source), $cacheFile, $remoteParentUrl);
+ $this->assertCount($nbDownloads, $wsdlCacheDir->getChildren());
+
+ $this->assertRegExp('#'.sprintf($regexp, $cacheDirForRegExp).'#', file_get_contents($cacheFile));
+ }
+
+ public function provideResolveXsdIncludes()
+ {
+ $remoteUrlAbsolute = sprintf('http://localhost:%d/build_include/xsdinctest_absolute.xml', WEBSERVER_PORT);
+ $remoteUrlRelative = sprintf('http://localhost:%d/xsdinclude/xsdinctest_relative.xml', WEBSERVER_PORT);
+
+ return array(
+ array(
+ __DIR__.DIRECTORY_SEPARATOR.'Fixtures/build_include/xsdinctest_absolute.xml',
+ '%s/cache_local_absolute.xml',
+ null,
+ '%s/wsdl_[a-f0-9]{32}\.cache',
+ 2,
+ ),
+ array(
+ __DIR__.DIRECTORY_SEPARATOR.'Fixtures/xsdinclude/xsdinctest_relative.xml',
+ '%s/cache_local_relative.xml',
+ null,
+ '\.\./type_include\.xsd',
+ 1,
+ ),
+ array(
+ $remoteUrlAbsolute,
+ '%s/cache_remote_absolute.xml',
+ $remoteUrlAbsolute,
+ '%s/wsdl_[a-f0-9]{32}\.cache',
+ 2,
+ ),
+ array(
+ $remoteUrlRelative,
+ '%s/cache_remote_relative.xml',
+ $remoteUrlRelative,
+ '%s/wsdl_[a-f0-9]{32}\.cache',
+ 2,
+ ),
+ );
}
public function testResolveRelativePathInUrl()
{
- $curl = new Curl();
- $wd = new WsdlDownloader($curl);
+ $wsdlDownloader = new WsdlDownloader(new Curl());
- $class = new \ReflectionClass($wd);
- $method = $class->getMethod('resolveRelativePathInUrl');
- $method->setAccessible(true);
+ $r = new \ReflectionClass($wsdlDownloader);
+ $m = $r->getMethod('resolveRelativePathInUrl');
+ $m->setAccessible(true);
- $this->assertEquals('http://localhost:8080/test', $method->invoke($wd, 'http://localhost:8080/sub', '/test'));
- $this->assertEquals('http://localhost:8080/test', $method->invoke($wd, 'http://localhost:8080/sub/', '/test'));
+ $this->assertEquals('http://localhost:8080/test', $m->invoke($wsdlDownloader, 'http://localhost:8080/sub', '/test'));
+ $this->assertEquals('http://localhost:8080/test', $m->invoke($wsdlDownloader, 'http://localhost:8080/sub/', '/test'));
- $this->assertEquals('http://localhost/test', $method->invoke($wd, 'http://localhost/sub', '/test'));
- $this->assertEquals('http://localhost/test', $method->invoke($wd, 'http://localhost/sub/', '/test'));
+ $this->assertEquals('http://localhost/test', $m->invoke($wsdlDownloader, 'http://localhost/sub', '/test'));
+ $this->assertEquals('http://localhost/test', $m->invoke($wsdlDownloader, 'http://localhost/sub/', '/test'));
- $this->assertEquals('http://localhost/test', $method->invoke($wd, 'http://localhost', './test'));
- $this->assertEquals('http://localhost/test', $method->invoke($wd, 'http://localhost/', './test'));
+ $this->assertEquals('http://localhost/test', $m->invoke($wsdlDownloader, 'http://localhost', './test'));
+ $this->assertEquals('http://localhost/test', $m->invoke($wsdlDownloader, 'http://localhost/', './test'));
- $this->assertEquals('http://localhost/sub/test', $method->invoke($wd, 'http://localhost/sub/sub', './test'));
- $this->assertEquals('http://localhost/sub/sub/test', $method->invoke($wd, 'http://localhost/sub/sub/', './test'));
+ $this->assertEquals('http://localhost/sub/test', $m->invoke($wsdlDownloader, 'http://localhost/sub/sub', './test'));
+ $this->assertEquals('http://localhost/sub/sub/test', $m->invoke($wsdlDownloader, 'http://localhost/sub/sub/', './test'));
- $this->assertEquals('http://localhost/test', $method->invoke($wd, 'http://localhost/sub/sub', '../test'));
- $this->assertEquals('http://localhost/sub/test', $method->invoke($wd, 'http://localhost/sub/sub/', '../test'));
+ $this->assertEquals('http://localhost/test', $m->invoke($wsdlDownloader, 'http://localhost/sub/sub', '../test'));
+ $this->assertEquals('http://localhost/sub/test', $m->invoke($wsdlDownloader, 'http://localhost/sub/sub/', '../test'));
- $this->assertEquals('http://localhost/test', $method->invoke($wd, 'http://localhost/sub/sub/sub', '../../test'));
- $this->assertEquals('http://localhost/sub/test', $method->invoke($wd, 'http://localhost/sub/sub/sub/', '../../test'));
+ $this->assertEquals('http://localhost/test', $m->invoke($wsdlDownloader, 'http://localhost/sub/sub/sub', '../../test'));
+ $this->assertEquals('http://localhost/sub/test', $m->invoke($wsdlDownloader, 'http://localhost/sub/sub/sub/', '../../test'));
- $this->assertEquals('http://localhost/test', $method->invoke($wd, 'http://localhost/sub/sub/sub/sub', '../../../test'));
- $this->assertEquals('http://localhost/sub/test', $method->invoke($wd, 'http://localhost/sub/sub/sub/sub/', '../../../test'));
+ $this->assertEquals('http://localhost/test', $m->invoke($wsdlDownloader, 'http://localhost/sub/sub/sub/sub', '../../../test'));
+ $this->assertEquals('http://localhost/sub/test', $m->invoke($wsdlDownloader, 'http://localhost/sub/sub/sub/sub/', '../../../test'));
- $this->assertEquals('http://localhost/test', $method->invoke($wd, 'http://localhost/sub/sub/sub', '../../../test'));
- $this->assertEquals('http://localhost/test', $method->invoke($wd, 'http://localhost/sub/sub/sub/', '../../../test'));
+ $this->assertEquals('http://localhost/test', $m->invoke($wsdlDownloader, 'http://localhost/sub/sub/sub', '../../../test'));
+ $this->assertEquals('http://localhost/test', $m->invoke($wsdlDownloader, 'http://localhost/sub/sub/sub/', '../../../test'));
+ }
+
+ public static function setUpBeforeClass()
+ {
+ parent::setUpBeforeClass();
+
+ self::$filesystem = new Filesystem();
+ self::$fixturesPath = __DIR__.DIRECTORY_SEPARATOR.'Fixtures'.DIRECTORY_SEPARATOR;
+ self::$filesystem->mkdir(self::$fixturesPath.'build_include');
+
+ foreach (array('wsdlinclude/wsdlinctest_absolute.xml', 'xsdinclude/xsdinctest_absolute.xml') as $file) {
+ $content = file_get_contents(self::$fixturesPath.$file);
+ $content = preg_replace('#'.preg_quote('%location%').'#', sprintf('localhost:%d', WEBSERVER_PORT), $content);
+
+ self::$filesystem->dumpFile(self::$fixturesPath.'build_include'.DIRECTORY_SEPARATOR.pathinfo($file, PATHINFO_BASENAME), $content);
+ }
+ }
+
+ public static function tearDownAfterClass()
+ {
+ parent::tearDownAfterClass();
+
+ self::$filesystem->remove(self::$fixturesPath.'build_include');
}
}
diff --git a/src/BeSimple/SoapClient/WsdlDownloader.php b/src/BeSimple/SoapClient/WsdlDownloader.php
index 9f62fe4..6e403ce 100644
--- a/src/BeSimple/SoapClient/WsdlDownloader.php
+++ b/src/BeSimple/SoapClient/WsdlDownloader.php
@@ -12,6 +12,7 @@
namespace BeSimple\SoapClient;
+use BeSimple\SoapCommon\Cache;
use BeSimple\SoapCommon\Helper;
/**
@@ -66,22 +67,18 @@ class WsdlDownloader
* @param boolean $resolveRemoteIncludes WSDL/XSD include enabled?
* @param boolean $cacheWsdl Cache constant
*/
- public function __construct(Curl $curl, $resolveRemoteIncludes = true, $cacheWsdl = WSDL_CACHE_DISK)
+ public function __construct(Curl $curl, $resolveRemoteIncludes = true, $cacheWsdl = Cache::TYPE_DISK)
{
- $this->curl = $curl;
- $this->resolveRemoteIncludes = $resolveRemoteIncludes;
+ $this->curl = $curl;
+ $this->resolveRemoteIncludes = (Boolean) $resolveRemoteIncludes;
+
// get current WSDL caching config
- $this->cacheEnabled = (bool) ini_get('soap.wsdl_cache_enabled');
- if ($this->cacheEnabled === true
- && $cacheWsdl === WSDL_CACHE_NONE) {
- $this->cacheEnabled = false;
+ $this->cacheEnabled = $cacheWsdl === Cache::TYPE_NONE ? Cache::DISABLED : Cache::ENABLED == Cache::isEnabled();
+
+ if ($this->cacheEnabled) {
+ $this->cacheDir = Cache::getDirectory();
+ $this->cacheTtl = Cache::getLifetime();
}
- $this->cacheDir = ini_get('soap.wsdl_cache_dir');
- if (!is_dir($this->cacheDir)) {
- $this->cacheDir = sys_get_temp_dir();
- }
- $this->cacheDir = rtrim($this->cacheDir, '/\\');
- $this->cacheTtl = ini_get('soap.wsdl_cache_ttl');
}
/**
@@ -96,40 +93,39 @@ class WsdlDownloader
// download and cache remote WSDL files or local ones where we want to
// resolve remote XSD includes
$isRemoteFile = $this->isRemoteFile($wsdl);
- if ($isRemoteFile === true || $this->resolveRemoteIncludes === true) {
- $cacheFile = $this->cacheDir . DIRECTORY_SEPARATOR . 'wsdl_' . md5($wsdl) . '.cache';
- if ($this->cacheEnabled === false
- || !file_exists($cacheFile)
- || (filemtime($cacheFile) + $this->cacheTtl) < time()) {
- if ($isRemoteFile === true) {
+ if ($isRemoteFile || $this->resolveRemoteIncludes) {
+ $cacheFilePath = $this->cacheDir.DIRECTORY_SEPARATOR.'wsdl_'.md5($wsdl).'.cache';
+
+ if (!$this->cacheEnabled || !file_exists($cacheFilePath) || (filemtime($cacheFilePath) + $this->cacheTtl) < time()) {
+ if ($isRemoteFile) {
// execute request
$responseSuccessfull = $this->curl->exec($wsdl);
// get content
- if ($responseSuccessfull === true) {
+ if ($responseSuccessfull) {
$response = $this->curl->getResponseBody();
- if ($this->resolveRemoteIncludes === true) {
- $this->resolveRemoteIncludes($response, $cacheFile, $wsdl);
+
+ if ($this->resolveRemoteIncludes) {
+ $this->resolveRemoteIncludes($response, $cacheFilePath, $wsdl);
} else {
- file_put_contents($cacheFile, $response);
+ file_put_contents($cacheFilePath, $response);
}
} else {
throw new \ErrorException("SOAP-ERROR: Parsing WSDL: Couldn't load from '" . $wsdl ."'");
}
} elseif (file_exists($wsdl)) {
$response = file_get_contents($wsdl);
- $this->resolveRemoteIncludes($response, $cacheFile);
+ $this->resolveRemoteIncludes($response, $cacheFilePath);
} else {
throw new \ErrorException("SOAP-ERROR: Parsing WSDL: Couldn't load from '" . $wsdl ."'");
}
}
- return $cacheFile;
+ return $cacheFilePath;
} elseif (file_exists($wsdl)) {
-
return realpath($wsdl);
- } else {
- throw new \ErrorException("SOAP-ERROR: Parsing WSDL: Couldn't load from '" . $wsdl ."'");
}
+
+ throw new \ErrorException("SOAP-ERROR: Parsing WSDL: Couldn't load from '" . $wsdl ."'");
}
/**
@@ -141,35 +137,36 @@ class WsdlDownloader
*/
private function isRemoteFile($file)
{
- $isRemoteFile = false;
// @parse_url to suppress E_WARNING for invalid urls
- if (($url = @parse_url($file)) !== false) {
- if (isset($url['scheme']) && substr($url['scheme'], 0, 4) == 'http') {
- $isRemoteFile = true;
+ if (false !== $url = @parse_url($file)) {
+ if (isset($url['scheme']) && 'http' === substr($url['scheme'], 0, 4)) {
+ return true;
}
}
- return $isRemoteFile;
+ return false;
}
/**
* Resolves remote WSDL/XSD includes within the WSDL files.
*
- * @param string $xml XML file
- * @param string $cacheFile Cache file name
- * @param boolean $parentFile Parent file name
+ * @param string $xml XML file
+ * @param string $cacheFilePath Cache file name
+ * @param boolean $parentFilePath Parent file name
*
* @return void
*/
- private function resolveRemoteIncludes($xml, $cacheFile, $parentFile = null)
+ private function resolveRemoteIncludes($xml, $cacheFilePath, $parentFilePath = null)
{
$doc = new \DOMDocument();
$doc->loadXML($xml);
+
$xpath = new \DOMXPath($doc);
$xpath->registerNamespace(Helper::PFX_XML_SCHEMA, Helper::NS_XML_SCHEMA);
$xpath->registerNamespace(Helper::PFX_WSDL, Helper::NS_WSDL);
+
// WSDL include/import
- $query = './/' . Helper::PFX_WSDL . ':include | .//' . Helper::PFX_WSDL . ':import';
+ $query = './/'.Helper::PFX_WSDL.':include | .//'.Helper::PFX_WSDL.':import';
$nodes = $xpath->query($query);
if ($nodes->length > 0) {
foreach ($nodes as $node) {
@@ -177,32 +174,34 @@ class WsdlDownloader
if ($this->isRemoteFile($location)) {
$location = $this->download($location);
$node->setAttribute('location', $location);
- } elseif (!is_null($parentFile)) {
- $location = $this->resolveRelativePathInUrl($parentFile, $location);
+ } elseif (null !== $parentFilePath) {
+ $location = $this->resolveRelativePathInUrl($parentFilePath, $location);
$location = $this->download($location);
$node->setAttribute('location', $location);
}
}
}
+
// XML schema include/import
- $query = './/' . Helper::PFX_XML_SCHEMA . ':include | .//' . Helper::PFX_XML_SCHEMA . ':import';
+ $query = './/'.Helper::PFX_XML_SCHEMA.':include | .//'.Helper::PFX_XML_SCHEMA.':import';
$nodes = $xpath->query($query);
if ($nodes->length > 0) {
foreach ($nodes as $node) {
if ($node->hasAttribute('schemaLocation')) {
- $schemaLocation = $node->getAttribute('schemaLocation');
- if ($this->isRemoteFile($schemaLocation)) {
- $schemaLocation = $this->download($schemaLocation);
- $node->setAttribute('schemaLocation', $schemaLocation);
- } elseif (null !== $parentFile) {
- $schemaLocation = $this->resolveRelativePathInUrl($parentFile, $schemaLocation);
- $schemaLocation = $this->download($schemaLocation);
- $node->setAttribute('schemaLocation', $schemaLocation);
+ $schemaLocation = $node->getAttribute('schemaLocation');
+ if ($this->isRemoteFile($schemaLocation)) {
+ $schemaLocation = $this->download($schemaLocation);
+ $node->setAttribute('schemaLocation', $schemaLocation);
+ } elseif (null !== $parentFilePath) {
+ $schemaLocation = $this->resolveRelativePathInUrl($parentFilePath, $schemaLocation);
+ $schemaLocation = $this->download($schemaLocation);
+ $node->setAttribute('schemaLocation', $schemaLocation);
}
}
}
}
- $doc->save($cacheFile);
+
+ $doc->save($cacheFilePath);
}
/**
@@ -216,46 +215,53 @@ class WsdlDownloader
private function resolveRelativePathInUrl($base, $relative)
{
$urlParts = parse_url($base);
+
// combine base path with relative path
- if (isset($urlParts['path']) && strpos($relative, '/') === 0) {
+ if (isset($urlParts['path']) && '/' === $relative{0}) {
// $relative is absolute path from domain (starts with /)
$path = $relative;
} elseif (isset($urlParts['path']) && strrpos($urlParts['path'], '/') === (strlen($urlParts['path']) )) {
// base path is directory
- $path = $urlParts['path'] . $relative;
+ $path = $urlParts['path'].$relative;
} elseif (isset($urlParts['path'])) {
// strip filename from base path
- $path = substr($urlParts['path'], 0, strrpos($urlParts['path'], '/')) . '/' . $relative;
+ $path = substr($urlParts['path'], 0, strrpos($urlParts['path'], '/')).'/'.$relative;
} else {
// no base path
- $path = '/' . $relative;
+ $path = '/'.$relative;
}
+
// foo/./bar ==> foo/bar
- $path = preg_replace('~/\./~', '/', $path);
// remove double slashes
- $path = preg_replace('~/+~', '/', $path);
+ $path = preg_replace(array('#/\./#', '#/+#'), '/', $path);
+
// split path by '/'
$parts = explode('/', $path);
+
// resolve /../
foreach ($parts as $key => $part) {
- if ($part == "..") {
- $keyToDelete = $key-1;
+ if ('..' === $part) {
+ $keyToDelete = $key - 1;
+
while ($keyToDelete > 0) {
if (isset($parts[$keyToDelete])) {
unset($parts[$keyToDelete]);
+
break;
- } else {
- $keyToDelete--;
}
+
+ $keyToDelete--;
}
+
unset($parts[$key]);
}
}
- $hostname = $urlParts['scheme'] . '://' . $urlParts['host'];
+
+ $hostname = $urlParts['scheme'].'://'.$urlParts['host'];
if (isset($urlParts['port'])) {
- $hostname .= ':' . $urlParts['port'];
+ $hostname .= ':'.$urlParts['port'];
}
- return $hostname . implode('/', $parts);
+ return $hostname.implode('/', $parts);
}
-}
\ No newline at end of file
+}
diff --git a/src/BeSimple/SoapClient/composer.json b/src/BeSimple/SoapClient/composer.json
index 8cf7483..3df0b70 100644
--- a/src/BeSimple/SoapClient/composer.json
+++ b/src/BeSimple/SoapClient/composer.json
@@ -26,6 +26,11 @@
"besimple/soap-common": "self.version",
"ass/xmlsecurity": "dev-master"
},
+ "require-dev": {
+ "mikey179/vfsStream": "dev-master",
+ "symfony/filesystem": ">=2.3,<2.4-dev",
+ "symfony/process": ">=2.3,<2.4-dev"
+ },
"autoload": {
"psr-0": { "BeSimple\\SoapClient": "" }
},
diff --git a/src/BeSimple/SoapClient/phpunit.xml.dist b/src/BeSimple/SoapClient/phpunit.xml.dist
index 13bd743..e223604 100644
--- a/src/BeSimple/SoapClient/phpunit.xml.dist
+++ b/src/BeSimple/SoapClient/phpunit.xml.dist
@@ -11,6 +11,11 @@
syntaxCheck="false"
bootstrap="vendor/autoload.php"
>
+
+
+
+
+
./Tests/
diff --git a/src/BeSimple/SoapCommon/composer.json b/src/BeSimple/SoapCommon/composer.json
index a3962af..04f3bc2 100644
--- a/src/BeSimple/SoapCommon/composer.json
+++ b/src/BeSimple/SoapCommon/composer.json
@@ -25,6 +25,7 @@
"ass/xmlsecurity": "dev-master"
},
"require-dev": {
+ "ext-mcrypt": "*",
"mikey179/vfsStream": "dev-master"
},
"autoload": {