From 7e2f1201ec5dbd1f1ffa606b4ef3f3c186ee0d86 Mon Sep 17 00:00:00 2001 From: anxietypb <anxiety.pb@gmail.com> Date: Wed, 4 Jan 2017 13:29:28 +0100 Subject: [PATCH] =?UTF-8?q?/vendor/=20Verzeichnis=20zu=20.gitignore=20hinz?= =?UTF-8?q?ugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +- vendor/autoload.php | 7 - vendor/composer/ClassLoader.php | 415 ------ vendor/composer/LICENSE | 21 - vendor/composer/autoload_classmap.php | 9 - vendor/composer/autoload_files.php | 10 - vendor/composer/autoload_namespaces.php | 10 - vendor/composer/autoload_psr4.php | 13 - vendor/composer/autoload_real.php | 70 - vendor/composer/autoload_static.php | 70 - vendor/composer/installed.json | 248 ---- .../container-interop/.gitignore | 3 - .../container-interop/LICENSE | 20 - .../container-interop/README.md | 85 -- .../container-interop/composer.json | 11 - .../docs/ContainerInterface-meta.md | 114 -- .../docs/ContainerInterface.md | 153 --- .../docs/Delegate-lookup-meta.md | 259 ---- .../container-interop/docs/Delegate-lookup.md | 60 - .../docs/images/interoperating_containers.png | Bin 35971 -> 0 bytes .../docs/images/priority.png | Bin 22949 -> 0 bytes .../docs/images/side_by_side_containers.png | Bin 22519 -> 0 bytes .../Interop/Container/ContainerInterface.php | 37 - .../Exception/ContainerException.php | 13 - .../Container/Exception/NotFoundException.php | 13 - vendor/nikic/fast-route/.hhconfig | 1 - vendor/nikic/fast-route/.travis.yml | 12 - vendor/nikic/fast-route/FastRoute.hhi | 126 -- vendor/nikic/fast-route/LICENSE | 31 - vendor/nikic/fast-route/README.md | 273 ---- vendor/nikic/fast-route/composer.json | 21 - vendor/nikic/fast-route/phpunit.xml | 24 - .../fast-route/src/BadRouteException.php | 6 - vendor/nikic/fast-route/src/DataGenerator.php | 25 - .../src/DataGenerator/CharCountBased.php | 28 - .../src/DataGenerator/GroupCountBased.php | 28 - .../src/DataGenerator/GroupPosBased.php | 25 - .../src/DataGenerator/MarkBased.php | 25 - .../src/DataGenerator/RegexBasedAbstract.php | 144 -- vendor/nikic/fast-route/src/Dispatcher.php | 25 - .../src/Dispatcher/CharCountBased.php | 28 - .../src/Dispatcher/GroupCountBased.php | 28 - .../src/Dispatcher/GroupPosBased.php | 30 - .../fast-route/src/Dispatcher/MarkBased.php | 28 - .../src/Dispatcher/RegexBasedAbstract.php | 80 -- vendor/nikic/fast-route/src/Route.php | 38 - .../nikic/fast-route/src/RouteCollector.php | 46 - vendor/nikic/fast-route/src/RouteParser.php | 36 - .../nikic/fast-route/src/RouteParser/Std.php | 81 -- vendor/nikic/fast-route/src/bootstrap.php | 12 - vendor/nikic/fast-route/src/functions.php | 70 - .../test/Dispatcher/CharCountBasedTest.php | 13 - .../test/Dispatcher/DispatcherTest.php | 561 -------- .../test/Dispatcher/GroupCountBasedTest.php | 13 - .../test/Dispatcher/GroupPosBasedTest.php | 13 - .../test/Dispatcher/MarkBasedTest.php | 20 - .../HackTypechecker/HackTypecheckerTest.php | 39 - .../HackTypechecker/fixtures/all_options.php | 29 - .../fixtures/empty_options.php | 11 - .../HackTypechecker/fixtures/no_options.php | 11 - .../fast-route/test/RouteParser/StdTest.php | 147 -- vendor/nikic/fast-route/test/bootstrap.php | 11 - vendor/pimple/pimple/.gitignore | 3 - vendor/pimple/pimple/.travis.yml | 32 - vendor/pimple/pimple/CHANGELOG | 35 - vendor/pimple/pimple/LICENSE | 19 - vendor/pimple/pimple/README.rst | 201 --- vendor/pimple/pimple/composer.json | 25 - vendor/pimple/pimple/ext/pimple/.gitignore | 30 - vendor/pimple/pimple/ext/pimple/README.md | 12 - vendor/pimple/pimple/ext/pimple/config.m4 | 63 - vendor/pimple/pimple/ext/pimple/config.w32 | 13 - vendor/pimple/pimple/ext/pimple/php_pimple.h | 121 -- vendor/pimple/pimple/ext/pimple/pimple.c | 922 ------------- .../pimple/pimple/ext/pimple/pimple_compat.h | 81 -- .../pimple/pimple/ext/pimple/tests/001.phpt | 45 - .../pimple/pimple/ext/pimple/tests/002.phpt | 15 - .../pimple/pimple/ext/pimple/tests/003.phpt | 16 - .../pimple/pimple/ext/pimple/tests/004.phpt | 30 - .../pimple/pimple/ext/pimple/tests/005.phpt | 27 - .../pimple/pimple/ext/pimple/tests/006.phpt | 51 - .../pimple/pimple/ext/pimple/tests/007.phpt | 22 - .../pimple/pimple/ext/pimple/tests/008.phpt | 29 - .../pimple/pimple/ext/pimple/tests/009.phpt | 13 - .../pimple/pimple/ext/pimple/tests/010.phpt | 45 - .../pimple/pimple/ext/pimple/tests/011.phpt | 19 - .../pimple/pimple/ext/pimple/tests/012.phpt | 28 - .../pimple/pimple/ext/pimple/tests/013.phpt | 33 - .../pimple/pimple/ext/pimple/tests/014.phpt | 30 - .../pimple/pimple/ext/pimple/tests/015.phpt | 17 - .../pimple/pimple/ext/pimple/tests/016.phpt | 24 - .../pimple/pimple/ext/pimple/tests/017.phpt | 17 - .../pimple/pimple/ext/pimple/tests/017_1.phpt | 17 - .../pimple/pimple/ext/pimple/tests/018.phpt | 23 - .../pimple/pimple/ext/pimple/tests/019.phpt | 18 - .../pimple/pimple/ext/pimple/tests/bench.phpb | 51 - .../pimple/ext/pimple/tests/bench_shared.phpb | 25 - vendor/pimple/pimple/phpunit.xml.dist | 14 - vendor/pimple/pimple/src/Pimple/Container.php | 282 ---- .../src/Pimple/ServiceProviderInterface.php | 46 - .../src/Pimple/Tests/Fixtures/Invokable.php | 38 - .../Pimple/Tests/Fixtures/NonInvokable.php | 34 - .../Tests/Fixtures/PimpleServiceProvider.php | 54 - .../src/Pimple/Tests/Fixtures/Service.php | 35 - .../PimpleServiceProviderInterfaceTest.php | 76 -- .../pimple/src/Pimple/Tests/PimpleTest.php | 440 ------ vendor/psr/http-message/CHANGELOG.md | 36 - vendor/psr/http-message/LICENSE | 19 - vendor/psr/http-message/README.md | 13 - vendor/psr/http-message/composer.json | 26 - .../psr/http-message/src/MessageInterface.php | 187 --- .../psr/http-message/src/RequestInterface.php | 129 -- .../http-message/src/ResponseInterface.php | 68 - .../src/ServerRequestInterface.php | 261 ---- .../psr/http-message/src/StreamInterface.php | 158 --- .../src/UploadedFileInterface.php | 123 -- vendor/psr/http-message/src/UriInterface.php | 323 ----- vendor/slim/slim/CONTRIBUTING.md | 20 - vendor/slim/slim/LICENSE.md | 19 - vendor/slim/slim/README.md | 84 -- vendor/slim/slim/Slim/App.php | 644 --------- vendor/slim/slim/Slim/CallableResolver.php | 90 -- .../slim/Slim/CallableResolverAwareTrait.php | 47 - vendor/slim/slim/Slim/Collection.php | 202 --- vendor/slim/slim/Slim/Container.php | 179 --- .../slim/Slim/DefaultServicesProvider.php | 203 --- vendor/slim/slim/Slim/DeferredCallable.php | 45 - .../Slim/Exception/ContainerException.php | 20 - .../ContainerValueNotFoundException.php | 20 - .../Exception/MethodNotAllowedException.php | 45 - .../slim/Slim/Exception/NotFoundException.php | 14 - .../slim/Slim/Exception/SlimException.php | 69 - .../slim/slim/Slim/Handlers/AbstractError.php | 99 -- .../slim/Slim/Handlers/AbstractHandler.php | 59 - vendor/slim/slim/Slim/Handlers/Error.php | 206 --- vendor/slim/slim/Slim/Handlers/NotAllowed.php | 147 -- vendor/slim/slim/Slim/Handlers/NotFound.php | 126 -- vendor/slim/slim/Slim/Handlers/PhpError.php | 205 --- .../Handlers/Strategies/RequestResponse.php | 43 - .../Strategies/RequestResponseArgs.php | 42 - vendor/slim/slim/Slim/Http/Body.php | 22 - vendor/slim/slim/Slim/Http/Cookies.php | 195 --- vendor/slim/slim/Slim/Http/Environment.php | 52 - vendor/slim/slim/Slim/Http/Headers.php | 222 ---- vendor/slim/slim/Slim/Http/Message.php | 304 ----- vendor/slim/slim/Slim/Http/Request.php | 1177 ----------------- vendor/slim/slim/Slim/Http/RequestBody.php | 27 - vendor/slim/slim/Slim/Http/Response.php | 470 ------- vendor/slim/slim/Slim/Http/Stream.php | 450 ------- vendor/slim/slim/Slim/Http/UploadedFile.php | 327 ----- vendor/slim/slim/Slim/Http/Uri.php | 824 ------------ .../Interfaces/CallableResolverInterface.php | 27 - .../Slim/Interfaces/CollectionInterface.php | 32 - .../Slim/Interfaces/Http/CookiesInterface.php | 23 - .../Interfaces/Http/EnvironmentInterface.php | 20 - .../Slim/Interfaces/Http/HeadersInterface.php | 24 - .../InvocationStrategyInterface.php | 35 - .../Slim/Interfaces/RouteGroupInterface.php | 46 - .../slim/Slim/Interfaces/RouteInterface.php | 129 -- .../slim/Slim/Interfaces/RouterInterface.php | 107 -- .../slim/slim/Slim/MiddlewareAwareTrait.php | 120 -- vendor/slim/slim/Slim/Routable.php | 106 -- vendor/slim/slim/Slim/Route.php | 357 ----- vendor/slim/slim/Slim/RouteGroup.php | 47 - vendor/slim/slim/Slim/Router.php | 434 ------ vendor/slim/slim/composer.json | 57 - vendor/slim/slim/example/.htaccess | 12 - vendor/slim/slim/example/README.md | 19 - vendor/slim/slim/example/index.php | 45 - 169 files changed, 2 insertions(+), 16633 deletions(-) delete mode 100644 vendor/autoload.php delete mode 100644 vendor/composer/ClassLoader.php delete mode 100644 vendor/composer/LICENSE delete mode 100644 vendor/composer/autoload_classmap.php delete mode 100644 vendor/composer/autoload_files.php delete mode 100644 vendor/composer/autoload_namespaces.php delete mode 100644 vendor/composer/autoload_psr4.php delete mode 100644 vendor/composer/autoload_real.php delete mode 100644 vendor/composer/autoload_static.php delete mode 100644 vendor/composer/installed.json delete mode 100644 vendor/container-interop/container-interop/.gitignore delete mode 100644 vendor/container-interop/container-interop/LICENSE delete mode 100644 vendor/container-interop/container-interop/README.md delete mode 100644 vendor/container-interop/container-interop/composer.json delete mode 100644 vendor/container-interop/container-interop/docs/ContainerInterface-meta.md delete mode 100644 vendor/container-interop/container-interop/docs/ContainerInterface.md delete mode 100644 vendor/container-interop/container-interop/docs/Delegate-lookup-meta.md delete mode 100644 vendor/container-interop/container-interop/docs/Delegate-lookup.md delete mode 100644 vendor/container-interop/container-interop/docs/images/interoperating_containers.png delete mode 100644 vendor/container-interop/container-interop/docs/images/priority.png delete mode 100644 vendor/container-interop/container-interop/docs/images/side_by_side_containers.png delete mode 100644 vendor/container-interop/container-interop/src/Interop/Container/ContainerInterface.php delete mode 100644 vendor/container-interop/container-interop/src/Interop/Container/Exception/ContainerException.php delete mode 100644 vendor/container-interop/container-interop/src/Interop/Container/Exception/NotFoundException.php delete mode 100644 vendor/nikic/fast-route/.hhconfig delete mode 100644 vendor/nikic/fast-route/.travis.yml delete mode 100644 vendor/nikic/fast-route/FastRoute.hhi delete mode 100644 vendor/nikic/fast-route/LICENSE delete mode 100644 vendor/nikic/fast-route/README.md delete mode 100644 vendor/nikic/fast-route/composer.json delete mode 100644 vendor/nikic/fast-route/phpunit.xml delete mode 100644 vendor/nikic/fast-route/src/BadRouteException.php delete mode 100644 vendor/nikic/fast-route/src/DataGenerator.php delete mode 100644 vendor/nikic/fast-route/src/DataGenerator/CharCountBased.php delete mode 100644 vendor/nikic/fast-route/src/DataGenerator/GroupCountBased.php delete mode 100644 vendor/nikic/fast-route/src/DataGenerator/GroupPosBased.php delete mode 100644 vendor/nikic/fast-route/src/DataGenerator/MarkBased.php delete mode 100644 vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php delete mode 100644 vendor/nikic/fast-route/src/Dispatcher.php delete mode 100644 vendor/nikic/fast-route/src/Dispatcher/CharCountBased.php delete mode 100644 vendor/nikic/fast-route/src/Dispatcher/GroupCountBased.php delete mode 100644 vendor/nikic/fast-route/src/Dispatcher/GroupPosBased.php delete mode 100644 vendor/nikic/fast-route/src/Dispatcher/MarkBased.php delete mode 100644 vendor/nikic/fast-route/src/Dispatcher/RegexBasedAbstract.php delete mode 100644 vendor/nikic/fast-route/src/Route.php delete mode 100644 vendor/nikic/fast-route/src/RouteCollector.php delete mode 100644 vendor/nikic/fast-route/src/RouteParser.php delete mode 100644 vendor/nikic/fast-route/src/RouteParser/Std.php delete mode 100644 vendor/nikic/fast-route/src/bootstrap.php delete mode 100644 vendor/nikic/fast-route/src/functions.php delete mode 100644 vendor/nikic/fast-route/test/Dispatcher/CharCountBasedTest.php delete mode 100644 vendor/nikic/fast-route/test/Dispatcher/DispatcherTest.php delete mode 100644 vendor/nikic/fast-route/test/Dispatcher/GroupCountBasedTest.php delete mode 100644 vendor/nikic/fast-route/test/Dispatcher/GroupPosBasedTest.php delete mode 100644 vendor/nikic/fast-route/test/Dispatcher/MarkBasedTest.php delete mode 100644 vendor/nikic/fast-route/test/HackTypechecker/HackTypecheckerTest.php delete mode 100644 vendor/nikic/fast-route/test/HackTypechecker/fixtures/all_options.php delete mode 100644 vendor/nikic/fast-route/test/HackTypechecker/fixtures/empty_options.php delete mode 100644 vendor/nikic/fast-route/test/HackTypechecker/fixtures/no_options.php delete mode 100644 vendor/nikic/fast-route/test/RouteParser/StdTest.php delete mode 100644 vendor/nikic/fast-route/test/bootstrap.php delete mode 100644 vendor/pimple/pimple/.gitignore delete mode 100644 vendor/pimple/pimple/.travis.yml delete mode 100644 vendor/pimple/pimple/CHANGELOG delete mode 100644 vendor/pimple/pimple/LICENSE delete mode 100644 vendor/pimple/pimple/README.rst delete mode 100644 vendor/pimple/pimple/composer.json delete mode 100644 vendor/pimple/pimple/ext/pimple/.gitignore delete mode 100644 vendor/pimple/pimple/ext/pimple/README.md delete mode 100644 vendor/pimple/pimple/ext/pimple/config.m4 delete mode 100644 vendor/pimple/pimple/ext/pimple/config.w32 delete mode 100644 vendor/pimple/pimple/ext/pimple/php_pimple.h delete mode 100644 vendor/pimple/pimple/ext/pimple/pimple.c delete mode 100644 vendor/pimple/pimple/ext/pimple/pimple_compat.h delete mode 100644 vendor/pimple/pimple/ext/pimple/tests/001.phpt delete mode 100644 vendor/pimple/pimple/ext/pimple/tests/002.phpt delete mode 100644 vendor/pimple/pimple/ext/pimple/tests/003.phpt delete mode 100644 vendor/pimple/pimple/ext/pimple/tests/004.phpt delete mode 100644 vendor/pimple/pimple/ext/pimple/tests/005.phpt delete mode 100644 vendor/pimple/pimple/ext/pimple/tests/006.phpt delete mode 100644 vendor/pimple/pimple/ext/pimple/tests/007.phpt delete mode 100644 vendor/pimple/pimple/ext/pimple/tests/008.phpt delete mode 100644 vendor/pimple/pimple/ext/pimple/tests/009.phpt delete mode 100644 vendor/pimple/pimple/ext/pimple/tests/010.phpt delete mode 100644 vendor/pimple/pimple/ext/pimple/tests/011.phpt delete mode 100644 vendor/pimple/pimple/ext/pimple/tests/012.phpt delete mode 100644 vendor/pimple/pimple/ext/pimple/tests/013.phpt delete mode 100644 vendor/pimple/pimple/ext/pimple/tests/014.phpt delete mode 100644 vendor/pimple/pimple/ext/pimple/tests/015.phpt delete mode 100644 vendor/pimple/pimple/ext/pimple/tests/016.phpt delete mode 100644 vendor/pimple/pimple/ext/pimple/tests/017.phpt delete mode 100644 vendor/pimple/pimple/ext/pimple/tests/017_1.phpt delete mode 100644 vendor/pimple/pimple/ext/pimple/tests/018.phpt delete mode 100644 vendor/pimple/pimple/ext/pimple/tests/019.phpt delete mode 100644 vendor/pimple/pimple/ext/pimple/tests/bench.phpb delete mode 100644 vendor/pimple/pimple/ext/pimple/tests/bench_shared.phpb delete mode 100644 vendor/pimple/pimple/phpunit.xml.dist delete mode 100644 vendor/pimple/pimple/src/Pimple/Container.php delete mode 100644 vendor/pimple/pimple/src/Pimple/ServiceProviderInterface.php delete mode 100644 vendor/pimple/pimple/src/Pimple/Tests/Fixtures/Invokable.php delete mode 100644 vendor/pimple/pimple/src/Pimple/Tests/Fixtures/NonInvokable.php delete mode 100644 vendor/pimple/pimple/src/Pimple/Tests/Fixtures/PimpleServiceProvider.php delete mode 100644 vendor/pimple/pimple/src/Pimple/Tests/Fixtures/Service.php delete mode 100644 vendor/pimple/pimple/src/Pimple/Tests/PimpleServiceProviderInterfaceTest.php delete mode 100644 vendor/pimple/pimple/src/Pimple/Tests/PimpleTest.php delete mode 100644 vendor/psr/http-message/CHANGELOG.md delete mode 100644 vendor/psr/http-message/LICENSE delete mode 100644 vendor/psr/http-message/README.md delete mode 100644 vendor/psr/http-message/composer.json delete mode 100644 vendor/psr/http-message/src/MessageInterface.php delete mode 100644 vendor/psr/http-message/src/RequestInterface.php delete mode 100644 vendor/psr/http-message/src/ResponseInterface.php delete mode 100644 vendor/psr/http-message/src/ServerRequestInterface.php delete mode 100644 vendor/psr/http-message/src/StreamInterface.php delete mode 100644 vendor/psr/http-message/src/UploadedFileInterface.php delete mode 100644 vendor/psr/http-message/src/UriInterface.php delete mode 100644 vendor/slim/slim/CONTRIBUTING.md delete mode 100644 vendor/slim/slim/LICENSE.md delete mode 100644 vendor/slim/slim/README.md delete mode 100644 vendor/slim/slim/Slim/App.php delete mode 100644 vendor/slim/slim/Slim/CallableResolver.php delete mode 100644 vendor/slim/slim/Slim/CallableResolverAwareTrait.php delete mode 100644 vendor/slim/slim/Slim/Collection.php delete mode 100644 vendor/slim/slim/Slim/Container.php delete mode 100644 vendor/slim/slim/Slim/DefaultServicesProvider.php delete mode 100644 vendor/slim/slim/Slim/DeferredCallable.php delete mode 100644 vendor/slim/slim/Slim/Exception/ContainerException.php delete mode 100644 vendor/slim/slim/Slim/Exception/ContainerValueNotFoundException.php delete mode 100644 vendor/slim/slim/Slim/Exception/MethodNotAllowedException.php delete mode 100644 vendor/slim/slim/Slim/Exception/NotFoundException.php delete mode 100644 vendor/slim/slim/Slim/Exception/SlimException.php delete mode 100644 vendor/slim/slim/Slim/Handlers/AbstractError.php delete mode 100644 vendor/slim/slim/Slim/Handlers/AbstractHandler.php delete mode 100644 vendor/slim/slim/Slim/Handlers/Error.php delete mode 100644 vendor/slim/slim/Slim/Handlers/NotAllowed.php delete mode 100644 vendor/slim/slim/Slim/Handlers/NotFound.php delete mode 100644 vendor/slim/slim/Slim/Handlers/PhpError.php delete mode 100644 vendor/slim/slim/Slim/Handlers/Strategies/RequestResponse.php delete mode 100644 vendor/slim/slim/Slim/Handlers/Strategies/RequestResponseArgs.php delete mode 100644 vendor/slim/slim/Slim/Http/Body.php delete mode 100644 vendor/slim/slim/Slim/Http/Cookies.php delete mode 100644 vendor/slim/slim/Slim/Http/Environment.php delete mode 100644 vendor/slim/slim/Slim/Http/Headers.php delete mode 100644 vendor/slim/slim/Slim/Http/Message.php delete mode 100644 vendor/slim/slim/Slim/Http/Request.php delete mode 100644 vendor/slim/slim/Slim/Http/RequestBody.php delete mode 100644 vendor/slim/slim/Slim/Http/Response.php delete mode 100644 vendor/slim/slim/Slim/Http/Stream.php delete mode 100644 vendor/slim/slim/Slim/Http/UploadedFile.php delete mode 100644 vendor/slim/slim/Slim/Http/Uri.php delete mode 100644 vendor/slim/slim/Slim/Interfaces/CallableResolverInterface.php delete mode 100644 vendor/slim/slim/Slim/Interfaces/CollectionInterface.php delete mode 100644 vendor/slim/slim/Slim/Interfaces/Http/CookiesInterface.php delete mode 100644 vendor/slim/slim/Slim/Interfaces/Http/EnvironmentInterface.php delete mode 100644 vendor/slim/slim/Slim/Interfaces/Http/HeadersInterface.php delete mode 100644 vendor/slim/slim/Slim/Interfaces/InvocationStrategyInterface.php delete mode 100644 vendor/slim/slim/Slim/Interfaces/RouteGroupInterface.php delete mode 100644 vendor/slim/slim/Slim/Interfaces/RouteInterface.php delete mode 100644 vendor/slim/slim/Slim/Interfaces/RouterInterface.php delete mode 100644 vendor/slim/slim/Slim/MiddlewareAwareTrait.php delete mode 100644 vendor/slim/slim/Slim/Routable.php delete mode 100644 vendor/slim/slim/Slim/Route.php delete mode 100644 vendor/slim/slim/Slim/RouteGroup.php delete mode 100644 vendor/slim/slim/Slim/Router.php delete mode 100644 vendor/slim/slim/composer.json delete mode 100644 vendor/slim/slim/example/.htaccess delete mode 100644 vendor/slim/slim/example/README.md delete mode 100644 vendor/slim/slim/example/index.php diff --git a/.gitignore b/.gitignore index 96f50df..2eff344 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,5 @@ bower_components/ tmp .DS_Store .idea -.sass-cache \ No newline at end of file +.sass-cache +/vendor/ \ No newline at end of file diff --git a/vendor/autoload.php b/vendor/autoload.php deleted file mode 100644 index 3c454e2..0000000 --- a/vendor/autoload.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php - -// autoload.php @generated by Composer - -require_once __DIR__ . '/composer' . '/autoload_real.php'; - -return ComposerAutoloaderInitd54f12fb5bd1b34598360c61119b8df4::getLoader(); diff --git a/vendor/composer/ClassLoader.php b/vendor/composer/ClassLoader.php deleted file mode 100644 index ac67d30..0000000 --- a/vendor/composer/ClassLoader.php +++ /dev/null @@ -1,415 +0,0 @@ -<?php - -/* - * This file is part of Composer. - * - * (c) Nils Adermann <naderman@naderman.de> - * Jordi Boggiano <j.boggiano@seld.be> - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Composer\Autoload; - -/** - * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. - * - * $loader = new \Composer\Autoload\ClassLoader(); - * - * // register classes with namespaces - * $loader->add('Symfony\Component', __DIR__.'/component'); - * $loader->add('Symfony', __DIR__.'/framework'); - * - * // activate the autoloader - * $loader->register(); - * - * // to enable searching the include path (eg. for PEAR packages) - * $loader->setUseIncludePath(true); - * - * In this example, if you try to use a class in the Symfony\Component - * namespace or one of its children (Symfony\Component\Console for instance), - * the autoloader will first look for the class under the component/ - * directory, and it will then fallback to the framework/ directory if not - * found before giving up. - * - * This class is loosely based on the Symfony UniversalClassLoader. - * - * @author Fabien Potencier <fabien@symfony.com> - * @author Jordi Boggiano <j.boggiano@seld.be> - * @see http://www.php-fig.org/psr/psr-0/ - * @see http://www.php-fig.org/psr/psr-4/ - */ -class ClassLoader -{ - // PSR-4 - private $prefixLengthsPsr4 = array(); - private $prefixDirsPsr4 = array(); - private $fallbackDirsPsr4 = array(); - - // PSR-0 - private $prefixesPsr0 = array(); - private $fallbackDirsPsr0 = array(); - - private $useIncludePath = false; - private $classMap = array(); - private $classMapAuthoritative = false; - private $missingClasses = array(); - - public function getPrefixes() - { - if (!empty($this->prefixesPsr0)) { - return call_user_func_array('array_merge', $this->prefixesPsr0); - } - - return array(); - } - - public function getPrefixesPsr4() - { - return $this->prefixDirsPsr4; - } - - public function getFallbackDirs() - { - return $this->fallbackDirsPsr0; - } - - public function getFallbackDirsPsr4() - { - return $this->fallbackDirsPsr4; - } - - public function getClassMap() - { - return $this->classMap; - } - - /** - * @param array $classMap Class to filename map - */ - public function addClassMap(array $classMap) - { - if ($this->classMap) { - $this->classMap = array_merge($this->classMap, $classMap); - } else { - $this->classMap = $classMap; - } - } - - /** - * Registers a set of PSR-0 directories for a given prefix, either - * appending or prepending to the ones previously set for this prefix. - * - * @param string $prefix The prefix - * @param array|string $paths The PSR-0 root directories - * @param bool $prepend Whether to prepend the directories - */ - public function add($prefix, $paths, $prepend = false) - { - if (!$prefix) { - if ($prepend) { - $this->fallbackDirsPsr0 = array_merge( - (array) $paths, - $this->fallbackDirsPsr0 - ); - } else { - $this->fallbackDirsPsr0 = array_merge( - $this->fallbackDirsPsr0, - (array) $paths - ); - } - - return; - } - - $first = $prefix[0]; - if (!isset($this->prefixesPsr0[$first][$prefix])) { - $this->prefixesPsr0[$first][$prefix] = (array) $paths; - - return; - } - if ($prepend) { - $this->prefixesPsr0[$first][$prefix] = array_merge( - (array) $paths, - $this->prefixesPsr0[$first][$prefix] - ); - } else { - $this->prefixesPsr0[$first][$prefix] = array_merge( - $this->prefixesPsr0[$first][$prefix], - (array) $paths - ); - } - } - - /** - * Registers a set of PSR-4 directories for a given namespace, either - * appending or prepending to the ones previously set for this namespace. - * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param array|string $paths The PSR-4 base directories - * @param bool $prepend Whether to prepend the directories - * - * @throws \InvalidArgumentException - */ - public function addPsr4($prefix, $paths, $prepend = false) - { - if (!$prefix) { - // Register directories for the root namespace. - if ($prepend) { - $this->fallbackDirsPsr4 = array_merge( - (array) $paths, - $this->fallbackDirsPsr4 - ); - } else { - $this->fallbackDirsPsr4 = array_merge( - $this->fallbackDirsPsr4, - (array) $paths - ); - } - } elseif (!isset($this->prefixDirsPsr4[$prefix])) { - // Register directories for a new namespace. - $length = strlen($prefix); - if ('\\' !== $prefix[$length - 1]) { - throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); - } - $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; - $this->prefixDirsPsr4[$prefix] = (array) $paths; - } elseif ($prepend) { - // Prepend directories for an already registered namespace. - $this->prefixDirsPsr4[$prefix] = array_merge( - (array) $paths, - $this->prefixDirsPsr4[$prefix] - ); - } else { - // Append directories for an already registered namespace. - $this->prefixDirsPsr4[$prefix] = array_merge( - $this->prefixDirsPsr4[$prefix], - (array) $paths - ); - } - } - - /** - * Registers a set of PSR-0 directories for a given prefix, - * replacing any others previously set for this prefix. - * - * @param string $prefix The prefix - * @param array|string $paths The PSR-0 base directories - */ - public function set($prefix, $paths) - { - if (!$prefix) { - $this->fallbackDirsPsr0 = (array) $paths; - } else { - $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; - } - } - - /** - * Registers a set of PSR-4 directories for a given namespace, - * replacing any others previously set for this namespace. - * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param array|string $paths The PSR-4 base directories - * - * @throws \InvalidArgumentException - */ - public function setPsr4($prefix, $paths) - { - if (!$prefix) { - $this->fallbackDirsPsr4 = (array) $paths; - } else { - $length = strlen($prefix); - if ('\\' !== $prefix[$length - 1]) { - throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); - } - $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; - $this->prefixDirsPsr4[$prefix] = (array) $paths; - } - } - - /** - * Turns on searching the include path for class files. - * - * @param bool $useIncludePath - */ - public function setUseIncludePath($useIncludePath) - { - $this->useIncludePath = $useIncludePath; - } - - /** - * Can be used to check if the autoloader uses the include path to check - * for classes. - * - * @return bool - */ - public function getUseIncludePath() - { - return $this->useIncludePath; - } - - /** - * Turns off searching the prefix and fallback directories for classes - * that have not been registered with the class map. - * - * @param bool $classMapAuthoritative - */ - public function setClassMapAuthoritative($classMapAuthoritative) - { - $this->classMapAuthoritative = $classMapAuthoritative; - } - - /** - * Should class lookup fail if not found in the current class map? - * - * @return bool - */ - public function isClassMapAuthoritative() - { - return $this->classMapAuthoritative; - } - - /** - * Registers this instance as an autoloader. - * - * @param bool $prepend Whether to prepend the autoloader or not - */ - public function register($prepend = false) - { - spl_autoload_register(array($this, 'loadClass'), true, $prepend); - } - - /** - * Unregisters this instance as an autoloader. - */ - public function unregister() - { - spl_autoload_unregister(array($this, 'loadClass')); - } - - /** - * Loads the given class or interface. - * - * @param string $class The name of the class - * @return bool|null True if loaded, null otherwise - */ - public function loadClass($class) - { - if ($file = $this->findFile($class)) { - includeFile($file); - - return true; - } - } - - /** - * Finds the path to the file where the class is defined. - * - * @param string $class The name of the class - * - * @return string|false The path if found, false otherwise - */ - public function findFile($class) - { - // work around for PHP 5.3.0 - 5.3.2 https://bugs.php.net/50731 - if ('\\' == $class[0]) { - $class = substr($class, 1); - } - - // class map lookup - if (isset($this->classMap[$class])) { - return $this->classMap[$class]; - } - if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { - return false; - } - - $file = $this->findFileWithExtension($class, '.php'); - - // Search for Hack files if we are running on HHVM - if (false === $file && defined('HHVM_VERSION')) { - $file = $this->findFileWithExtension($class, '.hh'); - } - - if (false === $file) { - // Remember that this class does not exist. - $this->missingClasses[$class] = true; - } - - return $file; - } - - private function findFileWithExtension($class, $ext) - { - // PSR-4 lookup - $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; - - $first = $class[0]; - if (isset($this->prefixLengthsPsr4[$first])) { - foreach ($this->prefixLengthsPsr4[$first] as $prefix => $length) { - if (0 === strpos($class, $prefix)) { - foreach ($this->prefixDirsPsr4[$prefix] as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) { - return $file; - } - } - } - } - } - - // PSR-4 fallback dirs - foreach ($this->fallbackDirsPsr4 as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { - return $file; - } - } - - // PSR-0 lookup - if (false !== $pos = strrpos($class, '\\')) { - // namespaced class name - $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) - . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); - } else { - // PEAR-like class name - $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; - } - - if (isset($this->prefixesPsr0[$first])) { - foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { - if (0 === strpos($class, $prefix)) { - foreach ($dirs as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { - return $file; - } - } - } - } - } - - // PSR-0 fallback dirs - foreach ($this->fallbackDirsPsr0 as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { - return $file; - } - } - - // PSR-0 include paths. - if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { - return $file; - } - - return false; - } -} - -/** - * Scope isolated include. - * - * Prevents access to $this/self from included files. - */ -function includeFile($file) -{ - include $file; -} diff --git a/vendor/composer/LICENSE b/vendor/composer/LICENSE deleted file mode 100644 index 1a28124..0000000 --- a/vendor/composer/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ - -Copyright (c) 2016 Nils Adermann, Jordi Boggiano - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php deleted file mode 100644 index 7a91153..0000000 --- a/vendor/composer/autoload_classmap.php +++ /dev/null @@ -1,9 +0,0 @@ -<?php - -// autoload_classmap.php @generated by Composer - -$vendorDir = dirname(dirname(__FILE__)); -$baseDir = dirname($vendorDir); - -return array( -); diff --git a/vendor/composer/autoload_files.php b/vendor/composer/autoload_files.php deleted file mode 100644 index 4202030..0000000 --- a/vendor/composer/autoload_files.php +++ /dev/null @@ -1,10 +0,0 @@ -<?php - -// autoload_files.php @generated by Composer - -$vendorDir = dirname(dirname(__FILE__)); -$baseDir = dirname($vendorDir); - -return array( - '253c157292f75eb38082b5acb06f3f01' => $vendorDir . '/nikic/fast-route/src/functions.php', -); diff --git a/vendor/composer/autoload_namespaces.php b/vendor/composer/autoload_namespaces.php deleted file mode 100644 index c3cd022..0000000 --- a/vendor/composer/autoload_namespaces.php +++ /dev/null @@ -1,10 +0,0 @@ -<?php - -// autoload_namespaces.php @generated by Composer - -$vendorDir = dirname(dirname(__FILE__)); -$baseDir = dirname($vendorDir); - -return array( - 'Pimple' => array($vendorDir . '/pimple/pimple/src'), -); diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php deleted file mode 100644 index 7e403d2..0000000 --- a/vendor/composer/autoload_psr4.php +++ /dev/null @@ -1,13 +0,0 @@ -<?php - -// autoload_psr4.php @generated by Composer - -$vendorDir = dirname(dirname(__FILE__)); -$baseDir = dirname($vendorDir); - -return array( - 'Slim\\' => array($vendorDir . '/slim/slim/Slim'), - 'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src'), - 'Interop\\Container\\' => array($vendorDir . '/container-interop/container-interop/src/Interop/Container'), - 'FastRoute\\' => array($vendorDir . '/nikic/fast-route/src'), -); diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php deleted file mode 100644 index 69a339d..0000000 --- a/vendor/composer/autoload_real.php +++ /dev/null @@ -1,70 +0,0 @@ -<?php - -// autoload_real.php @generated by Composer - -class ComposerAutoloaderInitd54f12fb5bd1b34598360c61119b8df4 -{ - private static $loader; - - public static function loadClassLoader($class) - { - if ('Composer\Autoload\ClassLoader' === $class) { - require __DIR__ . '/ClassLoader.php'; - } - } - - public static function getLoader() - { - if (null !== self::$loader) { - return self::$loader; - } - - spl_autoload_register(array('ComposerAutoloaderInitd54f12fb5bd1b34598360c61119b8df4', 'loadClassLoader'), true, true); - self::$loader = $loader = new \Composer\Autoload\ClassLoader(); - spl_autoload_unregister(array('ComposerAutoloaderInitd54f12fb5bd1b34598360c61119b8df4', 'loadClassLoader')); - - $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION'); - if ($useStaticLoader) { - require_once __DIR__ . '/autoload_static.php'; - - call_user_func(\Composer\Autoload\ComposerStaticInitd54f12fb5bd1b34598360c61119b8df4::getInitializer($loader)); - } else { - $map = require __DIR__ . '/autoload_namespaces.php'; - foreach ($map as $namespace => $path) { - $loader->set($namespace, $path); - } - - $map = require __DIR__ . '/autoload_psr4.php'; - foreach ($map as $namespace => $path) { - $loader->setPsr4($namespace, $path); - } - - $classMap = require __DIR__ . '/autoload_classmap.php'; - if ($classMap) { - $loader->addClassMap($classMap); - } - } - - $loader->register(true); - - if ($useStaticLoader) { - $includeFiles = Composer\Autoload\ComposerStaticInitd54f12fb5bd1b34598360c61119b8df4::$files; - } else { - $includeFiles = require __DIR__ . '/autoload_files.php'; - } - foreach ($includeFiles as $fileIdentifier => $file) { - composerRequired54f12fb5bd1b34598360c61119b8df4($fileIdentifier, $file); - } - - return $loader; - } -} - -function composerRequired54f12fb5bd1b34598360c61119b8df4($fileIdentifier, $file) -{ - if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { - require $file; - - $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; - } -} diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php deleted file mode 100644 index 652e446..0000000 --- a/vendor/composer/autoload_static.php +++ /dev/null @@ -1,70 +0,0 @@ -<?php - -// autoload_static.php @generated by Composer - -namespace Composer\Autoload; - -class ComposerStaticInitd54f12fb5bd1b34598360c61119b8df4 -{ - public static $files = array ( - '253c157292f75eb38082b5acb06f3f01' => __DIR__ . '/..' . '/nikic/fast-route/src/functions.php', - ); - - public static $prefixLengthsPsr4 = array ( - 'S' => - array ( - 'Slim\\' => 5, - ), - 'P' => - array ( - 'Psr\\Http\\Message\\' => 17, - ), - 'I' => - array ( - 'Interop\\Container\\' => 18, - ), - 'F' => - array ( - 'FastRoute\\' => 10, - ), - ); - - public static $prefixDirsPsr4 = array ( - 'Slim\\' => - array ( - 0 => __DIR__ . '/..' . '/slim/slim/Slim', - ), - 'Psr\\Http\\Message\\' => - array ( - 0 => __DIR__ . '/..' . '/psr/http-message/src', - ), - 'Interop\\Container\\' => - array ( - 0 => __DIR__ . '/..' . '/container-interop/container-interop/src/Interop/Container', - ), - 'FastRoute\\' => - array ( - 0 => __DIR__ . '/..' . '/nikic/fast-route/src', - ), - ); - - public static $prefixesPsr0 = array ( - 'P' => - array ( - 'Pimple' => - array ( - 0 => __DIR__ . '/..' . '/pimple/pimple/src', - ), - ), - ); - - public static function getInitializer(ClassLoader $loader) - { - return \Closure::bind(function () use ($loader) { - $loader->prefixLengthsPsr4 = ComposerStaticInitd54f12fb5bd1b34598360c61119b8df4::$prefixLengthsPsr4; - $loader->prefixDirsPsr4 = ComposerStaticInitd54f12fb5bd1b34598360c61119b8df4::$prefixDirsPsr4; - $loader->prefixesPsr0 = ComposerStaticInitd54f12fb5bd1b34598360c61119b8df4::$prefixesPsr0; - - }, null, ClassLoader::class); - } -} diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json deleted file mode 100644 index ff9b198..0000000 --- a/vendor/composer/installed.json +++ /dev/null @@ -1,248 +0,0 @@ -[ - { - "name": "container-interop/container-interop", - "version": "1.1.0", - "version_normalized": "1.1.0.0", - "source": { - "type": "git", - "url": "https://github.com/container-interop/container-interop.git", - "reference": "fc08354828f8fd3245f77a66b9e23a6bca48297e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/container-interop/container-interop/zipball/fc08354828f8fd3245f77a66b9e23a6bca48297e", - "reference": "fc08354828f8fd3245f77a66b9e23a6bca48297e", - "shasum": "" - }, - "time": "2014-12-30 15:22:37", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "Interop\\Container\\": "src/Interop/Container/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Promoting the interoperability of container objects (DIC, SL, etc.)" - }, - { - "name": "nikic/fast-route", - "version": "v1.0.1", - "version_normalized": "1.0.1.0", - "source": { - "type": "git", - "url": "https://github.com/nikic/FastRoute.git", - "reference": "8ea928195fa9b907f0d6e48312d323c1a13cc2af" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nikic/FastRoute/zipball/8ea928195fa9b907f0d6e48312d323c1a13cc2af", - "reference": "8ea928195fa9b907f0d6e48312d323c1a13cc2af", - "shasum": "" - }, - "require": { - "php": ">=5.4.0" - }, - "time": "2016-06-12 19:08:51", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "FastRoute\\": "src/" - }, - "files": [ - "src/functions.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Nikita Popov", - "email": "nikic@php.net" - } - ], - "description": "Fast request router for PHP", - "keywords": [ - "router", - "routing" - ] - }, - { - "name": "psr/http-message", - "version": "1.0.1", - "version_normalized": "1.0.1.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "time": "2016-08-06 14:39:51", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP messages", - "homepage": "https://github.com/php-fig/http-message", - "keywords": [ - "http", - "http-message", - "psr", - "psr-7", - "request", - "response" - ] - }, - { - "name": "pimple/pimple", - "version": "v3.0.2", - "version_normalized": "3.0.2.0", - "source": { - "type": "git", - "url": "https://github.com/silexphp/Pimple.git", - "reference": "a30f7d6e57565a2e1a316e1baf2a483f788b258a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/silexphp/Pimple/zipball/a30f7d6e57565a2e1a316e1baf2a483f788b258a", - "reference": "a30f7d6e57565a2e1a316e1baf2a483f788b258a", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "time": "2015-09-11 15:10:35", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-0": { - "Pimple": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - } - ], - "description": "Pimple, a simple Dependency Injection Container", - "homepage": "http://pimple.sensiolabs.org", - "keywords": [ - "container", - "dependency injection" - ] - }, - { - "name": "slim/slim", - "version": "3.5.0", - "version_normalized": "3.5.0.0", - "source": { - "type": "git", - "url": "https://github.com/slimphp/Slim.git", - "reference": "184352bc1913d7ba552ab4131d62f4730ddb0893" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/slimphp/Slim/zipball/184352bc1913d7ba552ab4131d62f4730ddb0893", - "reference": "184352bc1913d7ba552ab4131d62f4730ddb0893", - "shasum": "" - }, - "require": { - "container-interop/container-interop": "^1.1", - "nikic/fast-route": "^1.0", - "php": ">=5.5.0", - "pimple/pimple": "^3.0", - "psr/http-message": "^1.0" - }, - "provide": { - "psr/http-message-implementation": "1.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.0", - "squizlabs/php_codesniffer": "^2.5" - }, - "time": "2016-07-26 15:12:13", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "Slim\\": "Slim" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Rob Allen", - "email": "rob@akrabat.com", - "homepage": "http://akrabat.com" - }, - { - "name": "Josh Lockhart", - "email": "hello@joshlockhart.com", - "homepage": "https://joshlockhart.com" - }, - { - "name": "Gabriel Manricks", - "email": "gmanricks@me.com", - "homepage": "http://gabrielmanricks.com" - }, - { - "name": "Andrew Smith", - "email": "a.smith@silentworks.co.uk", - "homepage": "http://silentworks.co.uk" - } - ], - "description": "Slim is a PHP micro framework that helps you quickly write simple yet powerful web applications and APIs", - "homepage": "http://slimframework.com", - "keywords": [ - "api", - "framework", - "micro", - "router" - ] - } -] diff --git a/vendor/container-interop/container-interop/.gitignore b/vendor/container-interop/container-interop/.gitignore deleted file mode 100644 index b2395aa..0000000 --- a/vendor/container-interop/container-interop/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -composer.lock -composer.phar -/vendor/ diff --git a/vendor/container-interop/container-interop/LICENSE b/vendor/container-interop/container-interop/LICENSE deleted file mode 100644 index 7671d90..0000000 --- a/vendor/container-interop/container-interop/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2013 container-interop - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/container-interop/container-interop/README.md b/vendor/container-interop/container-interop/README.md deleted file mode 100644 index ec434d0..0000000 --- a/vendor/container-interop/container-interop/README.md +++ /dev/null @@ -1,85 +0,0 @@ -# Container Interoperability - -[](https://packagist.org/packages/container-interop/container-interop) - -*container-interop* tries to identify and standardize features in *container* objects (service locators, -dependency injection containers, etc.) to achieve interopererability. - -Through discussions and trials, we try to create a standard, made of common interfaces but also recommendations. - -If PHP projects that provide container implementations begin to adopt these common standards, then PHP -applications and projects that use containers can depend on the common interfaces instead of specific -implementations. This facilitates a high-level of interoperability and flexibility that allows users to consume -*any* container implementation that can be adapted to these interfaces. - -The work done in this project is not officially endorsed by the [PHP-FIG](http://www.php-fig.org/), but it is being -worked on by members of PHP-FIG and other good developers. We adhere to the spirit and ideals of PHP-FIG, and hope -this project will pave the way for one or more future PSRs. - - -## Installation - -You can install this package through Composer: - -```json -{ - "require": { - "container-interop/container-interop": "~1.0" - } -} -``` - -The packages adheres to the [SemVer](http://semver.org/) specification, and there will be full backward compatibility -between minor versions. - -## Standards - -### Available - -- [`ContainerInterface`](src/Interop/Container/ContainerInterface.php). -[Description](docs/ContainerInterface.md) [Meta Document](docs/ContainerInterface-meta.md). -Describes the interface of a container that exposes methods to read its entries. -- [*Delegate lookup feature*](docs/Delegate-lookup.md). -[Meta Document](docs/Delegate-lookup-meta.md). -Describes the ability for a container to delegate the lookup of its dependencies to a third-party container. This -feature lets several containers work together in a single application. - -### Proposed - -View open [request for comments](https://github.com/container-interop/container-interop/labels/RFC) - -## Compatible projects - -### Projects implementing `ContainerInterface` - -- [Acclimate](https://github.com/jeremeamia/acclimate-container) -- [dcp-di](https://github.com/estelsmith/dcp-di) -- [Mouf](http://mouf-php.com) -- [Njasm Container](https://github.com/njasm/container) -- [PHP-DI](http://php-di.org) -- [PimpleInterop](https://github.com/moufmouf/pimple-interop) -- [XStatic](https://github.com/jeremeamia/xstatic) - -### Projects implementing the *delegate lookup* feature - -- [Mouf](http://mouf-php.com) -- [PHP-DI](http://php-di.org) -- [PimpleInterop](https://github.com/moufmouf/pimple-interop) - -## Workflow - -Everyone is welcome to join and contribute. - -The general workflow looks like this: - -1. Someone opens a discussion (GitHub issue) to suggest an interface -1. Feedback is gathered -1. The interface is added to a development branch -1. We release alpha versions so that the interface can be experimented with -1. Discussions and edits ensue until the interface is deemed stable by a general consensus -1. A new minor version of the package is released - -We try to not break BC by creating new interfaces instead of editing existing ones. - -While we currently work on interfaces, we are open to anything that might help towards interoperability, may that -be code, best practices, etc. diff --git a/vendor/container-interop/container-interop/composer.json b/vendor/container-interop/container-interop/composer.json deleted file mode 100644 index 84f3875..0000000 --- a/vendor/container-interop/container-interop/composer.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "name": "container-interop/container-interop", - "type": "library", - "description": "Promoting the interoperability of container objects (DIC, SL, etc.)", - "license": "MIT", - "autoload": { - "psr-4": { - "Interop\\Container\\": "src/Interop/Container/" - } - } -} diff --git a/vendor/container-interop/container-interop/docs/ContainerInterface-meta.md b/vendor/container-interop/container-interop/docs/ContainerInterface-meta.md deleted file mode 100644 index 90711c9..0000000 --- a/vendor/container-interop/container-interop/docs/ContainerInterface-meta.md +++ /dev/null @@ -1,114 +0,0 @@ -# ContainerInterface Meta Document - -## Introduction - -This document describes the process and discussions that lead to the `ContainerInterface`. -Its goal is to explain the reasons behind each decision. - -## Goal - -The goal set by `ContainerInterface` is to standardize how frameworks and libraries make use of a -container to obtain objects and parameters. - -By standardizing such a behavior, frameworks and libraries using the `ContainerInterface` -could work with any compatible container. -That would allow end users to choose their own container based on their own preferences. - -It is important to distinguish the two usages of a container: - -- configuring entries -- fetching entries - -Most of the time, those two sides are not used by the same party. -While it is often end users who tend to configure entries, it is generally the framework that fetch -entries to build the application. - -This is why this interface focuses only on how entries can be fetched from a container. - -## Interface name - -The interface name has been thoroughly discussed and was decided by a vote. - -The list of options considered with their respective votes are: - -- `ContainerInterface`: +8 -- `ProviderInterface`: +2 -- `LocatorInterface`: 0 -- `ReadableContainerInterface`: -5 -- `ServiceLocatorInterface`: -6 -- `ObjectFactory`: -6 -- `ObjectStore`: -8 -- `ConsumerInterface`: -9 - -[Full results of the vote](https://github.com/container-interop/container-interop/wiki/%231-interface-name:-Vote) - -The complete discussion can be read in [the issue #1](https://github.com/container-interop/container-interop/issues/1). - -## Interface methods - -The choice of which methods the interface would contain was made after a statistical analysis of existing containers. -The results of this analysis are available [in this document](https://gist.github.com/mnapoli/6159681). - -The summary of the analysis showed that: - -- all containers offer a method to get an entry by its id -- a large majority name such method `get()` -- for all containers, the `get()` method has 1 mandatory parameter of type string -- some containers have an optional additional argument for `get()`, but it doesn't same the same purpose between containers -- a large majority of the containers offer a method to test if it can return an entry by its id -- a majority name such method `has()` -- for all containers offering `has()`, the method has exactly 1 parameter of type string -- a large majority of the containers throw an exception rather than returning null when an entry is not found in `get()` -- a large majority of the containers don't implement `ArrayAccess` - -The question of whether to include methods to define entries has been discussed in -[issue #1](https://github.com/container-interop/container-interop/issues/1). -It has been judged that such methods do not belong in the interface described here because it is out of its scope -(see the "Goal" section). - -As a result, the `ContainerInterface` contains two methods: - -- `get()`, returning anything, with one mandatory string parameter. Should throw an exception if the entry is not found. -- `has()`, returning a boolean, with one mandatory string parameter. - -### Number of parameters in `get()` method - -While `ContainerInterface` only defines one mandatory parameter in `get()`, it is not incompatible with -existing containers that have additional optional parameters. PHP allows an implementation to offer more parameters -as long as they are optional, because the implementation *does* satisfy the interface. - -This issue has been discussed in [issue #6](https://github.com/container-interop/container-interop/issues/6). - -### Type of the `$id` parameter - -The type of the `$id` parameter in `get()` and `has()` has been discussed in -[issue #6](https://github.com/container-interop/container-interop/issues/6). -While `string` is used in all the containers that were analyzed, it was suggested that allowing -anything (such as objects) could allow containers to offer a more advanced query API. - -An example given was to use the container as an object builder. The `$id` parameter would then be an -object that would describe how to create an instance. - -The conclusion of the discussion was that this was beyond the scope of getting entries from a container without -knowing how the container provided them, and it was more fit for a factory. - -## Contributors - -Are listed here all people that contributed in the discussions or votes, by alphabetical order: - -- [Amy Stephen](https://github.com/AmyStephen) -- [David Négrier](https://github.com/moufmouf) -- [Don Gilbert](https://github.com/dongilbert) -- [Jason Judge](https://github.com/judgej) -- [Jeremy Lindblom](https://github.com/jeremeamia) -- [Marco Pivetta](https://github.com/Ocramius) -- [Matthieu Napoli](https://github.com/mnapoli) -- [Paul M. Jones](https://github.com/pmjones) -- [Stephan Hochdörfer](https://github.com/shochdoerfer) -- [Taylor Otwell](https://github.com/taylorotwell) - -## Relevant links - -- [`ContainerInterface.php`](https://github.com/container-interop/container-interop/blob/master/src/Interop/Container/ContainerInterface.php) -- [List of all issues](https://github.com/container-interop/container-interop/issues?labels=ContainerInterface&milestone=&page=1&state=closed) -- [Vote for the interface name](https://github.com/container-interop/container-interop/wiki/%231-interface-name:-Vote) diff --git a/vendor/container-interop/container-interop/docs/ContainerInterface.md b/vendor/container-interop/container-interop/docs/ContainerInterface.md deleted file mode 100644 index 9f60967..0000000 --- a/vendor/container-interop/container-interop/docs/ContainerInterface.md +++ /dev/null @@ -1,153 +0,0 @@ -Container interface -=================== - -This document describes a common interface for dependency injection containers. - -The goal set by `ContainerInterface` is to standardize how frameworks and libraries make use of a -container to obtain objects and parameters (called *entries* in the rest of this document). - -The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", -"SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be -interpreted as described in [RFC 2119][]. - -The word `implementor` in this document is to be interpreted as someone -implementing the `ContainerInterface` in a depency injection-related library or framework. -Users of dependency injections containers (DIC) are refered to as `user`. - -[RFC 2119]: http://tools.ietf.org/html/rfc2119 - -1. Specification ------------------ - -### 1.1 Basics - -- The `Interop\Container\ContainerInterface` exposes two methods : `get` and `has`. - -- `get` takes one mandatory parameter: an entry identifier. It MUST be a string. - A call to `get` can return anything (a *mixed* value), or throws an exception if the identifier - is not known to the container. Two successive calls to `get` with the same - identifier SHOULD return the same value. However, depending on the `implementor` - design and/or `user` configuration, different values might be returned, so - `user` SHOULD NOT rely on getting the same value on 2 successive calls. - While `ContainerInterface` only defines one mandatory parameter in `get()`, implementations - MAY accept additional optional parameters. - -- `has` takes one unique parameter: an entry identifier. It MUST return `true` - if an entry identifier is known to the container and `false` if it is not. - -### 1.2 Exceptions - -Exceptions directly thrown by the container MUST implement the -[`Interop\Container\Exception\ContainerException`](../src/Interop/Container/Exception/ContainerException.php). - -A call to the `get` method with a non-existing id should throw a -[`Interop\Container\Exception\NotFoundException`](../src/Interop/Container/Exception/NotFoundException.php). - -### 1.3 Additional features - -This section describes additional features that MAY be added to a container. Containers are not -required to implement these features to respect the ContainerInterface. - -#### 1.3.1 Delegate lookup feature - -The goal of the *delegate lookup* feature is to allow several containers to share entries. -Containers implementing this feature can perform dependency lookups in other containers. - -Containers implementing this feature will offer a greater lever of interoperability -with other containers. Implementation of this feature is therefore RECOMMENDED. - -A container implementing this feature: - -- MUST implement the `ContainerInterface` -- MUST provide a way to register a delegate container (using a constructor parameter, or a setter, - or any possible way). The delegate container MUST implement the `ContainerInterface`. - -When a container is configured to use a delegate container for dependencies: - -- Calls to the `get` method should only return an entry if the entry is part of the container. - If the entry is not part of the container, an exception should be thrown - (as requested by the `ContainerInterface`). -- Calls to the `has` method should only return `true` if the entry is part of the container. - If the entry is not part of the container, `false` should be returned. -- If the fetched entry has dependencies, **instead** of performing - the dependency lookup in the container, the lookup is performed on the *delegate container*. - -Important! By default, the lookup SHOULD be performed on the delegate container **only**, not on the container itself. - -It is however allowed for containers to provide exception cases for special entries, and a way to lookup -into the same container (or another container) instead of the delegate container. - -2. Package ----------- - -The interfaces and classes described as well as relevant exception are provided as part of the -[container-interop/container-interop](https://packagist.org/packages/container-interop/container-interop) package. - -3. `Interop\Container\ContainerInterface` ------------------------------------------ - -```php -<?php -namespace Interop\Container; - -use Interop\Container\Exception\ContainerException; -use Interop\Container\Exception\NotFoundException; - -/** - * Describes the interface of a container that exposes methods to read its entries. - */ -interface ContainerInterface -{ - /** - * Finds an entry of the container by its identifier and returns it. - * - * @param string $id Identifier of the entry to look for. - * - * @throws NotFoundException No entry was found for this identifier. - * @throws ContainerException Error while retrieving the entry. - * - * @return mixed Entry. - */ - public function get($id); - - /** - * Returns true if the container can return an entry for the given identifier. - * Returns false otherwise. - * - * @param string $id Identifier of the entry to look for. - * - * @return boolean - */ - public function has($id); -} -``` - -4. `Interop\Container\Exception\ContainerException` ---------------------------------------------------- - -```php -<?php -namespace Interop\Container\Exception; - -/** - * Base interface representing a generic exception in a container. - */ -interface ContainerException -{ -} -``` - -5. `Interop\Container\Exception\NotFoundException` ---------------------------------------------------- - -```php -<?php -namespace Interop\Container\Exception; - -/** - * No entry was found in the container. - */ -interface NotFoundException extends ContainerException -{ -} -``` diff --git a/vendor/container-interop/container-interop/docs/Delegate-lookup-meta.md b/vendor/container-interop/container-interop/docs/Delegate-lookup-meta.md deleted file mode 100644 index d21ebf9..0000000 --- a/vendor/container-interop/container-interop/docs/Delegate-lookup-meta.md +++ /dev/null @@ -1,259 +0,0 @@ -Delegate lookup feature Meta Document -===================================== - -1. Summary ----------- - -This document describes the *delegate lookup feature*. -Containers are not required to implement this feature to respect the `ContainerInterface`. -However, containers implementing this feature will offer a greater lever of interoperability -with other containers, allowing multiple containers to share entries in the same application. -Implementation of this feature is therefore recommanded. - -2. Why Bother? --------------- - -The [`ContainerInterface`](../src/Interop/Container/ContainerInterface.php) ([meta doc](ContainerInterface.md)) -standardizes how frameworks and libraries make use of a container to obtain objects and parameters. - -By standardizing such a behavior, frameworks and libraries relying on the `ContainerInterface` -could work with any compatible container. -That would allow end users to choose their own container based on their own preferences. - -The `ContainerInterface` is also enough if we want to have several containers side-by-side in the same -application. For instance, this is what the [CompositeContainer](https://github.com/jeremeamia/acclimate-container/blob/master/src/CompositeContainer.php) -class of [Acclimate](https://github.com/jeremeamia/acclimate-container) is designed for: - - - -However, an instance in container 1 cannot reference an instance in container 2. - -It would be better if an instance of container 1 could reference an instance in container 2, -and the opposite should be true. - - - -In the sample above, entry 1 in container 1 is referencing entry 3 in container 2. - -3. Scope --------- - -### 3.1 Goals - -The goal of the *delegate lookup* feature is to allow several containers to share entries. - -4. Approaches -------------- - -### 4.1 Chosen Approach - -Containers implementing this feature can perform dependency lookups in other containers. - -A container implementing this feature: - -- must implement the `ContainerInterface` -- must provide a way to register a *delegate container* (using a constructor parameter, or a setter, or any -possible way). The *delegate container* must implement the `ContainerInterface`. - -When a *delegate container* is configured on a container: - -- Calls to the `get` method should only return an entry if the entry is part of the container. -If the entry is not part of the container, an exception should be thrown (as required in the `ContainerInterface`). -- Calls to the `has` method should only return *true* if the entry is part of the container. -If the entry is not part of the container, *false* should be returned. - - Finally, the important part: if the entry we are fetching has dependencies, -**instead** of perfoming the dependency lookup in the container, the lookup is performed on the *delegate container*. - -Important! By default, the lookup should be performed on the delegate container **only**, not on the container itself. - -It is however allowed for containers to provide exception cases for special entries, and a way to lookup into -the same container (or another container) instead of the delegate container. - -### 4.2 Typical usage - -The *delegate container* will usually be a composite container. A composite container is a container that -contains several other containers. When performing a lookup on a composite container, the inner containers are -queried until one container returns an entry. -An inner container implementing the *delegate lookup feature* will return entries it contains, but if these -entries have dependencies, the dependencies lookup calls will be performed on the composite container, giving -a chance to all containers to answer. - -Interestingly enough, the order in which containers are added in the composite container matters. Indeed, -the first containers to be added in the composite container can "override" the entries of containers with -lower priority. - - - -In the example above, "container 2" contains a controller "myController" and the controller is referencing an -"entityManager" entry. "Container 1" contains also an entry named "entityManager". -Without the *delegate lookup* feature, when requesting the "myController" instance to container 2, it would take -in charge the instanciation of both entries. - -However, using the *delegate lookup* feature, here is what happens when we ask the composite controller for the -"myController" instance: - -- The composite controller asks container 1 if if contains the "myController" instance. The answer is no. -- The composite controller asks container 2 if if contains the "myController" instance. The answer is yes. -- The composite controller performs a `get` call on container 2 for the "myController" instance. -- Container 2 sees that "myController" has a dependency on "entityManager". -- Container 2 delegates the lookup of "entityManager" to the composite controller. -- The composite controller asks container 1 if if contains the "entityManager" instance. The answer is yes. -- The composite controller performs a `get` call on container 1 for the "entityManager" instance. - -In the end, we get a controller instanciated by container 2 that references an entityManager instanciated -by container 1. - -### 4.3 Alternative: the fallback strategy - -The first proposed approach we tried was to perform all the lookups in the "local" container, -and if a lookup fails in the container, to use the delegate container. In this scenario, the -delegate container is used in "fallback" mode. - -This strategy has been described in @moufmouf blog post: http://mouf-php.com/container-interop-whats-next (solution 1). -It was also discussed [here](https://github.com/container-interop/container-interop/pull/8#issuecomment-33570697) and -[here](https://github.com/container-interop/container-interop/pull/20#issuecomment-56599631). - -Problems with this strategy: - -- Heavy problem regarding infinite loops -- Unable to overload a container entry with the delegate container entry - -### 4.4 Alternative: force implementing an interface - -The first proposed approach was to develop a `ParentAwareContainerInterface` interface. -It was proposed here: https://github.com/container-interop/container-interop/pull/8 - -The interface would have had the behaviour of the delegate lookup feature but would have forced the addition of -a `setParentContainter` method: - -```php -interface ParentAwareContainerInterface extends ReadableContainerInterface { - /** - * Sets the parent container associated to that container. This container will call - * the parent container to fetch dependencies. - * - * @param ContainerInterface $container - */ - public function setParentContainer(ContainerInterface $container); -} -``` - -The interface idea was first questioned by @Ocramius [here](https://github.com/container-interop/container-interop/pull/8#issuecomment-51721777). -@Ocramius expressed the idea that an interface should not contain setters, otherwise, it is forcing implementation -details on the class implementing the interface. -Then @mnapoli made a proposal for a "convention" [here](https://github.com/container-interop/container-interop/pull/8#issuecomment-51841079), -this idea was further discussed until all participants in the discussion agreed to remove the interface idea -and replace it with a "standard" feature. - -**Pros:** - -If we had had an interface, we could have delegated the registration of the delegate/composite container to the -the delegate/composite container itself. -For instance: - -```php -$containerA = new ContainerA(); -$containerB = new ContainerB(); - -$compositeContainer = new CompositeContainer([$containerA, $containerB]); - -// The call to 'setParentContainer' is delegated to the CompositeContainer -// It is not the responsibility of the user anymore. -class CompositeContainer { - ... - - public function __construct($containers) { - foreach ($containers as $container) { - if ($container instanceof ParentAwareContainerInterface) { - $container->setParentContainer($this); - } - } - ... - } -} - -``` - -**Cons:** - -Cons have been extensively discussed [here](https://github.com/container-interop/container-interop/pull/8#issuecomment-51721777). -Basically, forcing a setter into an interface is a bad idea. Setters are similar to constructor arguments, -and it's a bad idea to standardize a constructor: how the delegate container is configured into a container is an implementation detail. This outweights the benefits of the interface. - -### 4.4 Alternative: no exception case for delegate lookups - -Originally, the proposed wording for delegate lookup calls was: - -> Important! The lookup MUST be performed on the delegate container **only**, not on the container itself. - -This was later replaced by: - -> Important! By default, the lookup SHOULD be performed on the delegate container **only**, not on the container itself. -> -> It is however allowed for containers to provide exception cases for special entries, and a way to lookup -> into the same container (or another container) instead of the delegate container. - -Exception cases have been allowed to avoid breaking dependencies with some services that must be provided -by the container (on @njasm proposal). This was proposed here: https://github.com/container-interop/container-interop/pull/20#issuecomment-56597235 - -### 4.5 Alternative: having one of the containers act as the composite container - -In real-life scenarios, we usually have a big framework (Symfony 2, Zend Framework 2, etc...) and we want to -add another DI container to this container. Most of the time, the "big" framework will be responsible for -creating the controller's instances, using it's own DI container. Until *container-interop* is fully adopted, -the "big" framework will not be aware of the existence of a composite container that it should use instead -of its own container. - -For this real-life use cases, @mnapoli and @moufmouf proposed to extend the "big" framework's DI container -to make it act as a composite container. - -This has been discussed [here](https://github.com/container-interop/container-interop/pull/8#issuecomment-40367194) -and [here](http://mouf-php.com/container-interop-whats-next#solution4). - -This was implemented in Symfony 2 using: - -- [interop.symfony.di](https://github.com/thecodingmachine/interop.symfony.di/tree/v0.1.0) -- [framework interop](https://github.com/mnapoli/framework-interop/) - -This was implemented in Silex using: - -- [interop.silex.di](https://github.com/thecodingmachine/interop.silex.di) - -Having a container act as the composite container is not part of the delegate lookup standard because it is -simply a temporary design pattern used to make existing frameworks that do not support yet ContainerInterop -play nice with other DI containers. - - -5. Implementations ------------------- - -The following projects already implement the delegate lookup feature: - -- [Mouf](http://mouf-php.com), through the [`setDelegateLookupContainer` method](https://github.com/thecodingmachine/mouf/blob/2.0/src/Mouf/MoufManager.php#L2120) -- [PHP-DI](http://php-di.org/), through the [`$wrapperContainer` parameter of the constructor](https://github.com/mnapoli/PHP-DI/blob/master/src/DI/Container.php#L72) -- [pimple-interop](https://github.com/moufmouf/pimple-interop), through the [`$container` parameter of the constructor](https://github.com/moufmouf/pimple-interop/blob/master/src/Interop/Container/Pimple/PimpleInterop.php#L62) - -6. People ---------- - -Are listed here all people that contributed in the discussions, by alphabetical order: - -- [Alexandru Pătrănescu](https://github.com/drealecs) -- [Ben Peachey](https://github.com/potherca) -- [David Négrier](https://github.com/moufmouf) -- [Jeremy Lindblom](https://github.com/jeremeamia) -- [Marco Pivetta](https://github.com/Ocramius) -- [Matthieu Napoli](https://github.com/mnapoli) -- [Nelson J Morais](https://github.com/njasm) -- [Phil Sturgeon](https://github.com/philsturgeon) -- [Stephan Hochdörfer](https://github.com/shochdoerfer) - -7. Relevant Links ------------------ - -_**Note:** Order descending chronologically._ - -- [Pull request on the delegate lookup feature](https://github.com/container-interop/container-interop/pull/20) -- [Pull request on the interface idea](https://github.com/container-interop/container-interop/pull/8) -- [Original article exposing the delegate lookup idea along many others](http://mouf-php.com/container-interop-whats-next) - diff --git a/vendor/container-interop/container-interop/docs/Delegate-lookup.md b/vendor/container-interop/container-interop/docs/Delegate-lookup.md deleted file mode 100644 index 04eb3ae..0000000 --- a/vendor/container-interop/container-interop/docs/Delegate-lookup.md +++ /dev/null @@ -1,60 +0,0 @@ -Delegate lookup feature -======================= - -This document describes a standard for dependency injection containers. - -The goal set by the *delegate lookup* feature is to allow several containers to share entries. -Containers implementing this feature can perform dependency lookups in other containers. - -Containers implementing this feature will offer a greater lever of interoperability -with other containers. Implementation of this feature is therefore RECOMMENDED. - -The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", -"SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be -interpreted as described in [RFC 2119][]. - -The word `implementor` in this document is to be interpreted as someone -implementing the delegate lookup feature in a dependency injection-related library or framework. -Users of dependency injections containers (DIC) are refered to as `user`. - -[RFC 2119]: http://tools.ietf.org/html/rfc2119 - -1. Vocabulary -------------- - -In a dependency injection container, the container is used to fetch entries. -Entries can have dependencies on other entries. Usually, these other entries are fetched by the container. - -The *delegate lookup* feature is the ability for a container to fetch dependencies in -another container. In the rest of the document, the word "container" will reference the container -implemented by the implementor. The word "delegate container" will reference the container we are -fetching the dependencies from. - -2. Specification ----------------- - -A container implementing the *delegate lookup* feature: - -- MUST implement the [`ContainerInterface`](ContainerInterface.md) -- MUST provide a way to register a delegate container (using a constructor parameter, or a setter, - or any possible way). The delegate container MUST implement the [`ContainerInterface`](ContainerInterface.md). - -When a container is configured to use a delegate container for dependencies: - -- Calls to the `get` method should only return an entry if the entry is part of the container. - If the entry is not part of the container, an exception should be thrown - (as requested by the [`ContainerInterface`](ContainerInterface.md)). -- Calls to the `has` method should only return `true` if the entry is part of the container. - If the entry is not part of the container, `false` should be returned. -- If the fetched entry has dependencies, **instead** of performing - the dependency lookup in the container, the lookup is performed on the *delegate container*. - -Important: By default, the dependency lookups SHOULD be performed on the delegate container **only**, not on the container itself. - -It is however allowed for containers to provide exception cases for special entries, and a way to lookup -into the same container (or another container) instead of the delegate container. - -3. Package / Interface ----------------------- - -This feature is not tied to any code, interface or package. diff --git a/vendor/container-interop/container-interop/docs/images/interoperating_containers.png b/vendor/container-interop/container-interop/docs/images/interoperating_containers.png deleted file mode 100644 index 9c672e16c72a08708ea5bdeb51757c2951d3ee66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35971 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 diff --git a/vendor/container-interop/container-interop/docs/images/priority.png b/vendor/container-interop/container-interop/docs/images/priority.png deleted file mode 100644 index 5760dc71b557fea7ec5bd5699adfd1c228b9cdec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22949 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%0AKh43SR6PQXP;$T8}?dn$*oVemiBs{lNMae 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 b{b!zWYFV!O4QB-g1_lOCS3j3^P6<r_h2)Jx diff --git a/vendor/container-interop/container-interop/docs/images/side_by_side_containers.png b/vendor/container-interop/container-interop/docs/images/side_by_side_containers.png deleted file mode 100644 index 24ca03c7cfd77afd6bd70094bcd532e4aef9f8e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22519 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≻okbCB1S9AHj(l(cgR1dqT6TVhwqh-H705 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 diff --git a/vendor/container-interop/container-interop/src/Interop/Container/ContainerInterface.php b/vendor/container-interop/container-interop/src/Interop/Container/ContainerInterface.php deleted file mode 100644 index dee5ffa..0000000 --- a/vendor/container-interop/container-interop/src/Interop/Container/ContainerInterface.php +++ /dev/null @@ -1,37 +0,0 @@ -<?php -/** - * @license http://www.opensource.org/licenses/mit-license.php MIT (see the LICENSE file) - */ - -namespace Interop\Container; - -use Interop\Container\Exception\ContainerException; -use Interop\Container\Exception\NotFoundException; - -/** - * Describes the interface of a container that exposes methods to read its entries. - */ -interface ContainerInterface -{ - /** - * Finds an entry of the container by its identifier and returns it. - * - * @param string $id Identifier of the entry to look for. - * - * @throws NotFoundException No entry was found for this identifier. - * @throws ContainerException Error while retrieving the entry. - * - * @return mixed Entry. - */ - public function get($id); - - /** - * Returns true if the container can return an entry for the given identifier. - * Returns false otherwise. - * - * @param string $id Identifier of the entry to look for. - * - * @return boolean - */ - public function has($id); -} diff --git a/vendor/container-interop/container-interop/src/Interop/Container/Exception/ContainerException.php b/vendor/container-interop/container-interop/src/Interop/Container/Exception/ContainerException.php deleted file mode 100644 index d867434..0000000 --- a/vendor/container-interop/container-interop/src/Interop/Container/Exception/ContainerException.php +++ /dev/null @@ -1,13 +0,0 @@ -<?php -/** - * @license http://www.opensource.org/licenses/mit-license.php MIT (see the LICENSE file) - */ - -namespace Interop\Container\Exception; - -/** - * Base interface representing a generic exception in a container. - */ -interface ContainerException -{ -} diff --git a/vendor/container-interop/container-interop/src/Interop/Container/Exception/NotFoundException.php b/vendor/container-interop/container-interop/src/Interop/Container/Exception/NotFoundException.php deleted file mode 100644 index 714d7a9..0000000 --- a/vendor/container-interop/container-interop/src/Interop/Container/Exception/NotFoundException.php +++ /dev/null @@ -1,13 +0,0 @@ -<?php -/** - * @license http://www.opensource.org/licenses/mit-license.php MIT (see the LICENSE file) - */ - -namespace Interop\Container\Exception; - -/** - * No entry was found in the container. - */ -interface NotFoundException extends ContainerException -{ -} diff --git a/vendor/nikic/fast-route/.hhconfig b/vendor/nikic/fast-route/.hhconfig deleted file mode 100644 index 0c2153c..0000000 --- a/vendor/nikic/fast-route/.hhconfig +++ /dev/null @@ -1 +0,0 @@ -assume_php=false diff --git a/vendor/nikic/fast-route/.travis.yml b/vendor/nikic/fast-route/.travis.yml deleted file mode 100644 index e16ed63..0000000 --- a/vendor/nikic/fast-route/.travis.yml +++ /dev/null @@ -1,12 +0,0 @@ -language: php - -php: - - 5.4 - - 5.5 - - 5.6 - - 7.0 - - hhvm - -matrix: - allow_failures: - - php: 7.0 diff --git a/vendor/nikic/fast-route/FastRoute.hhi b/vendor/nikic/fast-route/FastRoute.hhi deleted file mode 100644 index c34bb8e..0000000 --- a/vendor/nikic/fast-route/FastRoute.hhi +++ /dev/null @@ -1,126 +0,0 @@ -<?hh // decl - -namespace FastRoute { - class BadRouteException extends \LogicException { - } - - interface RouteParser { - public function parse(string $route): array<array>; - } - - class RouteCollector { - public function __construct(RouteParser $routeParser, DataGenerator $dataGenerator); - public function addRoute(mixed $httpMethod, string $route, mixed $handler): void; - public function getData(): array; - } - - class Route { - public function __construct(string $httpMethod, mixed $handler, string $regex, array $variables); - public function matches(string $str): bool; - } - - interface DataGenerator { - public function addRoute(string $httpMethod, array $routeData, mixed $handler); - public function getData(): array; - } - - interface Dispatcher { - const int NOT_FOUND = 0; - const int FOUND = 1; - const int METHOD_NOT_ALLOWED = 2; - public function dispatch(string $httpMethod, string $uri): array; - } - - function simpleDispatcher( - (function(RouteCollector): void) $routeDefinitionCallback, - shape( - 'routeParser' => ?classname<RouteParser>, - 'dataGenerator' => ?classname<DataGenerator>, - 'dispatcher' => ?classname<Dispatcher>, - 'routeCollector' => ?classname<RouteCollector>, - ) $options = shape()): Dispatcher; - - function cachedDispatcher( - (function(RouteCollector): void) $routeDefinitionCallback, - shape( - 'routeParser' => ?classname<RouteParser>, - 'dataGenerator' => ?classname<DataGenerator>, - 'dispatcher' => ?classname<Dispatcher>, - 'routeCollector' => ?classname<RouteCollector>, - 'cacheDisabled' => ?bool, - 'cacheFile' => ?string, - ) $options = shape()): Dispatcher; -} - -namespace FastRoute\DataGenerator { - abstract class RegexBasedAbstract implements \FastRoute\DataGenerator { - protected abstract function getApproxChunkSize(); - protected abstract function processChunk($regexToRoutesMap); - - public function addRoute(string $httpMethod, array $routeData, mixed $handler): void; - public function getData(): array; - } - - class CharCountBased extends RegexBasedAbstract { - protected function getApproxChunkSize(): int; - protected function processChunk(array<string, string> $regexToRoutesMap): array<string, mixed>; - } - - class GroupCountBased extends RegexBasedAbstract { - protected function getApproxChunkSize(): int; - protected function processChunk(array<string, string> $regexToRoutesMap): array<string, mixed>; - } - - class GroupPosBased extends RegexBasedAbstract { - protected function getApproxChunkSize(): int; - protected function processChunk(array<string, string> $regexToRoutesMap): array<string, mixed>; - } - - class MarkBased extends RegexBasedAbstract { - protected function getApproxChunkSize(): int; - protected function processChunk(array<string, string> $regexToRoutesMap): array<string, mixed>; - } -} - -namespace FastRoute\Dispatcher { - abstract class RegexBasedAbstract implements \FastRoute\Dispatcher { - protected abstract function dispatchVariableRoute(array<array> $routeData, string $uri): array; - - public function dispatch(string $httpMethod, string $uri): array; - } - - class GroupPosBased extends RegexBasedAbstract { - public function __construct(array $data); - protected function dispatchVariableRoute(array<array> $routeData, string $uri): array; - } - - class GroupCountBased extends RegexBasedAbstract { - public function __construct(array $data); - protected function dispatchVariableRoute(array<array> $routeData, string $uri): array; - } - - class CharCountBased extends RegexBasedAbstract { - public function __construct(array $data); - protected function dispatchVariableRoute(array<array> $routeData, string $uri): array; - } - - class MarkBased extends RegexBasedAbstract { - public function __construct(array $data); - protected function dispatchVariableRoute(array<array> $routeData, string $uri): array; - } -} - -namespace FastRoute\RouteParser { - class Std implements \FastRoute\RouteParser { - const string VARIABLE_REGEX = <<<'REGEX' -\{ - \s* ([a-zA-Z][a-zA-Z0-9_]*) \s* - (?: - : \s* ([^{}]*(?:\{(?-1)\}[^{}]*)*) - )? -\} -REGEX; - const string DEFAULT_DISPATCH_REGEX = '[^/]+'; - public function parse(string $route): array<array>; - } -} diff --git a/vendor/nikic/fast-route/LICENSE b/vendor/nikic/fast-route/LICENSE deleted file mode 100644 index 478e764..0000000 --- a/vendor/nikic/fast-route/LICENSE +++ /dev/null @@ -1,31 +0,0 @@ -Copyright (c) 2013 by Nikita Popov. - -Some rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - - * The names of the contributors may not be used to endorse or - promote products derived from this software without specific - prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/nikic/fast-route/README.md b/vendor/nikic/fast-route/README.md deleted file mode 100644 index f812a2a..0000000 --- a/vendor/nikic/fast-route/README.md +++ /dev/null @@ -1,273 +0,0 @@ -FastRoute - Fast request router for PHP -======================================= - -This library provides a fast implementation of a regular expression based router. [Blog post explaining how the -implementation works and why it is fast.][blog_post] - -Install -------- - -To install with composer: - -```sh -composer require nikic/fast-route -``` - -Requires PHP 5.4 or newer. - -Usage ------ - -Here's a basic usage example: - -```php -<?php - -require '/path/to/vendor/autoload.php'; - -$dispatcher = FastRoute\simpleDispatcher(function(FastRoute\RouteCollector $r) { - $r->addRoute('GET', '/users', 'get_all_users_handler'); - // {id} must be a number (\d+) - $r->addRoute('GET', '/user/{id:\d+}', 'get_user_handler'); - // The /{title} suffix is optional - $r->addRoute('GET', '/articles/{id:\d+}[/{title}]', 'get_article_handler'); -}); - -// Fetch method and URI from somewhere -$httpMethod = $_SERVER['REQUEST_METHOD']; -$uri = $_SERVER['REQUEST_URI']; - -// Strip query string (?foo=bar) and decode URI -if (false !== $pos = strpos($uri, '?')) { - $uri = substr($uri, 0, $pos); -} -$uri = rawurldecode($uri); - -$routeInfo = $dispatcher->dispatch($httpMethod, $uri); -switch ($routeInfo[0]) { - case FastRoute\Dispatcher::NOT_FOUND: - // ... 404 Not Found - break; - case FastRoute\Dispatcher::METHOD_NOT_ALLOWED: - $allowedMethods = $routeInfo[1]; - // ... 405 Method Not Allowed - break; - case FastRoute\Dispatcher::FOUND: - $handler = $routeInfo[1]; - $vars = $routeInfo[2]; - // ... call $handler with $vars - break; -} -``` - -### Defining routes - -The routes are defined by calling the `FastRoute\simpleDispatcher()` function, which accepts -a callable taking a `FastRoute\RouteCollector` instance. The routes are added by calling -`addRoute()` on the collector instance: - -```php -$r->addRoute($method, $routePattern, $handler); -``` - -The `$method` is an uppercase HTTP method string for which a certain route should match. It -is possible to specify multiple valid methods using an array: - -```php -// These two calls -$r->addRoute('GET', '/test', 'handler'); -$r->addRoute('POST', '/test', 'handler'); -// Are equivalent to this one call -$r->addRoute(['GET', 'POST'], '/test', 'handler'); -``` - -By default the `$routePattern` uses a syntax where `{foo}` specifies a placeholder with name `foo` -and matching the regex `[^/]+`. To adjust the pattern the placeholder matches, you can specify -a custom pattern by writing `{bar:[0-9]+}`. Some examples: - -```php -// Matches /user/42, but not /user/xyz -$r->addRoute('GET', '/user/{id:\d+}', 'handler'); - -// Matches /user/foobar, but not /user/foo/bar -$r->addRoute('GET', '/user/{name}', 'handler'); - -// Matches /user/foo/bar as well -$r->addRoute('GET', '/user/{name:.+}', 'handler'); -``` - -Custom patterns for route placeholders cannot use capturing groups. For example `{lang:(en|de)}` -is not a valid placeholder, because `()` is a capturing group. Instead you can use either -`{lang:en|de}` or `{lang:(?:en|de)}`. - -Furthermore parts of the route enclosed in `[...]` are considered optional, so that `/foo[bar]` -will match both `/foo` and `/foobar`. Optional parts are only supported in a trailing position, -not in the middle of a route. - -```php -// This route -$r->addRoute('GET', '/user/{id:\d+}[/{name}]', 'handler'); -// Is equivalent to these two routes -$r->addRoute('GET', '/user/{id:\d+}', 'handler'); -$r->addRoute('GET', '/user/{id:\d+}/{name}', 'handler'); - -// Multiple nested optional parts are possible as well -$r->addRoute('GET', '/user[/{id:\d+}[/{name}]]', 'handler'); - -// This route is NOT valid, because optional parts can only occur at the end -$r->addRoute('GET', '/user[/{id:\d+}]/{name}', 'handler'); -``` - -The `$handler` parameter does not necessarily have to be a callback, it could also be a controller -class name or any other kind of data you wish to associate with the route. FastRoute only tells you -which handler corresponds to your URI, how you interpret it is up to you. - -### Caching - -The reason `simpleDispatcher` accepts a callback for defining the routes is to allow seamless -caching. By using `cachedDispatcher` instead of `simpleDispatcher` you can cache the generated -routing data and construct the dispatcher from the cached information: - -```php -<?php - -$dispatcher = FastRoute\cachedDispatcher(function(FastRoute\RouteCollector $r) { - $r->addRoute('GET', '/user/{name}/{id:[0-9]+}', 'handler0'); - $r->addRoute('GET', '/user/{id:[0-9]+}', 'handler1'); - $r->addRoute('GET', '/user/{name}', 'handler2'); -}, [ - 'cacheFile' => __DIR__ . '/route.cache', /* required */ - 'cacheDisabled' => IS_DEBUG_ENABLED, /* optional, enabled by default */ -]); -``` - -The second parameter to the function is an options array, which can be used to specify the cache -file location, among other things. - -### Dispatching a URI - -A URI is dispatched by calling the `dispatch()` method of the created dispatcher. This method -accepts the HTTP method and a URI. Getting those two bits of information (and normalizing them -appropriately) is your job - this library is not bound to the PHP web SAPIs. - -The `dispatch()` method returns an array whose first element contains a status code. It is one -of `Dispatcher::NOT_FOUND`, `Dispatcher::METHOD_NOT_ALLOWED` and `Dispatcher::FOUND`. For the -method not allowed status the second array element contains a list of HTTP methods allowed for -the supplied URI. For example: - - [FastRoute\Dispatcher::METHOD_NOT_ALLOWED, ['GET', 'POST']] - -> **NOTE:** The HTTP specification requires that a `405 Method Not Allowed` response include the -`Allow:` header to detail available methods for the requested resource. Applications using FastRoute -should use the second array element to add this header when relaying a 405 response. - -For the found status the second array element is the handler that was associated with the route -and the third array element is a dictionary of placeholder names to their values. For example: - - /* Routing against GET /user/nikic/42 */ - - [FastRoute\Dispatcher::FOUND, 'handler0', ['name' => 'nikic', 'id' => '42']] - -### Overriding the route parser and dispatcher - -The routing process makes use of three components: A route parser, a data generator and a -dispatcher. The three components adhere to the following interfaces: - -```php -<?php - -namespace FastRoute; - -interface RouteParser { - public function parse($route); -} - -interface DataGenerator { - public function addRoute($httpMethod, $routeData, $handler); - public function getData(); -} - -interface Dispatcher { - const NOT_FOUND = 0, FOUND = 1, METHOD_NOT_ALLOWED = 2; - - public function dispatch($httpMethod, $uri); -} -``` - -The route parser takes a route pattern string and converts it into an array of route infos, where -each route info is again an array of it's parts. The structure is best understood using an example: - - /* The route /user/{id:\d+}[/{name}] converts to the following array: */ - [ - [ - '/user/', - ['id', '\d+'], - ], - [ - '/user/', - ['id', '\d+'], - '/', - ['name', '[^/]+'], - ], - ] - -This array can then be passed to the `addRoute()` method of a data generator. After all routes have -been added the `getData()` of the generator is invoked, which returns all the routing data required -by the dispatcher. The format of this data is not further specified - it is tightly coupled to -the corresponding dispatcher. - -The dispatcher accepts the routing data via a constructor and provides a `dispatch()` method, which -you're already familiar with. - -The route parser can be overwritten individually (to make use of some different pattern syntax), -however the data generator and dispatcher should always be changed as a pair, as the output from -the former is tightly coupled to the input of the latter. The reason the generator and the -dispatcher are separate is that only the latter is needed when using caching (as the output of -the former is what is being cached.) - -When using the `simpleDispatcher` / `cachedDispatcher` functions from above the override happens -through the options array: - -```php -<?php - -$dispatcher = FastRoute\simpleDispatcher(function(FastRoute\RouteCollector $r) { - /* ... */ -}, [ - 'routeParser' => 'FastRoute\\RouteParser\\Std', - 'dataGenerator' => 'FastRoute\\DataGenerator\\GroupCountBased', - 'dispatcher' => 'FastRoute\\Dispatcher\\GroupCountBased', -]); -``` - -The above options array corresponds to the defaults. By replacing `GroupCountBased` by -`GroupPosBased` you could switch to a different dispatching strategy. - -### A Note on HEAD Requests - -The HTTP spec requires servers to [support both GET and HEAD methods][2616-511]: - -> The methods GET and HEAD MUST be supported by all general-purpose servers - -To avoid forcing users to manually register HEAD routes for each resource we fallback to matching an -available GET route for a given resource. The PHP web SAPI transparently removes the entity body -from HEAD responses so this behavior has no effect on the vast majority of users. - -However, implementers using FastRoute outside the web SAPI environment (e.g. a custom server) MUST -NOT send entity bodies generated in response to HEAD requests. If you are a non-SAPI user this is -*your responsibility*; FastRoute has no purview to prevent you from breaking HTTP in such cases. - -Finally, note that applications MAY always specify their own HEAD method route for a given -resource to bypass this behavior entirely. - -### Credits - -This library is based on a router that [Levi Morrison][levi] implemented for the Aerys server. - -A large number of tests, as well as HTTP compliance considerations, were provided by [Daniel Lowrey][rdlowrey]. - - -[2616-511]: http://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html#sec5.1.1 "RFC 2616 Section 5.1.1" -[blog_post]: http://nikic.github.io/2014/02/18/Fast-request-routing-using-regular-expressions.html -[levi]: https://github.com/morrisonlevi -[rdlowrey]: https://github.com/rdlowrey diff --git a/vendor/nikic/fast-route/composer.json b/vendor/nikic/fast-route/composer.json deleted file mode 100644 index 62aad22..0000000 --- a/vendor/nikic/fast-route/composer.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "nikic/fast-route", - "description": "Fast request router for PHP", - "keywords": ["routing", "router"], - "license": "BSD-3-Clause", - "authors": [ - { - "name": "Nikita Popov", - "email": "nikic@php.net" - } - ], - "require": { - "php": ">=5.4.0" - }, - "autoload": { - "psr-4": { - "FastRoute\\": "src/" - }, - "files": ["src/functions.php"] - } -} diff --git a/vendor/nikic/fast-route/phpunit.xml b/vendor/nikic/fast-route/phpunit.xml deleted file mode 100644 index 3c807b6..0000000 --- a/vendor/nikic/fast-route/phpunit.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> - -<phpunit backupGlobals="false" - backupStaticAttributes="false" - colors="true" - convertErrorsToExceptions="true" - convertNoticesToExceptions="true" - convertWarningsToExceptions="true" - processIsolation="false" - syntaxCheck="false" - bootstrap="test/bootstrap.php" - > - <testsuites> - <testsuite name="FastRoute Tests"> - <directory>./test/</directory> - </testsuite> - </testsuites> - - <filter> - <whitelist> - <directory>./src/</directory> - </whitelist> - </filter> -</phpunit> diff --git a/vendor/nikic/fast-route/src/BadRouteException.php b/vendor/nikic/fast-route/src/BadRouteException.php deleted file mode 100644 index 7e38479..0000000 --- a/vendor/nikic/fast-route/src/BadRouteException.php +++ /dev/null @@ -1,6 +0,0 @@ -<?php - -namespace FastRoute; - -class BadRouteException extends \LogicException { -} diff --git a/vendor/nikic/fast-route/src/DataGenerator.php b/vendor/nikic/fast-route/src/DataGenerator.php deleted file mode 100644 index 16053db..0000000 --- a/vendor/nikic/fast-route/src/DataGenerator.php +++ /dev/null @@ -1,25 +0,0 @@ -<?php - -namespace FastRoute; - -interface DataGenerator { - /** - * Adds a route to the data generator. The route data uses the - * same format that is returned by RouterParser::parser(). - * - * The handler doesn't necessarily need to be a callable, it - * can be arbitrary data that will be returned when the route - * matches. - * - * @param string $httpMethod - * @param array $routeData - * @param mixed $handler - */ - public function addRoute($httpMethod, $routeData, $handler); - - /** - * Returns dispatcher data in some unspecified format, which - * depends on the used method of dispatch. - */ - public function getData(); -} diff --git a/vendor/nikic/fast-route/src/DataGenerator/CharCountBased.php b/vendor/nikic/fast-route/src/DataGenerator/CharCountBased.php deleted file mode 100644 index 5c38b89..0000000 --- a/vendor/nikic/fast-route/src/DataGenerator/CharCountBased.php +++ /dev/null @@ -1,28 +0,0 @@ -<?php - -namespace FastRoute\DataGenerator; - -class CharCountBased extends RegexBasedAbstract { - protected function getApproxChunkSize() { - return 30; - } - - protected function processChunk($regexToRoutesMap) { - $routeMap = []; - $regexes = []; - - $suffixLen = 0; - $suffix = ''; - $count = count($regexToRoutesMap); - foreach ($regexToRoutesMap as $regex => $route) { - $suffixLen++; - $suffix .= "\t"; - - $regexes[] = '(?:' . $regex . '/(\t{' . $suffixLen . '})\t{' . ($count - $suffixLen) . '})'; - $routeMap[$suffix] = [$route->handler, $route->variables]; - } - - $regex = '~^(?|' . implode('|', $regexes) . ')$~'; - return ['regex' => $regex, 'suffix' => '/' . $suffix, 'routeMap' => $routeMap]; - } -} diff --git a/vendor/nikic/fast-route/src/DataGenerator/GroupCountBased.php b/vendor/nikic/fast-route/src/DataGenerator/GroupCountBased.php deleted file mode 100644 index d51807f..0000000 --- a/vendor/nikic/fast-route/src/DataGenerator/GroupCountBased.php +++ /dev/null @@ -1,28 +0,0 @@ -<?php - -namespace FastRoute\DataGenerator; - -class GroupCountBased extends RegexBasedAbstract { - protected function getApproxChunkSize() { - return 10; - } - - protected function processChunk($regexToRoutesMap) { - $routeMap = []; - $regexes = []; - $numGroups = 0; - foreach ($regexToRoutesMap as $regex => $route) { - $numVariables = count($route->variables); - $numGroups = max($numGroups, $numVariables); - - $regexes[] = $regex . str_repeat('()', $numGroups - $numVariables); - $routeMap[$numGroups + 1] = [$route->handler, $route->variables]; - - ++$numGroups; - } - - $regex = '~^(?|' . implode('|', $regexes) . ')$~'; - return ['regex' => $regex, 'routeMap' => $routeMap]; - } -} - diff --git a/vendor/nikic/fast-route/src/DataGenerator/GroupPosBased.php b/vendor/nikic/fast-route/src/DataGenerator/GroupPosBased.php deleted file mode 100644 index 4152f7a..0000000 --- a/vendor/nikic/fast-route/src/DataGenerator/GroupPosBased.php +++ /dev/null @@ -1,25 +0,0 @@ -<?php - -namespace FastRoute\DataGenerator; - -class GroupPosBased extends RegexBasedAbstract { - protected function getApproxChunkSize() { - return 10; - } - - protected function processChunk($regexToRoutesMap) { - $routeMap = []; - $regexes = []; - $offset = 1; - foreach ($regexToRoutesMap as $regex => $route) { - $regexes[] = $regex; - $routeMap[$offset] = [$route->handler, $route->variables]; - - $offset += count($route->variables); - } - - $regex = '~^(?:' . implode('|', $regexes) . ')$~'; - return ['regex' => $regex, 'routeMap' => $routeMap]; - } -} - diff --git a/vendor/nikic/fast-route/src/DataGenerator/MarkBased.php b/vendor/nikic/fast-route/src/DataGenerator/MarkBased.php deleted file mode 100644 index 61359f5..0000000 --- a/vendor/nikic/fast-route/src/DataGenerator/MarkBased.php +++ /dev/null @@ -1,25 +0,0 @@ -<?php - -namespace FastRoute\DataGenerator; - -class MarkBased extends RegexBasedAbstract { - protected function getApproxChunkSize() { - return 30; - } - - protected function processChunk($regexToRoutesMap) { - $routeMap = []; - $regexes = []; - $markName = 'a'; - foreach ($regexToRoutesMap as $regex => $route) { - $regexes[] = $regex . '(*MARK:' . $markName . ')'; - $routeMap[$markName] = [$route->handler, $route->variables]; - - ++$markName; - } - - $regex = '~^(?|' . implode('|', $regexes) . ')$~'; - return ['regex' => $regex, 'routeMap' => $routeMap]; - } -} - diff --git a/vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php b/vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php deleted file mode 100644 index 713d897..0000000 --- a/vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php +++ /dev/null @@ -1,144 +0,0 @@ -<?php - -namespace FastRoute\DataGenerator; - -use FastRoute\DataGenerator; -use FastRoute\BadRouteException; -use FastRoute\Route; - -abstract class RegexBasedAbstract implements DataGenerator { - protected $staticRoutes = []; - protected $methodToRegexToRoutesMap = []; - - protected abstract function getApproxChunkSize(); - protected abstract function processChunk($regexToRoutesMap); - - public function addRoute($httpMethod, $routeData, $handler) { - if ($this->isStaticRoute($routeData)) { - $this->addStaticRoute($httpMethod, $routeData, $handler); - } else { - $this->addVariableRoute($httpMethod, $routeData, $handler); - } - } - - public function getData() { - if (empty($this->methodToRegexToRoutesMap)) { - return [$this->staticRoutes, []]; - } - - return [$this->staticRoutes, $this->generateVariableRouteData()]; - } - - private function generateVariableRouteData() { - $data = []; - foreach ($this->methodToRegexToRoutesMap as $method => $regexToRoutesMap) { - $chunkSize = $this->computeChunkSize(count($regexToRoutesMap)); - $chunks = array_chunk($regexToRoutesMap, $chunkSize, true); - $data[$method] = array_map([$this, 'processChunk'], $chunks); - } - return $data; - } - - private function computeChunkSize($count) { - $numParts = max(1, round($count / $this->getApproxChunkSize())); - return ceil($count / $numParts); - } - - private function isStaticRoute($routeData) { - return count($routeData) === 1 && is_string($routeData[0]); - } - - private function addStaticRoute($httpMethod, $routeData, $handler) { - $routeStr = $routeData[0]; - - if (isset($this->staticRoutes[$httpMethod][$routeStr])) { - throw new BadRouteException(sprintf( - 'Cannot register two routes matching "%s" for method "%s"', - $routeStr, $httpMethod - )); - } - - if (isset($this->methodToRegexToRoutesMap[$httpMethod])) { - foreach ($this->methodToRegexToRoutesMap[$httpMethod] as $route) { - if ($route->matches($routeStr)) { - throw new BadRouteException(sprintf( - 'Static route "%s" is shadowed by previously defined variable route "%s" for method "%s"', - $routeStr, $route->regex, $httpMethod - )); - } - } - } - - $this->staticRoutes[$httpMethod][$routeStr] = $handler; - } - - private function addVariableRoute($httpMethod, $routeData, $handler) { - list($regex, $variables) = $this->buildRegexForRoute($routeData); - - if (isset($this->methodToRegexToRoutesMap[$httpMethod][$regex])) { - throw new BadRouteException(sprintf( - 'Cannot register two routes matching "%s" for method "%s"', - $regex, $httpMethod - )); - } - - $this->methodToRegexToRoutesMap[$httpMethod][$regex] = new Route( - $httpMethod, $handler, $regex, $variables - ); - } - - private function buildRegexForRoute($routeData) { - $regex = ''; - $variables = []; - foreach ($routeData as $part) { - if (is_string($part)) { - $regex .= preg_quote($part, '~'); - continue; - } - - list($varName, $regexPart) = $part; - - if (isset($variables[$varName])) { - throw new BadRouteException(sprintf( - 'Cannot use the same placeholder "%s" twice', $varName - )); - } - - if ($this->regexHasCapturingGroups($regexPart)) { - throw new BadRouteException(sprintf( - 'Regex "%s" for parameter "%s" contains a capturing group', - $regexPart, $varName - )); - } - - $variables[$varName] = $varName; - $regex .= '(' . $regexPart . ')'; - } - - return [$regex, $variables]; - } - - private function regexHasCapturingGroups($regex) { - if (false === strpos($regex, '(')) { - // Needs to have at least a ( to contain a capturing group - return false; - } - - // Semi-accurate detection for capturing groups - return preg_match( - '~ - (?: - \(\?\( - | \[ [^\]\\\\]* (?: \\\\ . [^\]\\\\]* )* \] - | \\\\ . - ) (*SKIP)(*FAIL) | - \( - (?! - \? (?! <(?![!=]) | P< | \' ) - | \* - ) - ~x', - $regex - ); - } -} diff --git a/vendor/nikic/fast-route/src/Dispatcher.php b/vendor/nikic/fast-route/src/Dispatcher.php deleted file mode 100644 index ea98009..0000000 --- a/vendor/nikic/fast-route/src/Dispatcher.php +++ /dev/null @@ -1,25 +0,0 @@ -<?php - -namespace FastRoute; - -interface Dispatcher { - const NOT_FOUND = 0; - const FOUND = 1; - const METHOD_NOT_ALLOWED = 2; - - /** - * Dispatches against the provided HTTP method verb and URI. - * - * Returns array with one of the following formats: - * - * [self::NOT_FOUND] - * [self::METHOD_NOT_ALLOWED, ['GET', 'OTHER_ALLOWED_METHODS']] - * [self::FOUND, $handler, ['varName' => 'value', ...]] - * - * @param string $httpMethod - * @param string $uri - * - * @return array - */ - public function dispatch($httpMethod, $uri); -} diff --git a/vendor/nikic/fast-route/src/Dispatcher/CharCountBased.php b/vendor/nikic/fast-route/src/Dispatcher/CharCountBased.php deleted file mode 100644 index 22ba240..0000000 --- a/vendor/nikic/fast-route/src/Dispatcher/CharCountBased.php +++ /dev/null @@ -1,28 +0,0 @@ -<?php - -namespace FastRoute\Dispatcher; - -class CharCountBased extends RegexBasedAbstract { - public function __construct($data) { - list($this->staticRouteMap, $this->variableRouteData) = $data; - } - - protected function dispatchVariableRoute($routeData, $uri) { - foreach ($routeData as $data) { - if (!preg_match($data['regex'], $uri . $data['suffix'], $matches)) { - continue; - } - - list($handler, $varNames) = $data['routeMap'][end($matches)]; - - $vars = []; - $i = 0; - foreach ($varNames as $varName) { - $vars[$varName] = $matches[++$i]; - } - return [self::FOUND, $handler, $vars]; - } - - return [self::NOT_FOUND]; - } -} diff --git a/vendor/nikic/fast-route/src/Dispatcher/GroupCountBased.php b/vendor/nikic/fast-route/src/Dispatcher/GroupCountBased.php deleted file mode 100644 index 0abd322..0000000 --- a/vendor/nikic/fast-route/src/Dispatcher/GroupCountBased.php +++ /dev/null @@ -1,28 +0,0 @@ -<?php - -namespace FastRoute\Dispatcher; - -class GroupCountBased extends RegexBasedAbstract { - public function __construct($data) { - list($this->staticRouteMap, $this->variableRouteData) = $data; - } - - protected function dispatchVariableRoute($routeData, $uri) { - foreach ($routeData as $data) { - if (!preg_match($data['regex'], $uri, $matches)) { - continue; - } - - list($handler, $varNames) = $data['routeMap'][count($matches)]; - - $vars = []; - $i = 0; - foreach ($varNames as $varName) { - $vars[$varName] = $matches[++$i]; - } - return [self::FOUND, $handler, $vars]; - } - - return [self::NOT_FOUND]; - } -} diff --git a/vendor/nikic/fast-route/src/Dispatcher/GroupPosBased.php b/vendor/nikic/fast-route/src/Dispatcher/GroupPosBased.php deleted file mode 100644 index 32227d4..0000000 --- a/vendor/nikic/fast-route/src/Dispatcher/GroupPosBased.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php - -namespace FastRoute\Dispatcher; - -class GroupPosBased extends RegexBasedAbstract { - public function __construct($data) { - list($this->staticRouteMap, $this->variableRouteData) = $data; - } - - protected function dispatchVariableRoute($routeData, $uri) { - foreach ($routeData as $data) { - if (!preg_match($data['regex'], $uri, $matches)) { - continue; - } - - // find first non-empty match - for ($i = 1; '' === $matches[$i]; ++$i); - - list($handler, $varNames) = $data['routeMap'][$i]; - - $vars = []; - foreach ($varNames as $varName) { - $vars[$varName] = $matches[$i++]; - } - return [self::FOUND, $handler, $vars]; - } - - return [self::NOT_FOUND]; - } -} diff --git a/vendor/nikic/fast-route/src/Dispatcher/MarkBased.php b/vendor/nikic/fast-route/src/Dispatcher/MarkBased.php deleted file mode 100644 index fefa711..0000000 --- a/vendor/nikic/fast-route/src/Dispatcher/MarkBased.php +++ /dev/null @@ -1,28 +0,0 @@ -<?php - -namespace FastRoute\Dispatcher; - -class MarkBased extends RegexBasedAbstract { - public function __construct($data) { - list($this->staticRouteMap, $this->variableRouteData) = $data; - } - - protected function dispatchVariableRoute($routeData, $uri) { - foreach ($routeData as $data) { - if (!preg_match($data['regex'], $uri, $matches)) { - continue; - } - - list($handler, $varNames) = $data['routeMap'][$matches['MARK']]; - - $vars = []; - $i = 0; - foreach ($varNames as $varName) { - $vars[$varName] = $matches[++$i]; - } - return [self::FOUND, $handler, $vars]; - } - - return [self::NOT_FOUND]; - } -} diff --git a/vendor/nikic/fast-route/src/Dispatcher/RegexBasedAbstract.php b/vendor/nikic/fast-route/src/Dispatcher/RegexBasedAbstract.php deleted file mode 100644 index 8823b9b..0000000 --- a/vendor/nikic/fast-route/src/Dispatcher/RegexBasedAbstract.php +++ /dev/null @@ -1,80 +0,0 @@ -<?php - -namespace FastRoute\Dispatcher; - -use FastRoute\Dispatcher; - -abstract class RegexBasedAbstract implements Dispatcher { - protected $staticRouteMap; - protected $variableRouteData; - - protected abstract function dispatchVariableRoute($routeData, $uri); - - public function dispatch($httpMethod, $uri) { - if (isset($this->staticRouteMap[$httpMethod][$uri])) { - $handler = $this->staticRouteMap[$httpMethod][$uri]; - return [self::FOUND, $handler, []]; - } - - $varRouteData = $this->variableRouteData; - if (isset($varRouteData[$httpMethod])) { - $result = $this->dispatchVariableRoute($varRouteData[$httpMethod], $uri); - if ($result[0] === self::FOUND) { - return $result; - } - } - - // For HEAD requests, attempt fallback to GET - if ($httpMethod === 'HEAD') { - if (isset($this->staticRouteMap['GET'][$uri])) { - $handler = $this->staticRouteMap['GET'][$uri]; - return [self::FOUND, $handler, []]; - } - if (isset($varRouteData['GET'])) { - $result = $this->dispatchVariableRoute($varRouteData['GET'], $uri); - if ($result[0] === self::FOUND) { - return $result; - } - } - } - - // If nothing else matches, try fallback routes - if (isset($this->staticRouteMap['*'][$uri])) { - $handler = $this->staticRouteMap['*'][$uri]; - return [self::FOUND, $handler, []]; - } - if (isset($varRouteData['*'])) { - $result = $this->dispatchVariableRoute($varRouteData['*'], $uri); - if ($result[0] === self::FOUND) { - return $result; - } - } - - // Find allowed methods for this URI by matching against all other HTTP methods as well - $allowedMethods = []; - - foreach ($this->staticRouteMap as $method => $uriMap) { - if ($method !== $httpMethod && isset($uriMap[$uri])) { - $allowedMethods[] = $method; - } - } - - foreach ($varRouteData as $method => $routeData) { - if ($method === $httpMethod) { - continue; - } - - $result = $this->dispatchVariableRoute($routeData, $uri); - if ($result[0] === self::FOUND) { - $allowedMethods[] = $method; - } - } - - // If there are no allowed methods the route simply does not exist - if ($allowedMethods) { - return [self::METHOD_NOT_ALLOWED, $allowedMethods]; - } else { - return [self::NOT_FOUND]; - } - } -} diff --git a/vendor/nikic/fast-route/src/Route.php b/vendor/nikic/fast-route/src/Route.php deleted file mode 100644 index d71ded1..0000000 --- a/vendor/nikic/fast-route/src/Route.php +++ /dev/null @@ -1,38 +0,0 @@ -<?php - -namespace FastRoute; - -class Route { - public $httpMethod; - public $regex; - public $variables; - public $handler; - - /** - * Constructs a route (value object). - * - * @param string $httpMethod - * @param mixed $handler - * @param string $regex - * @param array $variables - */ - public function __construct($httpMethod, $handler, $regex, $variables) { - $this->httpMethod = $httpMethod; - $this->handler = $handler; - $this->regex = $regex; - $this->variables = $variables; - } - - /** - * Tests whether this route matches the given string. - * - * @param string $str - * - * @return bool - */ - public function matches($str) { - $regex = '~^' . $this->regex . '$~'; - return (bool) preg_match($regex, $str); - } -} - diff --git a/vendor/nikic/fast-route/src/RouteCollector.php b/vendor/nikic/fast-route/src/RouteCollector.php deleted file mode 100644 index 4386bbf..0000000 --- a/vendor/nikic/fast-route/src/RouteCollector.php +++ /dev/null @@ -1,46 +0,0 @@ -<?php - -namespace FastRoute; - -class RouteCollector { - private $routeParser; - private $dataGenerator; - - /** - * Constructs a route collector. - * - * @param RouteParser $routeParser - * @param DataGenerator $dataGenerator - */ - public function __construct(RouteParser $routeParser, DataGenerator $dataGenerator) { - $this->routeParser = $routeParser; - $this->dataGenerator = $dataGenerator; - } - - /** - * Adds a route to the collection. - * - * The syntax used in the $route string depends on the used route parser. - * - * @param string|string[] $httpMethod - * @param string $route - * @param mixed $handler - */ - public function addRoute($httpMethod, $route, $handler) { - $routeDatas = $this->routeParser->parse($route); - foreach ((array) $httpMethod as $method) { - foreach ($routeDatas as $routeData) { - $this->dataGenerator->addRoute($method, $routeData, $handler); - } - } - } - - /** - * Returns the collected route data, as provided by the data generator. - * - * @return array - */ - public function getData() { - return $this->dataGenerator->getData(); - } -} diff --git a/vendor/nikic/fast-route/src/RouteParser.php b/vendor/nikic/fast-route/src/RouteParser.php deleted file mode 100644 index c089c31..0000000 --- a/vendor/nikic/fast-route/src/RouteParser.php +++ /dev/null @@ -1,36 +0,0 @@ -<?php - -namespace FastRoute; - -interface RouteParser { - /** - * Parses a route string into multiple route data arrays. - * - * The expected output is defined using an example: - * - * For the route string "/fixedRoutePart/{varName}[/moreFixed/{varName2:\d+}]", if {varName} is interpreted as - * a placeholder and [...] is interpreted as an optional route part, the expected result is: - * - * [ - * // first route: without optional part - * [ - * "/fixedRoutePart/", - * ["varName", "[^/]+"], - * ], - * // second route: with optional part - * [ - * "/fixedRoutePart/", - * ["varName", "[^/]+"], - * "/moreFixed/", - * ["varName2", [0-9]+"], - * ], - * ] - * - * Here one route string was converted into two route data arrays. - * - * @param string $route Route string to parse - * - * @return mixed[][] Array of route data arrays - */ - public function parse($route); -} diff --git a/vendor/nikic/fast-route/src/RouteParser/Std.php b/vendor/nikic/fast-route/src/RouteParser/Std.php deleted file mode 100644 index a6c21bd..0000000 --- a/vendor/nikic/fast-route/src/RouteParser/Std.php +++ /dev/null @@ -1,81 +0,0 @@ -<?php - -namespace FastRoute\RouteParser; - -use FastRoute\BadRouteException; -use FastRoute\RouteParser; - -/** - * Parses route strings of the following form: - * - * "/user/{name}[/{id:[0-9]+}]" - */ -class Std implements RouteParser { - const VARIABLE_REGEX = <<<'REGEX' -\{ - \s* ([a-zA-Z_][a-zA-Z0-9_-]*) \s* - (?: - : \s* ([^{}]*(?:\{(?-1)\}[^{}]*)*) - )? -\} -REGEX; - const DEFAULT_DISPATCH_REGEX = '[^/]+'; - - public function parse($route) { - $routeWithoutClosingOptionals = rtrim($route, ']'); - $numOptionals = strlen($route) - strlen($routeWithoutClosingOptionals); - - // Split on [ while skipping placeholders - $segments = preg_split('~' . self::VARIABLE_REGEX . '(*SKIP)(*F) | \[~x', $routeWithoutClosingOptionals); - if ($numOptionals !== count($segments) - 1) { - // If there are any ] in the middle of the route, throw a more specific error message - if (preg_match('~' . self::VARIABLE_REGEX . '(*SKIP)(*F) | \]~x', $routeWithoutClosingOptionals)) { - throw new BadRouteException("Optional segments can only occur at the end of a route"); - } - throw new BadRouteException("Number of opening '[' and closing ']' does not match"); - } - - $currentRoute = ''; - $routeDatas = []; - foreach ($segments as $n => $segment) { - if ($segment === '' && $n !== 0) { - throw new BadRouteException("Empty optional part"); - } - - $currentRoute .= $segment; - $routeDatas[] = $this->parsePlaceholders($currentRoute); - } - return $routeDatas; - } - - /** - * Parses a route string that does not contain optional segments. - */ - private function parsePlaceholders($route) { - if (!preg_match_all( - '~' . self::VARIABLE_REGEX . '~x', $route, $matches, - PREG_OFFSET_CAPTURE | PREG_SET_ORDER - )) { - return [$route]; - } - - $offset = 0; - $routeData = []; - foreach ($matches as $set) { - if ($set[0][1] > $offset) { - $routeData[] = substr($route, $offset, $set[0][1] - $offset); - } - $routeData[] = [ - $set[1][0], - isset($set[2]) ? trim($set[2][0]) : self::DEFAULT_DISPATCH_REGEX - ]; - $offset = $set[0][1] + strlen($set[0][0]); - } - - if ($offset != strlen($route)) { - $routeData[] = substr($route, $offset); - } - - return $routeData; - } -} diff --git a/vendor/nikic/fast-route/src/bootstrap.php b/vendor/nikic/fast-route/src/bootstrap.php deleted file mode 100644 index add216c..0000000 --- a/vendor/nikic/fast-route/src/bootstrap.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php - -namespace FastRoute; - -require __DIR__ . '/functions.php'; - -spl_autoload_register(function($class) { - if (strpos($class, 'FastRoute\\') === 0) { - $name = substr($class, strlen('FastRoute')); - require __DIR__ . strtr($name, '\\', DIRECTORY_SEPARATOR) . '.php'; - } -}); diff --git a/vendor/nikic/fast-route/src/functions.php b/vendor/nikic/fast-route/src/functions.php deleted file mode 100644 index 3af6779..0000000 --- a/vendor/nikic/fast-route/src/functions.php +++ /dev/null @@ -1,70 +0,0 @@ -<?php - -namespace FastRoute; - -if (!function_exists('FastRoute\simpleDispatcher')) { - /** - * @param callable $routeDefinitionCallback - * @param array $options - * - * @return Dispatcher - */ - function simpleDispatcher(callable $routeDefinitionCallback, array $options = []) { - $options += [ - 'routeParser' => 'FastRoute\\RouteParser\\Std', - 'dataGenerator' => 'FastRoute\\DataGenerator\\GroupCountBased', - 'dispatcher' => 'FastRoute\\Dispatcher\\GroupCountBased', - 'routeCollector' => 'FastRoute\\RouteCollector', - ]; - - /** @var RouteCollector $routeCollector */ - $routeCollector = new $options['routeCollector']( - new $options['routeParser'], new $options['dataGenerator'] - ); - $routeDefinitionCallback($routeCollector); - - return new $options['dispatcher']($routeCollector->getData()); - } - - /** - * @param callable $routeDefinitionCallback - * @param array $options - * - * @return Dispatcher - */ - function cachedDispatcher(callable $routeDefinitionCallback, array $options = []) { - $options += [ - 'routeParser' => 'FastRoute\\RouteParser\\Std', - 'dataGenerator' => 'FastRoute\\DataGenerator\\GroupCountBased', - 'dispatcher' => 'FastRoute\\Dispatcher\\GroupCountBased', - 'routeCollector' => 'FastRoute\\RouteCollector', - 'cacheDisabled' => false, - ]; - - if (!isset($options['cacheFile'])) { - throw new \LogicException('Must specify "cacheFile" option'); - } - - if (!$options['cacheDisabled'] && file_exists($options['cacheFile'])) { - $dispatchData = require $options['cacheFile']; - if (!is_array($dispatchData)) { - throw new \RuntimeException('Invalid cache file "' . $options['cacheFile'] . '"'); - } - return new $options['dispatcher']($dispatchData); - } - - $routeCollector = new $options['routeCollector']( - new $options['routeParser'], new $options['dataGenerator'] - ); - $routeDefinitionCallback($routeCollector); - - /** @var RouteCollector $routeCollector */ - $dispatchData = $routeCollector->getData(); - file_put_contents( - $options['cacheFile'], - '<?php return ' . var_export($dispatchData, true) . ';' - ); - - return new $options['dispatcher']($dispatchData); - } -} diff --git a/vendor/nikic/fast-route/test/Dispatcher/CharCountBasedTest.php b/vendor/nikic/fast-route/test/Dispatcher/CharCountBasedTest.php deleted file mode 100644 index 8168498..0000000 --- a/vendor/nikic/fast-route/test/Dispatcher/CharCountBasedTest.php +++ /dev/null @@ -1,13 +0,0 @@ -<?php - -namespace FastRoute\Dispatcher; - -class CharCountBasedTest extends DispatcherTest { - protected function getDispatcherClass() { - return 'FastRoute\\Dispatcher\\CharCountBased'; - } - - protected function getDataGeneratorClass() { - return 'FastRoute\\DataGenerator\\CharCountBased'; - } -} diff --git a/vendor/nikic/fast-route/test/Dispatcher/DispatcherTest.php b/vendor/nikic/fast-route/test/Dispatcher/DispatcherTest.php deleted file mode 100644 index a6d6205..0000000 --- a/vendor/nikic/fast-route/test/Dispatcher/DispatcherTest.php +++ /dev/null @@ -1,561 +0,0 @@ -<?php - -namespace FastRoute\Dispatcher; - -use FastRoute\RouteCollector; - -abstract class DispatcherTest extends \PHPUnit_Framework_TestCase { - - /** - * Delegate dispatcher selection to child test classes - */ - abstract protected function getDispatcherClass(); - - /** - * Delegate dataGenerator selection to child test classes - */ - abstract protected function getDataGeneratorClass(); - - /** - * Set appropriate options for the specific Dispatcher class we're testing - */ - private function generateDispatcherOptions() { - return [ - 'dataGenerator' => $this->getDataGeneratorClass(), - 'dispatcher' => $this->getDispatcherClass() - ]; - } - - /** - * @dataProvider provideFoundDispatchCases - */ - public function testFoundDispatches($method, $uri, $callback, $handler, $argDict) { - $dispatcher = \FastRoute\simpleDispatcher($callback, $this->generateDispatcherOptions()); - $info = $dispatcher->dispatch($method, $uri); - $this->assertSame($dispatcher::FOUND, $info[0]); - $this->assertSame($handler, $info[1]); - $this->assertSame($argDict, $info[2]); - } - - /** - * @dataProvider provideNotFoundDispatchCases - */ - public function testNotFoundDispatches($method, $uri, $callback) { - $dispatcher = \FastRoute\simpleDispatcher($callback, $this->generateDispatcherOptions()); - $routeInfo = $dispatcher->dispatch($method, $uri); - $this->assertFalse(isset($routeInfo[1]), - "NOT_FOUND result must only contain a single element in the returned info array" - ); - $this->assertSame($dispatcher::NOT_FOUND, $routeInfo[0]); - } - - /** - * @dataProvider provideMethodNotAllowedDispatchCases - */ - public function testMethodNotAllowedDispatches($method, $uri, $callback, $availableMethods) { - $dispatcher = \FastRoute\simpleDispatcher($callback, $this->generateDispatcherOptions()); - $routeInfo = $dispatcher->dispatch($method, $uri); - $this->assertTrue(isset($routeInfo[1]), - "METHOD_NOT_ALLOWED result must return an array of allowed methods at index 1" - ); - - list($routedStatus, $methodArray) = $dispatcher->dispatch($method, $uri); - $this->assertSame($dispatcher::METHOD_NOT_ALLOWED, $routedStatus); - $this->assertSame($availableMethods, $methodArray); - } - - /** - * @expectedException \FastRoute\BadRouteException - * @expectedExceptionMessage Cannot use the same placeholder "test" twice - */ - public function testDuplicateVariableNameError() { - \FastRoute\simpleDispatcher(function(RouteCollector $r) { - $r->addRoute('GET', '/foo/{test}/{test:\d+}', 'handler0'); - }, $this->generateDispatcherOptions()); - } - - /** - * @expectedException \FastRoute\BadRouteException - * @expectedExceptionMessage Cannot register two routes matching "/user/([^/]+)" for method "GET" - */ - public function testDuplicateVariableRoute() { - \FastRoute\simpleDispatcher(function(RouteCollector $r) { - $r->addRoute('GET', '/user/{id}', 'handler0'); // oops, forgot \d+ restriction ;) - $r->addRoute('GET', '/user/{name}', 'handler1'); - }, $this->generateDispatcherOptions()); - } - - /** - * @expectedException \FastRoute\BadRouteException - * @expectedExceptionMessage Cannot register two routes matching "/user" for method "GET" - */ - public function testDuplicateStaticRoute() { - \FastRoute\simpleDispatcher(function(RouteCollector $r) { - $r->addRoute('GET', '/user', 'handler0'); - $r->addRoute('GET', '/user', 'handler1'); - }, $this->generateDispatcherOptions()); - } - - /** - * @expectedException \FastRoute\BadRouteException - * @expectedExceptionMessage Static route "/user/nikic" is shadowed by previously defined variable route "/user/([^/]+)" for method "GET" - */ - public function testShadowedStaticRoute() { - \FastRoute\simpleDispatcher(function(RouteCollector $r) { - $r->addRoute('GET', '/user/{name}', 'handler0'); - $r->addRoute('GET', '/user/nikic', 'handler1'); - }, $this->generateDispatcherOptions()); - } - - /** - * @expectedException \FastRoute\BadRouteException - * @expectedExceptionMessage Regex "(en|de)" for parameter "lang" contains a capturing group - */ - public function testCapturing() { - \FastRoute\simpleDispatcher(function(RouteCollector $r) { - $r->addRoute('GET', '/{lang:(en|de)}', 'handler0'); - }, $this->generateDispatcherOptions()); - } - - public function provideFoundDispatchCases() { - $cases = []; - - // 0 --------------------------------------------------------------------------------------> - - $callback = function(RouteCollector $r) { - $r->addRoute('GET', '/resource/123/456', 'handler0'); - }; - - $method = 'GET'; - $uri = '/resource/123/456'; - $handler = 'handler0'; - $argDict = []; - - $cases[] = [$method, $uri, $callback, $handler, $argDict]; - - // 1 --------------------------------------------------------------------------------------> - - $callback = function(RouteCollector $r) { - $r->addRoute('GET', '/handler0', 'handler0'); - $r->addRoute('GET', '/handler1', 'handler1'); - $r->addRoute('GET', '/handler2', 'handler2'); - }; - - $method = 'GET'; - $uri = '/handler2'; - $handler = 'handler2'; - $argDict = []; - - $cases[] = [$method, $uri, $callback, $handler, $argDict]; - - // 2 --------------------------------------------------------------------------------------> - - $callback = function(RouteCollector $r) { - $r->addRoute('GET', '/user/{name}/{id:[0-9]+}', 'handler0'); - $r->addRoute('GET', '/user/{id:[0-9]+}', 'handler1'); - $r->addRoute('GET', '/user/{name}', 'handler2'); - }; - - $method = 'GET'; - $uri = '/user/rdlowrey'; - $handler = 'handler2'; - $argDict = ['name' => 'rdlowrey']; - - $cases[] = [$method, $uri, $callback, $handler, $argDict]; - - // 3 --------------------------------------------------------------------------------------> - - // reuse $callback from #2 - - $method = 'GET'; - $uri = '/user/12345'; - $handler = 'handler1'; - $argDict = ['id' => '12345']; - - $cases[] = [$method, $uri, $callback, $handler, $argDict]; - - // 4 --------------------------------------------------------------------------------------> - - // reuse $callback from #3 - - $method = 'GET'; - $uri = '/user/NaN'; - $handler = 'handler2'; - $argDict = ['name' => 'NaN']; - - $cases[] = [$method, $uri, $callback, $handler, $argDict]; - - // 5 --------------------------------------------------------------------------------------> - - // reuse $callback from #4 - - $method = 'GET'; - $uri = '/user/rdlowrey/12345'; - $handler = 'handler0'; - $argDict = ['name' => 'rdlowrey', 'id' => '12345']; - - $cases[] = [$method, $uri, $callback, $handler, $argDict]; - - // 6 --------------------------------------------------------------------------------------> - - $callback = function(RouteCollector $r) { - $r->addRoute('GET', '/user/{id:[0-9]+}', 'handler0'); - $r->addRoute('GET', '/user/12345/extension', 'handler1'); - $r->addRoute('GET', '/user/{id:[0-9]+}.{extension}', 'handler2'); - - }; - - $method = 'GET'; - $uri = '/user/12345.svg'; - $handler = 'handler2'; - $argDict = ['id' => '12345', 'extension' => 'svg']; - - $cases[] = [$method, $uri, $callback, $handler, $argDict]; - - // 7 ----- Test GET method fallback on HEAD route miss ------------------------------------> - - $callback = function(RouteCollector $r) { - $r->addRoute('GET', '/user/{name}', 'handler0'); - $r->addRoute('GET', '/user/{name}/{id:[0-9]+}', 'handler1'); - $r->addRoute('GET', '/static0', 'handler2'); - $r->addRoute('GET', '/static1', 'handler3'); - $r->addRoute('HEAD', '/static1', 'handler4'); - }; - - $method = 'HEAD'; - $uri = '/user/rdlowrey'; - $handler = 'handler0'; - $argDict = ['name' => 'rdlowrey']; - - $cases[] = [$method, $uri, $callback, $handler, $argDict]; - - // 8 ----- Test GET method fallback on HEAD route miss ------------------------------------> - - // reuse $callback from #7 - - $method = 'HEAD'; - $uri = '/user/rdlowrey/1234'; - $handler = 'handler1'; - $argDict = ['name' => 'rdlowrey', 'id' => '1234']; - - $cases[] = [$method, $uri, $callback, $handler, $argDict]; - - // 9 ----- Test GET method fallback on HEAD route miss ------------------------------------> - - // reuse $callback from #8 - - $method = 'HEAD'; - $uri = '/static0'; - $handler = 'handler2'; - $argDict = []; - - $cases[] = [$method, $uri, $callback, $handler, $argDict]; - - // 10 ---- Test existing HEAD route used if available (no fallback) -----------------------> - - // reuse $callback from #9 - - $method = 'HEAD'; - $uri = '/static1'; - $handler = 'handler4'; - $argDict = []; - - $cases[] = [$method, $uri, $callback, $handler, $argDict]; - - // 11 ---- More specified routes are not shadowed by less specific of another method ------> - - $callback = function(RouteCollector $r) { - $r->addRoute('GET', '/user/{name}', 'handler0'); - $r->addRoute('POST', '/user/{name:[a-z]+}', 'handler1'); - }; - - $method = 'POST'; - $uri = '/user/rdlowrey'; - $handler = 'handler1'; - $argDict = ['name' => 'rdlowrey']; - - $cases[] = [$method, $uri, $callback, $handler, $argDict]; - - // 12 ---- Handler of more specific routes is used, if it occurs first --------------------> - - $callback = function(RouteCollector $r) { - $r->addRoute('GET', '/user/{name}', 'handler0'); - $r->addRoute('POST', '/user/{name:[a-z]+}', 'handler1'); - $r->addRoute('POST', '/user/{name}', 'handler2'); - }; - - $method = 'POST'; - $uri = '/user/rdlowrey'; - $handler = 'handler1'; - $argDict = ['name' => 'rdlowrey']; - - $cases[] = [$method, $uri, $callback, $handler, $argDict]; - - // 13 ---- Route with constant suffix -----------------------------------------------------> - - $callback = function(RouteCollector $r) { - $r->addRoute('GET', '/user/{name}', 'handler0'); - $r->addRoute('GET', '/user/{name}/edit', 'handler1'); - }; - - $method = 'GET'; - $uri = '/user/rdlowrey/edit'; - $handler = 'handler1'; - $argDict = ['name' => 'rdlowrey']; - - $cases[] = [$method, $uri, $callback, $handler, $argDict]; - - // 14 ---- Handle multiple methods with the same handler ----------------------------------> - - $callback = function(RouteCollector $r) { - $r->addRoute(['GET', 'POST'], '/user', 'handlerGetPost'); - $r->addRoute(['DELETE'], '/user', 'handlerDelete'); - $r->addRoute([], '/user', 'handlerNone'); - }; - - $argDict = []; - $cases[] = ['GET', '/user', $callback, 'handlerGetPost', $argDict]; - $cases[] = ['POST', '/user', $callback, 'handlerGetPost', $argDict]; - $cases[] = ['DELETE', '/user', $callback, 'handlerDelete', $argDict]; - - // 15 ---- - - $callback = function(RouteCollector $r) { - $r->addRoute('POST', '/user.json', 'handler0'); - $r->addRoute('GET', '/{entity}.json', 'handler1'); - }; - - $cases[] = ['GET', '/user.json', $callback, 'handler1', ['entity' => 'user']]; - - // 16 ---- - - $callback = function(RouteCollector $r) { - $r->addRoute('GET', '', 'handler0'); - }; - - $cases[] = ['GET', '', $callback, 'handler0', []]; - - // 17 ---- - - $callback = function(RouteCollector $r) { - $r->addRoute('HEAD', '/a/{foo}', 'handler0'); - $r->addRoute('GET', '/b/{foo}', 'handler1'); - }; - - $cases[] = ['HEAD', '/b/bar', $callback, 'handler1', ['foo' => 'bar']]; - - // 18 ---- - - $callback = function(RouteCollector $r) { - $r->addRoute('HEAD', '/a', 'handler0'); - $r->addRoute('GET', '/b', 'handler1'); - }; - - $cases[] = ['HEAD', '/b', $callback, 'handler1', []]; - - // 19 ---- - - $callback = function(RouteCollector $r) { - $r->addRoute('GET', '/foo', 'handler0'); - $r->addRoute('HEAD', '/{bar}', 'handler1'); - }; - - $cases[] = ['HEAD', '/foo', $callback, 'handler1', ['bar' => 'foo']]; - - // 20 ---- - - $callback = function(RouteCollector $r) { - $r->addRoute('*', '/user', 'handler0'); - $r->addRoute('*', '/{user}', 'handler1'); - $r->addRoute('GET', '/user', 'handler2'); - }; - - $cases[] = ['GET', '/user', $callback, 'handler2', []]; - - // 21 ---- - - $callback = function(RouteCollector $r) { - $r->addRoute('*', '/user', 'handler0'); - $r->addRoute('GET', '/user', 'handler1'); - }; - - $cases[] = ['POST', '/user', $callback, 'handler0', []]; - - // 22 ---- - - $cases[] = ['HEAD', '/user', $callback, 'handler1', []]; - - // 23 ---- - - $callback = function(RouteCollector $r) { - $r->addRoute('GET', '/{bar}', 'handler0'); - $r->addRoute('*', '/foo', 'handler1'); - }; - - $cases[] = ['GET', '/foo', $callback, 'handler0', ['bar' => 'foo']]; - - // x --------------------------------------------------------------------------------------> - - return $cases; - } - - public function provideNotFoundDispatchCases() { - $cases = []; - - // 0 --------------------------------------------------------------------------------------> - - $callback = function(RouteCollector $r) { - $r->addRoute('GET', '/resource/123/456', 'handler0'); - }; - - $method = 'GET'; - $uri = '/not-found'; - - $cases[] = [$method, $uri, $callback]; - - // 1 --------------------------------------------------------------------------------------> - - // reuse callback from #0 - $method = 'POST'; - $uri = '/not-found'; - - $cases[] = [$method, $uri, $callback]; - - // 2 --------------------------------------------------------------------------------------> - - // reuse callback from #1 - $method = 'PUT'; - $uri = '/not-found'; - - $cases[] = [$method, $uri, $callback]; - - // 3 --------------------------------------------------------------------------------------> - - $callback = function(RouteCollector $r) { - $r->addRoute('GET', '/handler0', 'handler0'); - $r->addRoute('GET', '/handler1', 'handler1'); - $r->addRoute('GET', '/handler2', 'handler2'); - }; - - $method = 'GET'; - $uri = '/not-found'; - - $cases[] = [$method, $uri, $callback]; - - // 4 --------------------------------------------------------------------------------------> - - $callback = function(RouteCollector $r) { - $r->addRoute('GET', '/user/{name}/{id:[0-9]+}', 'handler0'); - $r->addRoute('GET', '/user/{id:[0-9]+}', 'handler1'); - $r->addRoute('GET', '/user/{name}', 'handler2'); - }; - - $method = 'GET'; - $uri = '/not-found'; - - $cases[] = [$method, $uri, $callback]; - - // 5 --------------------------------------------------------------------------------------> - - // reuse callback from #4 - $method = 'GET'; - $uri = '/user/rdlowrey/12345/not-found'; - - $cases[] = [$method, $uri, $callback]; - - // 6 --------------------------------------------------------------------------------------> - - // reuse callback from #5 - $method = 'HEAD'; - - $cases[] = array($method, $uri, $callback); - - // x --------------------------------------------------------------------------------------> - - return $cases; - } - - public function provideMethodNotAllowedDispatchCases() { - $cases = []; - - // 0 --------------------------------------------------------------------------------------> - - $callback = function(RouteCollector $r) { - $r->addRoute('GET', '/resource/123/456', 'handler0'); - }; - - $method = 'POST'; - $uri = '/resource/123/456'; - $allowedMethods = ['GET']; - - $cases[] = [$method, $uri, $callback, $allowedMethods]; - - // 1 --------------------------------------------------------------------------------------> - - $callback = function(RouteCollector $r) { - $r->addRoute('GET', '/resource/123/456', 'handler0'); - $r->addRoute('POST', '/resource/123/456', 'handler1'); - $r->addRoute('PUT', '/resource/123/456', 'handler2'); - $r->addRoute('*', '/', 'handler3'); - }; - - $method = 'DELETE'; - $uri = '/resource/123/456'; - $allowedMethods = ['GET', 'POST', 'PUT']; - - $cases[] = [$method, $uri, $callback, $allowedMethods]; - - // 2 --------------------------------------------------------------------------------------> - - $callback = function(RouteCollector $r) { - $r->addRoute('GET', '/user/{name}/{id:[0-9]+}', 'handler0'); - $r->addRoute('POST', '/user/{name}/{id:[0-9]+}', 'handler1'); - $r->addRoute('PUT', '/user/{name}/{id:[0-9]+}', 'handler2'); - $r->addRoute('PATCH', '/user/{name}/{id:[0-9]+}', 'handler3'); - }; - - $method = 'DELETE'; - $uri = '/user/rdlowrey/42'; - $allowedMethods = ['GET', 'POST', 'PUT', 'PATCH']; - - $cases[] = [$method, $uri, $callback, $allowedMethods]; - - // 3 --------------------------------------------------------------------------------------> - - $callback = function(RouteCollector $r) { - $r->addRoute('POST', '/user/{name}', 'handler1'); - $r->addRoute('PUT', '/user/{name:[a-z]+}', 'handler2'); - $r->addRoute('PATCH', '/user/{name:[a-z]+}', 'handler3'); - }; - - $method = 'GET'; - $uri = '/user/rdlowrey'; - $allowedMethods = ['POST', 'PUT', 'PATCH']; - - $cases[] = [$method, $uri, $callback, $allowedMethods]; - - // 4 --------------------------------------------------------------------------------------> - - $callback = function(RouteCollector $r) { - $r->addRoute(['GET', 'POST'], '/user', 'handlerGetPost'); - $r->addRoute(['DELETE'], '/user', 'handlerDelete'); - $r->addRoute([], '/user', 'handlerNone'); - }; - - $cases[] = ['PUT', '/user', $callback, ['GET', 'POST', 'DELETE']]; - - // 5 - - $callback = function(RouteCollector $r) { - $r->addRoute('POST', '/user.json', 'handler0'); - $r->addRoute('GET', '/{entity}.json', 'handler1'); - }; - - $cases[] = ['PUT', '/user.json', $callback, ['POST', 'GET']]; - - // x --------------------------------------------------------------------------------------> - - return $cases; - } - -} diff --git a/vendor/nikic/fast-route/test/Dispatcher/GroupCountBasedTest.php b/vendor/nikic/fast-route/test/Dispatcher/GroupCountBasedTest.php deleted file mode 100644 index 74820fc..0000000 --- a/vendor/nikic/fast-route/test/Dispatcher/GroupCountBasedTest.php +++ /dev/null @@ -1,13 +0,0 @@ -<?php - -namespace FastRoute\Dispatcher; - -class GroupCountBasedTest extends DispatcherTest { - protected function getDispatcherClass() { - return 'FastRoute\\Dispatcher\\GroupCountBased'; - } - - protected function getDataGeneratorClass() { - return 'FastRoute\\DataGenerator\\GroupCountBased'; - } -} diff --git a/vendor/nikic/fast-route/test/Dispatcher/GroupPosBasedTest.php b/vendor/nikic/fast-route/test/Dispatcher/GroupPosBasedTest.php deleted file mode 100644 index c3d4f8d..0000000 --- a/vendor/nikic/fast-route/test/Dispatcher/GroupPosBasedTest.php +++ /dev/null @@ -1,13 +0,0 @@ -<?php - -namespace FastRoute\Dispatcher; - -class GroupPosBasedTest extends DispatcherTest { - protected function getDispatcherClass() { - return 'FastRoute\\Dispatcher\\GroupPosBased'; - } - - protected function getDataGeneratorClass() { - return 'FastRoute\\DataGenerator\\GroupPosBased'; - } -} diff --git a/vendor/nikic/fast-route/test/Dispatcher/MarkBasedTest.php b/vendor/nikic/fast-route/test/Dispatcher/MarkBasedTest.php deleted file mode 100644 index 04b0af9..0000000 --- a/vendor/nikic/fast-route/test/Dispatcher/MarkBasedTest.php +++ /dev/null @@ -1,20 +0,0 @@ -<?php - -namespace FastRoute\Dispatcher; - -class MarkBasedTest extends DispatcherTest { - public function setUp() { - preg_match('/(*MARK:A)a/', 'a', $matches); - if (!isset($matches['MARK'])) { - $this->markTestSkipped('PHP 5.6 required for MARK support'); - } - } - - protected function getDispatcherClass() { - return 'FastRoute\\Dispatcher\\MarkBased'; - } - - protected function getDataGeneratorClass() { - return 'FastRoute\\DataGenerator\\MarkBased'; - } -} diff --git a/vendor/nikic/fast-route/test/HackTypechecker/HackTypecheckerTest.php b/vendor/nikic/fast-route/test/HackTypechecker/HackTypecheckerTest.php deleted file mode 100644 index 7bc6ebb..0000000 --- a/vendor/nikic/fast-route/test/HackTypechecker/HackTypecheckerTest.php +++ /dev/null @@ -1,39 +0,0 @@ -<?php - -namespace FastRoute; - -class HackTypecheckerTest extends \PhpUnit_Framework_TestCase { - const SERVER_ALREADY_RUNNING_CODE = 77; - public function testTypechecks($recurse = true) { - if (!defined('HHVM_VERSION')) { - $this->markTestSkipped("HHVM only"); - } - if (!version_compare(HHVM_VERSION, '3.9.0', '>=')) { - $this->markTestSkipped('classname<T> requires HHVM 3.9+'); - } - - // The typechecker recurses the whole tree, so it makes sure - // that everything in fixtures/ is valid when this runs. - - $output = array(); - $exit_code = null; - exec( - 'hh_server --check '.escapeshellarg(__DIR__.'/../../').' 2>&1', - $output, - $exit_code - ); - if ($exit_code === self::SERVER_ALREADY_RUNNING_CODE) { - $this->assertTrue( - $recurse, - "Typechecker still running after running hh_client stop" - ); - // Server already running - 3.10 => 3.11 regression: - // https://github.com/facebook/hhvm/issues/6646 - exec('hh_client stop 2>/dev/null'); - $this->testTypechecks(/* recurse = */ false); - return; - - } - $this->assertSame(0, $exit_code, implode("\n", $output)); - } -} diff --git a/vendor/nikic/fast-route/test/HackTypechecker/fixtures/all_options.php b/vendor/nikic/fast-route/test/HackTypechecker/fixtures/all_options.php deleted file mode 100644 index 05a9af2..0000000 --- a/vendor/nikic/fast-route/test/HackTypechecker/fixtures/all_options.php +++ /dev/null @@ -1,29 +0,0 @@ -<?hh - -namespace FastRoute\TestFixtures; - -function all_options_simple(): \FastRoute\Dispatcher { - return \FastRoute\simpleDispatcher( - $collector ==> {}, - shape( - 'routeParser' => \FastRoute\RouteParser\Std::class, - 'dataGenerator' => \FastRoute\DataGenerator\GroupCountBased::class, - 'dispatcher' => \FastRoute\Dispatcher\GroupCountBased::class, - 'routeCollector' => \FastRoute\RouteCollector::class, - ), - ); -} - -function all_options_cached(): \FastRoute\Dispatcher { - return \FastRoute\cachedDispatcher( - $collector ==> {}, - shape( - 'routeParser' => \FastRoute\RouteParser\Std::class, - 'dataGenerator' => \FastRoute\DataGenerator\GroupCountBased::class, - 'dispatcher' => \FastRoute\Dispatcher\GroupCountBased::class, - 'routeCollector' => \FastRoute\RouteCollector::class, - 'cacheFile' => '/dev/null', - 'cacheDisabled' => false, - ), - ); -} diff --git a/vendor/nikic/fast-route/test/HackTypechecker/fixtures/empty_options.php b/vendor/nikic/fast-route/test/HackTypechecker/fixtures/empty_options.php deleted file mode 100644 index 61eb541..0000000 --- a/vendor/nikic/fast-route/test/HackTypechecker/fixtures/empty_options.php +++ /dev/null @@ -1,11 +0,0 @@ -<?hh - -namespace FastRoute\TestFixtures; - -function empty_options_simple(): \FastRoute\Dispatcher { - return \FastRoute\simpleDispatcher($collector ==> {}, shape()); -} - -function empty_options_cached(): \FastRoute\Dispatcher { - return \FastRoute\cachedDispatcher($collector ==> {}, shape()); -} diff --git a/vendor/nikic/fast-route/test/HackTypechecker/fixtures/no_options.php b/vendor/nikic/fast-route/test/HackTypechecker/fixtures/no_options.php deleted file mode 100644 index 44b5422..0000000 --- a/vendor/nikic/fast-route/test/HackTypechecker/fixtures/no_options.php +++ /dev/null @@ -1,11 +0,0 @@ -<?hh - -namespace FastRoute\TestFixtures; - -function no_options_simple(): \FastRoute\Dispatcher { - return \FastRoute\simpleDispatcher($collector ==> {}); -} - -function no_options_cached(): \FastRoute\Dispatcher { - return \FastRoute\cachedDispatcher($collector ==> {}); -} diff --git a/vendor/nikic/fast-route/test/RouteParser/StdTest.php b/vendor/nikic/fast-route/test/RouteParser/StdTest.php deleted file mode 100644 index 41f194b..0000000 --- a/vendor/nikic/fast-route/test/RouteParser/StdTest.php +++ /dev/null @@ -1,147 +0,0 @@ -<?php - -namespace FastRoute\RouteParser; - -class StdTest extends \PhpUnit_Framework_TestCase { - /** @dataProvider provideTestParse */ - public function testParse($routeString, $expectedRouteDatas) { - $parser = new Std(); - $routeDatas = $parser->parse($routeString); - $this->assertSame($expectedRouteDatas, $routeDatas); - } - - /** @dataProvider provideTestParseError */ - public function testParseError($routeString, $expectedExceptionMessage) { - $parser = new Std(); - $this->setExpectedException('FastRoute\\BadRouteException', $expectedExceptionMessage); - $parser->parse($routeString); - } - - public function provideTestParse() { - return [ - [ - '/test', - [ - ['/test'], - ] - ], - [ - '/test/{param}', - [ - ['/test/', ['param', '[^/]+']], - ] - ], - [ - '/te{ param }st', - [ - ['/te', ['param', '[^/]+'], 'st'] - ] - ], - [ - '/test/{param1}/test2/{param2}', - [ - ['/test/', ['param1', '[^/]+'], '/test2/', ['param2', '[^/]+']] - ] - ], - [ - '/test/{param:\d+}', - [ - ['/test/', ['param', '\d+']] - ] - ], - [ - '/test/{ param : \d{1,9} }', - [ - ['/test/', ['param', '\d{1,9}']] - ] - ], - [ - '/test[opt]', - [ - ['/test'], - ['/testopt'], - ] - ], - [ - '/test[/{param}]', - [ - ['/test'], - ['/test/', ['param', '[^/]+']], - ] - ], - [ - '/{param}[opt]', - [ - ['/', ['param', '[^/]+']], - ['/', ['param', '[^/]+'], 'opt'] - ] - ], - [ - '/test[/{name}[/{id:[0-9]+}]]', - [ - ['/test'], - ['/test/', ['name', '[^/]+']], - ['/test/', ['name', '[^/]+'], '/', ['id', '[0-9]+']], - ] - ], - [ - '', - [ - [''], - ] - ], - [ - '[test]', - [ - [''], - ['test'], - ] - ], - [ - '/{foo-bar}', - [ - ['/', ['foo-bar', '[^/]+']] - ] - ], - [ - '/{_foo:.*}', - [ - ['/', ['_foo', '.*']] - ] - ], - ]; - } - - public function provideTestParseError() { - return [ - [ - '/test[opt', - "Number of opening '[' and closing ']' does not match" - ], - [ - '/test[opt[opt2]', - "Number of opening '[' and closing ']' does not match" - ], - [ - '/testopt]', - "Number of opening '[' and closing ']' does not match" - ], - [ - '/test[]', - "Empty optional part" - ], - [ - '/test[[opt]]', - "Empty optional part" - ], - [ - '[[test]]', - "Empty optional part" - ], - [ - '/test[/opt]/required', - "Optional segments can only occur at the end of a route" - ], - ]; - } -} diff --git a/vendor/nikic/fast-route/test/bootstrap.php b/vendor/nikic/fast-route/test/bootstrap.php deleted file mode 100644 index 27e6d4c..0000000 --- a/vendor/nikic/fast-route/test/bootstrap.php +++ /dev/null @@ -1,11 +0,0 @@ -<?php - -require_once __DIR__ . '/../src/functions.php'; - -spl_autoload_register(function($class) { - if (strpos($class, 'FastRoute\\') === 0) { - $dir = strcasecmp(substr($class, -4), 'Test') ? 'src/' : 'test/'; - $name = substr($class, strlen('FastRoute')); - require __DIR__ . '/../' . $dir . strtr($name, '\\', DIRECTORY_SEPARATOR) . '.php'; - } -}); diff --git a/vendor/pimple/pimple/.gitignore b/vendor/pimple/pimple/.gitignore deleted file mode 100644 index c089b09..0000000 --- a/vendor/pimple/pimple/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -phpunit.xml -composer.lock -/vendor/ diff --git a/vendor/pimple/pimple/.travis.yml b/vendor/pimple/pimple/.travis.yml deleted file mode 100644 index 5f8bb7c..0000000 --- a/vendor/pimple/pimple/.travis.yml +++ /dev/null @@ -1,32 +0,0 @@ -language: php - -env: - matrix: - - PIMPLE_EXT=no - - PIMPLE_EXT=yes - global: - - REPORT_EXIT_STATUS=1 - -php: - - 5.3 - - 5.4 - - 5.5 - - 5.6 - - hhvm - -before_script: - - composer self-update - - COMPOSER_ROOT_VERSION=dev-master composer dump-autoload - - if [ "$PIMPLE_EXT" == "yes" ]; then sh -c "cd ext/pimple && phpize && ./configure && make && sudo make install"; fi - - if [ "$PIMPLE_EXT" == "yes" ]; then echo "extension=pimple.so" >> `php --ini | grep "Loaded Configuration" | sed -e "s|.*:\s*||"`; fi - -script: - - cd ext/pimple - - if [ "$PIMPLE_EXT" == "yes" ]; then yes n | make test | tee output ; grep -E 'Tests failed +. +0' output; fi - - cd ../.. - - phpunit - -matrix: - exclude: - - php: hhvm - env: PIMPLE_EXT=yes diff --git a/vendor/pimple/pimple/CHANGELOG b/vendor/pimple/pimple/CHANGELOG deleted file mode 100644 index cc67997..0000000 --- a/vendor/pimple/pimple/CHANGELOG +++ /dev/null @@ -1,35 +0,0 @@ -* 3.0.2 (2015-09-11) - - * refactored the C extension - * minor non-significant changes - -* 3.0.1 (2015-07-30) - - * simplified some code - * fixed a segfault in the C extension - -* 3.0.0 (2014-07-24) - - * removed the Pimple class alias (use Pimple\Container instead) - -* 2.1.1 (2014-07-24) - - * fixed compiler warnings for the C extension - * fixed code when dealing with circular references - -* 2.1.0 (2014-06-24) - - * moved the Pimple to Pimple\Container (with a BC layer -- Pimple is now a - deprecated alias which will be removed in Pimple 3.0) - * added Pimple\ServiceProviderInterface (and Pimple::register()) - -* 2.0.0 (2014-02-10) - - * changed extend to automatically re-assign the extended service and keep it as shared or factory - (to keep BC, extend still returns the extended service) - * changed services to be shared by default (use factory() for factory - services) - -* 1.0.0 - - * initial version diff --git a/vendor/pimple/pimple/LICENSE b/vendor/pimple/pimple/LICENSE deleted file mode 100644 index d7949e2..0000000 --- a/vendor/pimple/pimple/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2009-2015 Fabien Potencier - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/vendor/pimple/pimple/README.rst b/vendor/pimple/pimple/README.rst deleted file mode 100644 index 93fb35a..0000000 --- a/vendor/pimple/pimple/README.rst +++ /dev/null @@ -1,201 +0,0 @@ -Pimple -====== - -.. caution:: - - This is the documentation for Pimple 3.x. If you are using Pimple 1.x, read - the `Pimple 1.x documentation`_. Reading the Pimple 1.x code is also a good - way to learn more about how to create a simple Dependency Injection - Container (recent versions of Pimple are more focused on performance). - -Pimple is a small Dependency Injection Container for PHP. - -Installation ------------- - -Before using Pimple in your project, add it to your ``composer.json`` file: - -.. code-block:: bash - - $ ./composer.phar require pimple/pimple ~3.0 - -Alternatively, Pimple is also available as a PHP C extension: - -.. code-block:: bash - - $ git clone https://github.com/silexphp/Pimple - $ cd Pimple/ext/pimple - $ phpize - $ ./configure - $ make - $ make install - -Usage ------ - -Creating a container is a matter of creating a ``Container`` instance: - -.. code-block:: php - - use Pimple\Container; - - $container = new Container(); - -As many other dependency injection containers, Pimple manages two different -kind of data: **services** and **parameters**. - -Defining Services -~~~~~~~~~~~~~~~~~ - -A service is an object that does something as part of a larger system. Examples -of services: a database connection, a templating engine, or a mailer. Almost -any **global** object can be a service. - -Services are defined by **anonymous functions** that return an instance of an -object: - -.. code-block:: php - - // define some services - $container['session_storage'] = function ($c) { - return new SessionStorage('SESSION_ID'); - }; - - $container['session'] = function ($c) { - return new Session($c['session_storage']); - }; - -Notice that the anonymous function has access to the current container -instance, allowing references to other services or parameters. - -As objects are only created when you get them, the order of the definitions -does not matter. - -Using the defined services is also very easy: - -.. code-block:: php - - // get the session object - $session = $container['session']; - - // the above call is roughly equivalent to the following code: - // $storage = new SessionStorage('SESSION_ID'); - // $session = new Session($storage); - -Defining Factory Services -~~~~~~~~~~~~~~~~~~~~~~~~~ - -By default, each time you get a service, Pimple returns the **same instance** -of it. If you want a different instance to be returned for all calls, wrap your -anonymous function with the ``factory()`` method - -.. code-block:: php - - $container['session'] = $container->factory(function ($c) { - return new Session($c['session_storage']); - }); - -Now, each call to ``$container['session']`` returns a new instance of the -session. - -Defining Parameters -~~~~~~~~~~~~~~~~~~~ - -Defining a parameter allows to ease the configuration of your container from -the outside and to store global values: - -.. code-block:: php - - // define some parameters - $container['cookie_name'] = 'SESSION_ID'; - $container['session_storage_class'] = 'SessionStorage'; - -If you change the ``session_storage`` service definition like below: - -.. code-block:: php - - $container['session_storage'] = function ($c) { - return new $c['session_storage_class']($c['cookie_name']); - }; - -You can now easily change the cookie name by overriding the -``session_storage_class`` parameter instead of redefining the service -definition. - -Protecting Parameters -~~~~~~~~~~~~~~~~~~~~~ - -Because Pimple sees anonymous functions as service definitions, you need to -wrap anonymous functions with the ``protect()`` method to store them as -parameters: - -.. code-block:: php - - $container['random_func'] = $container->protect(function () { - return rand(); - }); - -Modifying Services after Definition -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -In some cases you may want to modify a service definition after it has been -defined. You can use the ``extend()`` method to define additional code to be -run on your service just after it is created: - -.. code-block:: php - - $container['session_storage'] = function ($c) { - return new $c['session_storage_class']($c['cookie_name']); - }; - - $container->extend('session_storage', function ($storage, $c) { - $storage->...(); - - return $storage; - }); - -The first argument is the name of the service to extend, the second a function -that gets access to the object instance and the container. - -Extending a Container -~~~~~~~~~~~~~~~~~~~~~ - -If you use the same libraries over and over, you might want to reuse some -services from one project to the next one; package your services into a -**provider** by implementing ``Pimple\ServiceProviderInterface``: - -.. code-block:: php - - use Pimple\Container; - - class FooProvider implements Pimple\ServiceProviderInterface - { - public function register(Container $pimple) - { - // register some services and parameters - // on $pimple - } - } - -Then, register the provider on a Container: - -.. code-block:: php - - $pimple->register(new FooProvider()); - -Fetching the Service Creation Function -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -When you access an object, Pimple automatically calls the anonymous function -that you defined, which creates the service object for you. If you want to get -raw access to this function, you can use the ``raw()`` method: - -.. code-block:: php - - $container['session'] = function ($c) { - return new Session($c['session_storage']); - }; - - $sessionFunction = $container->raw('session'); - -.. _Pimple 1.x documentation: https://github.com/silexphp/Pimple/tree/1.1 diff --git a/vendor/pimple/pimple/composer.json b/vendor/pimple/pimple/composer.json deleted file mode 100644 index a5268f1..0000000 --- a/vendor/pimple/pimple/composer.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "name": "pimple/pimple", - "type": "library", - "description": "Pimple, a simple Dependency Injection Container", - "keywords": ["dependency injection", "container"], - "homepage": "http://pimple.sensiolabs.org", - "license": "MIT", - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - } - ], - "require": { - "php": ">=5.3.0" - }, - "autoload": { - "psr-0": { "Pimple": "src/" } - }, - "extra": { - "branch-alias": { - "dev-master": "3.0.x-dev" - } - } -} diff --git a/vendor/pimple/pimple/ext/pimple/.gitignore b/vendor/pimple/pimple/ext/pimple/.gitignore deleted file mode 100644 index 1861088..0000000 --- a/vendor/pimple/pimple/ext/pimple/.gitignore +++ /dev/null @@ -1,30 +0,0 @@ -*.sw* -.deps -Makefile -Makefile.fragments -Makefile.global -Makefile.objects -acinclude.m4 -aclocal.m4 -build/ -config.cache -config.guess -config.h -config.h.in -config.log -config.nice -config.status -config.sub -configure -configure.in -install-sh -libtool -ltmain.sh -missing -mkinstalldirs -run-tests.php -*.loT -.libs/ -modules/ -*.la -*.lo diff --git a/vendor/pimple/pimple/ext/pimple/README.md b/vendor/pimple/pimple/ext/pimple/README.md deleted file mode 100644 index 7b39eb2..0000000 --- a/vendor/pimple/pimple/ext/pimple/README.md +++ /dev/null @@ -1,12 +0,0 @@ -This is Pimple 2 implemented in C - -* PHP >= 5.3 -* Not tested under Windows, might work - -Install -======= - - > phpize - > ./configure - > make - > make install diff --git a/vendor/pimple/pimple/ext/pimple/config.m4 b/vendor/pimple/pimple/ext/pimple/config.m4 deleted file mode 100644 index c9ba17d..0000000 --- a/vendor/pimple/pimple/ext/pimple/config.m4 +++ /dev/null @@ -1,63 +0,0 @@ -dnl $Id$ -dnl config.m4 for extension pimple - -dnl Comments in this file start with the string 'dnl'. -dnl Remove where necessary. This file will not work -dnl without editing. - -dnl If your extension references something external, use with: - -dnl PHP_ARG_WITH(pimple, for pimple support, -dnl Make sure that the comment is aligned: -dnl [ --with-pimple Include pimple support]) - -dnl Otherwise use enable: - -PHP_ARG_ENABLE(pimple, whether to enable pimple support, -dnl Make sure that the comment is aligned: -[ --enable-pimple Enable pimple support]) - -if test "$PHP_PIMPLE" != "no"; then - dnl Write more examples of tests here... - - dnl # --with-pimple -> check with-path - dnl SEARCH_PATH="/usr/local /usr" # you might want to change this - dnl SEARCH_FOR="/include/pimple.h" # you most likely want to change this - dnl if test -r $PHP_PIMPLE/$SEARCH_FOR; then # path given as parameter - dnl PIMPLE_DIR=$PHP_PIMPLE - dnl else # search default path list - dnl AC_MSG_CHECKING([for pimple files in default path]) - dnl for i in $SEARCH_PATH ; do - dnl if test -r $i/$SEARCH_FOR; then - dnl PIMPLE_DIR=$i - dnl AC_MSG_RESULT(found in $i) - dnl fi - dnl done - dnl fi - dnl - dnl if test -z "$PIMPLE_DIR"; then - dnl AC_MSG_RESULT([not found]) - dnl AC_MSG_ERROR([Please reinstall the pimple distribution]) - dnl fi - - dnl # --with-pimple -> add include path - dnl PHP_ADD_INCLUDE($PIMPLE_DIR/include) - - dnl # --with-pimple -> check for lib and symbol presence - dnl LIBNAME=pimple # you may want to change this - dnl LIBSYMBOL=pimple # you most likely want to change this - - dnl PHP_CHECK_LIBRARY($LIBNAME,$LIBSYMBOL, - dnl [ - dnl PHP_ADD_LIBRARY_WITH_PATH($LIBNAME, $PIMPLE_DIR/lib, PIMPLE_SHARED_LIBADD) - dnl AC_DEFINE(HAVE_PIMPLELIB,1,[ ]) - dnl ],[ - dnl AC_MSG_ERROR([wrong pimple lib version or lib not found]) - dnl ],[ - dnl -L$PIMPLE_DIR/lib -lm - dnl ]) - dnl - dnl PHP_SUBST(PIMPLE_SHARED_LIBADD) - - PHP_NEW_EXTENSION(pimple, pimple.c, $ext_shared) -fi diff --git a/vendor/pimple/pimple/ext/pimple/config.w32 b/vendor/pimple/pimple/ext/pimple/config.w32 deleted file mode 100644 index 39857b3..0000000 --- a/vendor/pimple/pimple/ext/pimple/config.w32 +++ /dev/null @@ -1,13 +0,0 @@ -// $Id$ -// vim:ft=javascript - -// If your extension references something external, use ARG_WITH -// ARG_WITH("pimple", "for pimple support", "no"); - -// Otherwise, use ARG_ENABLE -// ARG_ENABLE("pimple", "enable pimple support", "no"); - -if (PHP_PIMPLE != "no") { - EXTENSION("pimple", "pimple.c"); -} - diff --git a/vendor/pimple/pimple/ext/pimple/php_pimple.h b/vendor/pimple/pimple/ext/pimple/php_pimple.h deleted file mode 100644 index 49431f0..0000000 --- a/vendor/pimple/pimple/ext/pimple/php_pimple.h +++ /dev/null @@ -1,121 +0,0 @@ - -/* - * This file is part of Pimple. - * - * Copyright (c) 2014 Fabien Potencier - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is furnished - * to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#ifndef PHP_PIMPLE_H -#define PHP_PIMPLE_H - -extern zend_module_entry pimple_module_entry; -#define phpext_pimple_ptr &pimple_module_entry - -#ifdef PHP_WIN32 -# define PHP_PIMPLE_API __declspec(dllexport) -#elif defined(__GNUC__) && __GNUC__ >= 4 -# define PHP_PIMPLE_API __attribute__ ((visibility("default"))) -#else -# define PHP_PIMPLE_API -#endif - -#ifdef ZTS -#include "TSRM.h" -#endif - -#define PIMPLE_VERSION "3.0.2" -#define PIMPLE_NS "Pimple" - -#define PIMPLE_DEFAULT_ZVAL_CACHE_NUM 5 -#define PIMPLE_DEFAULT_ZVAL_VALUES_NUM 10 - -zend_module_entry *get_module(void); - -PHP_MINIT_FUNCTION(pimple); -PHP_MINFO_FUNCTION(pimple); - -PHP_METHOD(Pimple, __construct); -PHP_METHOD(Pimple, factory); -PHP_METHOD(Pimple, protect); -PHP_METHOD(Pimple, raw); -PHP_METHOD(Pimple, extend); -PHP_METHOD(Pimple, keys); -PHP_METHOD(Pimple, register); -PHP_METHOD(Pimple, offsetSet); -PHP_METHOD(Pimple, offsetUnset); -PHP_METHOD(Pimple, offsetGet); -PHP_METHOD(Pimple, offsetExists); - -PHP_METHOD(PimpleClosure, invoker); - -typedef struct _pimple_bucket_value { - zval *value; /* Must be the first element */ - zval *raw; - zend_object_handle handle_num; - enum { - PIMPLE_IS_PARAM = 0, - PIMPLE_IS_SERVICE = 2 - } type; - zend_bool initialized; - zend_fcall_info_cache fcc; -} pimple_bucket_value; - -typedef struct _pimple_object { - zend_object zobj; - HashTable values; - HashTable factories; - HashTable protected; -} pimple_object; - -typedef struct _pimple_closure_object { - zend_object zobj; - zval *callable; - zval *factory; -} pimple_closure_object; - -static const char sensiolabs_logo[] = "<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHYAAAAUCAMAAABvRTlyAAAAz1BMVEUAAAAAAAAAAAAsThWB5j4AAACD6T8AAACC6D+C6D6C6D+C6D4AAAAAAACC6D4AAAAAAACC6D8AAAAAAAAAAAAAAAAAAAAAAACC6D4AAAAAAAAAAACC6D4AAAAAAAAAAAAAAAAAAAAAAACC6D8AAACC6D4AAAAAAAAAAAAAAAAAAACC6D8AAACC6D6C6D+B6D+C6D+C6D+C6D8AAACC6D6C6D4AAACC6D/K/2KC6D+B6D6C6D6C6D+C6D8sTxUyWRhEeiEAAACC6D+C5z6B6D7drnEVAAAAQXRSTlMAE3oCNSUuDHFHzxaF9UFsu+irX+zlKzYimaJXktyOSFD6BolxqT7QGMMdarMIpuO28r9EolXKgR16OphfXYd4V14GtB4AAAMpSURBVEjHvVSJctowEF1jjME2RziMwUCoMfd9heZqG4n//6buLpJjkmYm03byZmxJa2nf6u2uQcG2bfhqRN4LoTKBzyGDm68M7mAwcOEdjo4zhA/Rf9Go/CVtTgiRhXfIC3EDH8F/eUX1/9KexRo+QgOdtHDsEe/sM7QT32/+K61Z1LFXcXJxN4pTbu1aTQUzuy2PIA0rDo0/0Aa5XFaJvKaVTrubywXvaa1Wq4Vu/Snr3Y7Aojh4VccwykW2N2oQ8wmjyut6+Q1t5ywIG5Npj1sh5E0B7YOzFDjfuRfaOh3O+MbbVNfTWS9COZk3Obd2su5d0a6IU9KLREbw8gEehWSr1r2sPWciXLG38r5NdW0xu9eioU87omjC9yNaMi5GNf6WppVSOqXCFkmCvMB3p9SROLoYQn5pDgQOujA1xjYvqH+plUdkwnmII8VxR/PKYkrfLLomhVlE3b/LhNbNr7hp0H2JaOc4v8dFB58HSsFTSafaqtY1sT3GO8wsy5rhokYPlRJdjPMajyYqTt1EHF/2uqSWQWmAjCUSmQ1MS3g8Btf1XOsy7YIC0CB1b5Xw1Vhba0zbxiCAQLH9TNPmHJXQUtJAN0KcDsoqLxsNvJrJExa7mKIdp2lRE2WexiS4pqWk/0jROlw6K6bV9YOBDGAuqMJ0bnuUKGB0L27bxgRhGEbzihbhxxXaQC88Vkwq8ldCi86RApWUb0Q+4VDosBCc+1s81lUdnBavH4Zp2mm3O44USwOfvSo9oBiwpFg71lMS1VKJLKljS3j9p+fOTvXXlsSNuEv6YPaZda9uRope0VJfKdo7fPiYfSmvFjXQbkhY0d9hCbBWIktRgEDieDhf1N3wbbkmNNgRy8hyl620yGQat/grV3HMpc2HDKTVmOPFz6ylPCKt/nXcAyV260jaAowwIW0YuBzrOgb/KrddZS9OmJaLgpWK4JX2DDuklcLZSDGcn8Vmx9YDNvT6UsjyBApRyFQVX7Vxm9TGxE16nmfRd8/zQoDmggQOTRh5Hv8pMt9Q/L2JmSwkMCE7dA4BuDjHJwfu0Om4QAhOjrN5XkIatglfiN/bUPdCQFjTYgAAAABJRU5ErkJggg==\">"; - -static int pimple_zval_to_pimpleval(zval *_zval, pimple_bucket_value *_pimple_bucket_value TSRMLS_DC); -static int pimple_zval_is_valid_callback(zval *_zval, pimple_bucket_value *_pimple_bucket_value TSRMLS_DC); - -static void pimple_bucket_dtor(pimple_bucket_value *bucket); -static void pimple_free_bucket(pimple_bucket_value *bucket); - -static zval *pimple_object_read_dimension(zval *object, zval *offset, int type TSRMLS_DC); -static void pimple_object_write_dimension(zval *object, zval *offset, zval *value TSRMLS_DC); -static int pimple_object_has_dimension(zval *object, zval *offset, int check_empty TSRMLS_DC); -static void pimple_object_unset_dimension(zval *object, zval *offset TSRMLS_DC); -static zend_object_value pimple_object_create(zend_class_entry *ce TSRMLS_DC); -static void pimple_free_object_storage(pimple_object *obj TSRMLS_DC); - -static void pimple_closure_free_object_storage(pimple_closure_object *obj TSRMLS_DC); -static zend_object_value pimple_closure_object_create(zend_class_entry *ce TSRMLS_DC); -static zend_function *pimple_closure_get_constructor(zval * TSRMLS_DC); -static int pimple_closure_get_closure(zval *obj, zend_class_entry **ce_ptr, union _zend_function **fptr_ptr, zval **zobj_ptr TSRMLS_DC); - -#ifdef ZTS -#define PIMPLE_G(v) TSRMG(pimple_globals_id, zend_pimple_globals *, v) -#else -#define PIMPLE_G(v) (pimple_globals.v) -#endif - -#endif /* PHP_PIMPLE_H */ - diff --git a/vendor/pimple/pimple/ext/pimple/pimple.c b/vendor/pimple/pimple/ext/pimple/pimple.c deleted file mode 100644 index 239c01d..0000000 --- a/vendor/pimple/pimple/ext/pimple/pimple.c +++ /dev/null @@ -1,922 +0,0 @@ - -/* - * This file is part of Pimple. - * - * Copyright (c) 2014 Fabien Potencier - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is furnished - * to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "php.h" -#include "php_ini.h" -#include "ext/standard/info.h" -#include "php_pimple.h" -#include "pimple_compat.h" -#include "zend_interfaces.h" -#include "zend.h" -#include "Zend/zend_closures.h" -#include "ext/spl/spl_exceptions.h" -#include "Zend/zend_exceptions.h" -#include "main/php_output.h" -#include "SAPI.h" - -static zend_class_entry *pimple_ce; -static zend_object_handlers pimple_object_handlers; -static zend_class_entry *pimple_closure_ce; -static zend_class_entry *pimple_serviceprovider_ce; -static zend_object_handlers pimple_closure_object_handlers; -static zend_internal_function pimple_closure_invoker_function; - -#define FETCH_DIM_HANDLERS_VARS pimple_object *pimple_obj = NULL; \ - ulong index; \ - pimple_obj = (pimple_object *)zend_object_store_get_object(object TSRMLS_CC); \ - -#define PIMPLE_OBJECT_HANDLE_INHERITANCE_OBJECT_HANDLERS do { \ - if (ce != pimple_ce) { \ - zend_hash_find(&ce->function_table, ZEND_STRS("offsetget"), (void **)&function); \ - if (function->common.scope != ce) { /* if the function is not defined in this actual class */ \ - pimple_object_handlers.read_dimension = pimple_object_read_dimension; /* then overwrite the handler to use custom one */ \ - } \ - zend_hash_find(&ce->function_table, ZEND_STRS("offsetset"), (void **)&function); \ - if (function->common.scope != ce) { \ - pimple_object_handlers.write_dimension = pimple_object_write_dimension; \ - } \ - zend_hash_find(&ce->function_table, ZEND_STRS("offsetexists"), (void **)&function); \ - if (function->common.scope != ce) { \ - pimple_object_handlers.has_dimension = pimple_object_has_dimension; \ - } \ - zend_hash_find(&ce->function_table, ZEND_STRS("offsetunset"), (void **)&function); \ - if (function->common.scope != ce) { \ - pimple_object_handlers.unset_dimension = pimple_object_unset_dimension; \ - } \ - } else { \ - pimple_object_handlers.read_dimension = pimple_object_read_dimension; \ - pimple_object_handlers.write_dimension = pimple_object_write_dimension; \ - pimple_object_handlers.has_dimension = pimple_object_has_dimension; \ - pimple_object_handlers.unset_dimension = pimple_object_unset_dimension; \ - }\ - } while(0); - -#define PIMPLE_CALL_CB do { \ - zend_fcall_info_argn(&fci TSRMLS_CC, 1, &object); \ - fci.size = sizeof(fci); \ - fci.object_ptr = retval->fcc.object_ptr; \ - fci.function_name = retval->value; \ - fci.no_separation = 1; \ - fci.retval_ptr_ptr = &retval_ptr_ptr; \ -\ - zend_call_function(&fci, &retval->fcc TSRMLS_CC); \ - efree(fci.params); \ - if (EG(exception)) { \ - return EG(uninitialized_zval_ptr); \ - } \ - } while(0); - -ZEND_BEGIN_ARG_INFO_EX(arginfo___construct, 0, 0, 0) -ZEND_ARG_ARRAY_INFO(0, value, 0) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_offsetset, 0, 0, 2) -ZEND_ARG_INFO(0, offset) -ZEND_ARG_INFO(0, value) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_offsetget, 0, 0, 1) -ZEND_ARG_INFO(0, offset) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_offsetexists, 0, 0, 1) -ZEND_ARG_INFO(0, offset) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_offsetunset, 0, 0, 1) -ZEND_ARG_INFO(0, offset) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_factory, 0, 0, 1) -ZEND_ARG_INFO(0, callable) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_protect, 0, 0, 1) -ZEND_ARG_INFO(0, callable) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_raw, 0, 0, 1) -ZEND_ARG_INFO(0, id) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_extend, 0, 0, 2) -ZEND_ARG_INFO(0, id) -ZEND_ARG_INFO(0, callable) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_keys, 0, 0, 0) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_register, 0, 0, 1) -ZEND_ARG_OBJ_INFO(0, provider, Pimple\\ServiceProviderInterface, 0) -ZEND_ARG_ARRAY_INFO(0, values, 1) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_serviceprovider_register, 0, 0, 1) -ZEND_ARG_OBJ_INFO(0, pimple, Pimple\\Container, 0) -ZEND_END_ARG_INFO() - -static const zend_function_entry pimple_ce_functions[] = { - PHP_ME(Pimple, __construct, arginfo___construct, ZEND_ACC_PUBLIC) - PHP_ME(Pimple, factory, arginfo_factory, ZEND_ACC_PUBLIC) - PHP_ME(Pimple, protect, arginfo_protect, ZEND_ACC_PUBLIC) - PHP_ME(Pimple, raw, arginfo_raw, ZEND_ACC_PUBLIC) - PHP_ME(Pimple, extend, arginfo_extend, ZEND_ACC_PUBLIC) - PHP_ME(Pimple, keys, arginfo_keys, ZEND_ACC_PUBLIC) - PHP_ME(Pimple, register, arginfo_register, ZEND_ACC_PUBLIC) - - PHP_ME(Pimple, offsetSet, arginfo_offsetset, ZEND_ACC_PUBLIC) - PHP_ME(Pimple, offsetGet, arginfo_offsetget, ZEND_ACC_PUBLIC) - PHP_ME(Pimple, offsetExists, arginfo_offsetexists, ZEND_ACC_PUBLIC) - PHP_ME(Pimple, offsetUnset, arginfo_offsetunset, ZEND_ACC_PUBLIC) - PHP_FE_END -}; - -static const zend_function_entry pimple_serviceprovider_iface_ce_functions[] = { - PHP_ABSTRACT_ME(ServiceProviderInterface, register, arginfo_serviceprovider_register) - PHP_FE_END -}; - -static void pimple_closure_free_object_storage(pimple_closure_object *obj TSRMLS_DC) -{ - zend_object_std_dtor(&obj->zobj TSRMLS_CC); - if (obj->factory) { - zval_ptr_dtor(&obj->factory); - } - if (obj->callable) { - zval_ptr_dtor(&obj->callable); - } - efree(obj); -} - -static void pimple_free_object_storage(pimple_object *obj TSRMLS_DC) -{ - zend_hash_destroy(&obj->factories); - zend_hash_destroy(&obj->protected); - zend_hash_destroy(&obj->values); - zend_object_std_dtor(&obj->zobj TSRMLS_CC); - efree(obj); -} - -static void pimple_free_bucket(pimple_bucket_value *bucket) -{ - if (bucket->raw) { - zval_ptr_dtor(&bucket->raw); - } -} - -static zend_object_value pimple_closure_object_create(zend_class_entry *ce TSRMLS_DC) -{ - zend_object_value retval; - pimple_closure_object *pimple_closure_obj = NULL; - - pimple_closure_obj = ecalloc(1, sizeof(pimple_closure_object)); - ZEND_OBJ_INIT(&pimple_closure_obj->zobj, ce); - - pimple_closure_object_handlers.get_constructor = pimple_closure_get_constructor; - retval.handlers = &pimple_closure_object_handlers; - retval.handle = zend_objects_store_put(pimple_closure_obj, (zend_objects_store_dtor_t) zend_objects_destroy_object, (zend_objects_free_object_storage_t) pimple_closure_free_object_storage, NULL TSRMLS_CC); - - return retval; -} - -static zend_function *pimple_closure_get_constructor(zval *obj TSRMLS_DC) -{ - zend_error(E_ERROR, "Pimple\\ContainerClosure is an internal class and cannot be instantiated"); - - return NULL; -} - -static int pimple_closure_get_closure(zval *obj, zend_class_entry **ce_ptr, union _zend_function **fptr_ptr, zval **zobj_ptr TSRMLS_DC) -{ - *zobj_ptr = obj; - *ce_ptr = Z_OBJCE_P(obj); - *fptr_ptr = (zend_function *)&pimple_closure_invoker_function; - - return SUCCESS; -} - -static zend_object_value pimple_object_create(zend_class_entry *ce TSRMLS_DC) -{ - zend_object_value retval; - pimple_object *pimple_obj = NULL; - zend_function *function = NULL; - - pimple_obj = emalloc(sizeof(pimple_object)); - ZEND_OBJ_INIT(&pimple_obj->zobj, ce); - - PIMPLE_OBJECT_HANDLE_INHERITANCE_OBJECT_HANDLERS - - retval.handlers = &pimple_object_handlers; - retval.handle = zend_objects_store_put(pimple_obj, (zend_objects_store_dtor_t) zend_objects_destroy_object, (zend_objects_free_object_storage_t) pimple_free_object_storage, NULL TSRMLS_CC); - - zend_hash_init(&pimple_obj->factories, PIMPLE_DEFAULT_ZVAL_CACHE_NUM, NULL, (dtor_func_t)pimple_bucket_dtor, 0); - zend_hash_init(&pimple_obj->protected, PIMPLE_DEFAULT_ZVAL_CACHE_NUM, NULL, (dtor_func_t)pimple_bucket_dtor, 0); - zend_hash_init(&pimple_obj->values, PIMPLE_DEFAULT_ZVAL_VALUES_NUM, NULL, (dtor_func_t)pimple_bucket_dtor, 0); - - return retval; -} - -static void pimple_object_write_dimension(zval *object, zval *offset, zval *value TSRMLS_DC) -{ - FETCH_DIM_HANDLERS_VARS - - pimple_bucket_value pimple_value = {0}, *found_value = NULL; - ulong hash; - - pimple_zval_to_pimpleval(value, &pimple_value TSRMLS_CC); - - if (!offset) {/* $p[] = 'foo' when not overloaded */ - zend_hash_next_index_insert(&pimple_obj->values, (void *)&pimple_value, sizeof(pimple_bucket_value), NULL); - Z_ADDREF_P(value); - return; - } - - switch (Z_TYPE_P(offset)) { - case IS_STRING: - hash = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); - zend_hash_quick_find(&pimple_obj->values, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hash, (void **)&found_value); - if (found_value && found_value->type == PIMPLE_IS_SERVICE && found_value->initialized == 1) { - pimple_free_bucket(&pimple_value); - zend_throw_exception_ex(spl_ce_RuntimeException, 0 TSRMLS_CC, "Cannot override frozen service \"%s\".", Z_STRVAL_P(offset)); - return; - } - if (zend_hash_quick_update(&pimple_obj->values, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hash, (void *)&pimple_value, sizeof(pimple_bucket_value), NULL) == FAILURE) { - pimple_free_bucket(&pimple_value); - return; - } - Z_ADDREF_P(value); - break; - case IS_DOUBLE: - case IS_BOOL: - case IS_LONG: - if (Z_TYPE_P(offset) == IS_DOUBLE) { - index = (ulong)Z_DVAL_P(offset); - } else { - index = Z_LVAL_P(offset); - } - zend_hash_index_find(&pimple_obj->values, index, (void **)&found_value); - if (found_value && found_value->type == PIMPLE_IS_SERVICE && found_value->initialized == 1) { - pimple_free_bucket(&pimple_value); - zend_throw_exception_ex(spl_ce_RuntimeException, 0 TSRMLS_CC, "Cannot override frozen service \"%ld\".", index); - return; - } - if (zend_hash_index_update(&pimple_obj->values, index, (void *)&pimple_value, sizeof(pimple_bucket_value), NULL) == FAILURE) { - pimple_free_bucket(&pimple_value); - return; - } - Z_ADDREF_P(value); - break; - case IS_NULL: /* $p[] = 'foo' when overloaded */ - zend_hash_next_index_insert(&pimple_obj->values, (void *)&pimple_value, sizeof(pimple_bucket_value), NULL); - Z_ADDREF_P(value); - break; - default: - pimple_free_bucket(&pimple_value); - zend_error(E_WARNING, "Unsupported offset type"); - } -} - -static void pimple_object_unset_dimension(zval *object, zval *offset TSRMLS_DC) -{ - FETCH_DIM_HANDLERS_VARS - - switch (Z_TYPE_P(offset)) { - case IS_STRING: - zend_symtable_del(&pimple_obj->values, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); - zend_symtable_del(&pimple_obj->factories, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); - zend_symtable_del(&pimple_obj->protected, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); - break; - case IS_DOUBLE: - case IS_BOOL: - case IS_LONG: - if (Z_TYPE_P(offset) == IS_DOUBLE) { - index = (ulong)Z_DVAL_P(offset); - } else { - index = Z_LVAL_P(offset); - } - zend_hash_index_del(&pimple_obj->values, index); - zend_hash_index_del(&pimple_obj->factories, index); - zend_hash_index_del(&pimple_obj->protected, index); - break; - default: - zend_error(E_WARNING, "Unsupported offset type"); - } -} - -static int pimple_object_has_dimension(zval *object, zval *offset, int check_empty TSRMLS_DC) -{ - FETCH_DIM_HANDLERS_VARS - - pimple_bucket_value *retval = NULL; - - switch (Z_TYPE_P(offset)) { - case IS_STRING: - if (zend_symtable_find(&pimple_obj->values, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, (void **)&retval) == SUCCESS) { - switch (check_empty) { - case 0: /* isset */ - return 1; /* Differs from PHP behavior (Z_TYPE_P(retval->value) != IS_NULL;) */ - case 1: /* empty */ - default: - return zend_is_true(retval->value); - } - } - return 0; - break; - case IS_DOUBLE: - case IS_BOOL: - case IS_LONG: - if (Z_TYPE_P(offset) == IS_DOUBLE) { - index = (ulong)Z_DVAL_P(offset); - } else { - index = Z_LVAL_P(offset); - } - if (zend_hash_index_find(&pimple_obj->values, index, (void **)&retval) == SUCCESS) { - switch (check_empty) { - case 0: /* isset */ - return 1; /* Differs from PHP behavior (Z_TYPE_P(retval->value) != IS_NULL;)*/ - case 1: /* empty */ - default: - return zend_is_true(retval->value); - } - } - return 0; - break; - default: - zend_error(E_WARNING, "Unsupported offset type"); - return 0; - } -} - -static zval *pimple_object_read_dimension(zval *object, zval *offset, int type TSRMLS_DC) -{ - FETCH_DIM_HANDLERS_VARS - - pimple_bucket_value *retval = NULL; - zend_fcall_info fci = {0}; - zval *retval_ptr_ptr = NULL; - - switch (Z_TYPE_P(offset)) { - case IS_STRING: - if (zend_symtable_find(&pimple_obj->values, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, (void **)&retval) == FAILURE) { - zend_throw_exception_ex(spl_ce_InvalidArgumentException, 0 TSRMLS_CC, "Identifier \"%s\" is not defined.", Z_STRVAL_P(offset)); - return EG(uninitialized_zval_ptr); - } - break; - case IS_DOUBLE: - case IS_BOOL: - case IS_LONG: - if (Z_TYPE_P(offset) == IS_DOUBLE) { - index = (ulong)Z_DVAL_P(offset); - } else { - index = Z_LVAL_P(offset); - } - if (zend_hash_index_find(&pimple_obj->values, index, (void **)&retval) == FAILURE) { - return EG(uninitialized_zval_ptr); - } - break; - case IS_NULL: /* $p[][3] = 'foo' first dim access */ - return EG(uninitialized_zval_ptr); - break; - default: - zend_error(E_WARNING, "Unsupported offset type"); - return EG(uninitialized_zval_ptr); - } - - if(retval->type == PIMPLE_IS_PARAM) { - return retval->value; - } - - if (zend_hash_index_exists(&pimple_obj->protected, retval->handle_num)) { - /* Service is protected, return the value every time */ - return retval->value; - } - - if (zend_hash_index_exists(&pimple_obj->factories, retval->handle_num)) { - /* Service is a factory, call it everytime and never cache its result */ - PIMPLE_CALL_CB - Z_DELREF_P(retval_ptr_ptr); /* fetch dim addr will increment refcount */ - return retval_ptr_ptr; - } - - if (retval->initialized == 1) { - /* Service has already been called, return its cached value */ - return retval->value; - } - - ALLOC_INIT_ZVAL(retval->raw); - MAKE_COPY_ZVAL(&retval->value, retval->raw); - - PIMPLE_CALL_CB - - retval->initialized = 1; - zval_ptr_dtor(&retval->value); - retval->value = retval_ptr_ptr; - - return retval->value; -} - -static int pimple_zval_is_valid_callback(zval *_zval, pimple_bucket_value *_pimple_bucket_value TSRMLS_DC) -{ - if (Z_TYPE_P(_zval) != IS_OBJECT) { - return FAILURE; - } - - if (_pimple_bucket_value->fcc.called_scope) { - return SUCCESS; - } - - if (Z_OBJ_HANDLER_P(_zval, get_closure) && Z_OBJ_HANDLER_P(_zval, get_closure)(_zval, &_pimple_bucket_value->fcc.calling_scope, &_pimple_bucket_value->fcc.function_handler, &_pimple_bucket_value->fcc.object_ptr TSRMLS_CC) == SUCCESS) { - _pimple_bucket_value->fcc.called_scope = _pimple_bucket_value->fcc.calling_scope; - return SUCCESS; - } else { - return FAILURE; - } -} - -static int pimple_zval_to_pimpleval(zval *_zval, pimple_bucket_value *_pimple_bucket_value TSRMLS_DC) -{ - _pimple_bucket_value->value = _zval; - - if (Z_TYPE_P(_zval) != IS_OBJECT) { - return PIMPLE_IS_PARAM; - } - - if (pimple_zval_is_valid_callback(_zval, _pimple_bucket_value TSRMLS_CC) == SUCCESS) { - _pimple_bucket_value->type = PIMPLE_IS_SERVICE; - _pimple_bucket_value->handle_num = Z_OBJ_HANDLE_P(_zval); - } - - return PIMPLE_IS_SERVICE; -} - -static void pimple_bucket_dtor(pimple_bucket_value *bucket) -{ - zval_ptr_dtor(&bucket->value); - pimple_free_bucket(bucket); -} - -PHP_METHOD(Pimple, protect) -{ - zval *protected = NULL; - pimple_object *pobj = NULL; - pimple_bucket_value bucket = {0}; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &protected) == FAILURE) { - return; - } - - if (pimple_zval_is_valid_callback(protected, &bucket TSRMLS_CC) == FAILURE) { - pimple_free_bucket(&bucket); - zend_throw_exception(spl_ce_InvalidArgumentException, "Callable is not a Closure or invokable object.", 0 TSRMLS_CC); - return; - } - - pimple_zval_to_pimpleval(protected, &bucket TSRMLS_CC); - pobj = (pimple_object *)zend_object_store_get_object(getThis() TSRMLS_CC); - - if (zend_hash_index_update(&pobj->protected, bucket.handle_num, (void *)&bucket, sizeof(pimple_bucket_value), NULL) == SUCCESS) { - Z_ADDREF_P(protected); - RETURN_ZVAL(protected, 1 , 0); - } else { - pimple_free_bucket(&bucket); - } - RETURN_FALSE; -} - -PHP_METHOD(Pimple, raw) -{ - zval *offset = NULL; - pimple_object *pobj = NULL; - pimple_bucket_value *value = NULL; - ulong index; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &offset) == FAILURE) { - return; - } - - pobj = zend_object_store_get_object(getThis() TSRMLS_CC); - - switch (Z_TYPE_P(offset)) { - case IS_STRING: - if (zend_symtable_find(&pobj->values, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, (void *)&value) == FAILURE) { - zend_throw_exception_ex(spl_ce_InvalidArgumentException, 0 TSRMLS_CC, "Identifier \"%s\" is not defined.", Z_STRVAL_P(offset)); - RETURN_NULL(); - } - break; - case IS_DOUBLE: - case IS_BOOL: - case IS_LONG: - if (Z_TYPE_P(offset) == IS_DOUBLE) { - index = (ulong)Z_DVAL_P(offset); - } else { - index = Z_LVAL_P(offset); - } - if (zend_hash_index_find(&pobj->values, index, (void *)&value) == FAILURE) { - RETURN_NULL(); - } - break; - case IS_NULL: - default: - zend_error(E_WARNING, "Unsupported offset type"); - } - - if (value->raw) { - RETVAL_ZVAL(value->raw, 1, 0); - } else { - RETVAL_ZVAL(value->value, 1, 0); - } -} - -PHP_METHOD(Pimple, extend) -{ - zval *offset = NULL, *callable = NULL, *pimple_closure_obj = NULL; - pimple_bucket_value bucket = {0}, *value = NULL; - pimple_object *pobj = NULL; - pimple_closure_object *pcobj = NULL; - ulong index; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zz", &offset, &callable) == FAILURE) { - return; - } - - pobj = zend_object_store_get_object(getThis() TSRMLS_CC); - - switch (Z_TYPE_P(offset)) { - case IS_STRING: - if (zend_symtable_find(&pobj->values, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, (void *)&value) == FAILURE) { - zend_throw_exception_ex(spl_ce_InvalidArgumentException, 0 TSRMLS_CC, "Identifier \"%s\" is not defined.", Z_STRVAL_P(offset)); - RETURN_NULL(); - } - if (value->type != PIMPLE_IS_SERVICE) { - zend_throw_exception_ex(spl_ce_InvalidArgumentException, 0 TSRMLS_CC, "Identifier \"%s\" does not contain an object definition.", Z_STRVAL_P(offset)); - RETURN_NULL(); - } - break; - case IS_DOUBLE: - case IS_BOOL: - case IS_LONG: - if (Z_TYPE_P(offset) == IS_DOUBLE) { - index = (ulong)Z_DVAL_P(offset); - } else { - index = Z_LVAL_P(offset); - } - if (zend_hash_index_find(&pobj->values, index, (void *)&value) == FAILURE) { - zend_throw_exception_ex(spl_ce_InvalidArgumentException, 0 TSRMLS_CC, "Identifier \"%ld\" is not defined.", index); - RETURN_NULL(); - } - if (value->type != PIMPLE_IS_SERVICE) { - zend_throw_exception_ex(spl_ce_InvalidArgumentException, 0 TSRMLS_CC, "Identifier \"%ld\" does not contain an object definition.", index); - RETURN_NULL(); - } - break; - case IS_NULL: - default: - zend_error(E_WARNING, "Unsupported offset type"); - } - - if (pimple_zval_is_valid_callback(callable, &bucket TSRMLS_CC) == FAILURE) { - pimple_free_bucket(&bucket); - zend_throw_exception(spl_ce_InvalidArgumentException, "Extension service definition is not a Closure or invokable object.", 0 TSRMLS_CC); - RETURN_NULL(); - } - pimple_free_bucket(&bucket); - - ALLOC_INIT_ZVAL(pimple_closure_obj); - object_init_ex(pimple_closure_obj, pimple_closure_ce); - - pcobj = zend_object_store_get_object(pimple_closure_obj TSRMLS_CC); - pcobj->callable = callable; - pcobj->factory = value->value; - Z_ADDREF_P(callable); - Z_ADDREF_P(value->value); - - if (zend_hash_index_exists(&pobj->factories, value->handle_num)) { - pimple_zval_to_pimpleval(pimple_closure_obj, &bucket TSRMLS_CC); - zend_hash_index_del(&pobj->factories, value->handle_num); - zend_hash_index_update(&pobj->factories, bucket.handle_num, (void *)&bucket, sizeof(pimple_bucket_value), NULL); - Z_ADDREF_P(pimple_closure_obj); - } - - pimple_object_write_dimension(getThis(), offset, pimple_closure_obj TSRMLS_CC); - - RETVAL_ZVAL(pimple_closure_obj, 1, 1); -} - -PHP_METHOD(Pimple, keys) -{ - HashPosition pos; - pimple_object *pobj = NULL; - zval **value = NULL; - zval *endval = NULL; - char *str_index = NULL; - int str_len; - ulong num_index; - - if (zend_parse_parameters_none() == FAILURE) { - return; - } - - pobj = zend_object_store_get_object(getThis() TSRMLS_CC); - array_init_size(return_value, zend_hash_num_elements(&pobj->values)); - - zend_hash_internal_pointer_reset_ex(&pobj->values, &pos); - - while(zend_hash_get_current_data_ex(&pobj->values, (void **)&value, &pos) == SUCCESS) { - MAKE_STD_ZVAL(endval); - switch (zend_hash_get_current_key_ex(&pobj->values, &str_index, (uint *)&str_len, &num_index, 0, &pos)) { - case HASH_KEY_IS_STRING: - ZVAL_STRINGL(endval, str_index, str_len - 1, 1); - zend_hash_next_index_insert(Z_ARRVAL_P(return_value), &endval, sizeof(zval *), NULL); - break; - case HASH_KEY_IS_LONG: - ZVAL_LONG(endval, num_index); - zend_hash_next_index_insert(Z_ARRVAL_P(return_value), &endval, sizeof(zval *), NULL); - break; - } - zend_hash_move_forward_ex(&pobj->values, &pos); - } -} - -PHP_METHOD(Pimple, factory) -{ - zval *factory = NULL; - pimple_object *pobj = NULL; - pimple_bucket_value bucket = {0}; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &factory) == FAILURE) { - return; - } - - if (pimple_zval_is_valid_callback(factory, &bucket TSRMLS_CC) == FAILURE) { - pimple_free_bucket(&bucket); - zend_throw_exception(spl_ce_InvalidArgumentException, "Service definition is not a Closure or invokable object.", 0 TSRMLS_CC); - return; - } - - pimple_zval_to_pimpleval(factory, &bucket TSRMLS_CC); - pobj = (pimple_object *)zend_object_store_get_object(getThis() TSRMLS_CC); - - if (zend_hash_index_update(&pobj->factories, bucket.handle_num, (void *)&bucket, sizeof(pimple_bucket_value), NULL) == SUCCESS) { - Z_ADDREF_P(factory); - RETURN_ZVAL(factory, 1 , 0); - } else { - pimple_free_bucket(&bucket); - } - - RETURN_FALSE; -} - -PHP_METHOD(Pimple, offsetSet) -{ - zval *offset = NULL, *value = NULL; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zz", &offset, &value) == FAILURE) { - return; - } - - pimple_object_write_dimension(getThis(), offset, value TSRMLS_CC); -} - -PHP_METHOD(Pimple, offsetGet) -{ - zval *offset = NULL, *retval = NULL; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &offset) == FAILURE) { - return; - } - - retval = pimple_object_read_dimension(getThis(), offset, 0 TSRMLS_CC); - - RETVAL_ZVAL(retval, 1, 0); -} - -PHP_METHOD(Pimple, offsetUnset) -{ - zval *offset = NULL; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &offset) == FAILURE) { - return; - } - - pimple_object_unset_dimension(getThis(), offset TSRMLS_CC); -} - -PHP_METHOD(Pimple, offsetExists) -{ - zval *offset = NULL; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &offset) == FAILURE) { - return; - } - - RETVAL_BOOL(pimple_object_has_dimension(getThis(), offset, 1 TSRMLS_CC)); -} - -PHP_METHOD(Pimple, register) -{ - zval *provider; - zval **data; - zval *retval = NULL; - zval key; - - HashTable *array = NULL; - HashPosition pos; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O|h", &provider, pimple_serviceprovider_ce, &array) == FAILURE) { - return; - } - - RETVAL_ZVAL(getThis(), 1, 0); - - zend_call_method_with_1_params(&provider, Z_OBJCE_P(provider), NULL, "register", &retval, getThis()); - - if (retval) { - zval_ptr_dtor(&retval); - } - - if (!array) { - return; - } - - zend_hash_internal_pointer_reset_ex(array, &pos); - - while(zend_hash_get_current_data_ex(array, (void **)&data, &pos) == SUCCESS) { - zend_hash_get_current_key_zval_ex(array, &key, &pos); - pimple_object_write_dimension(getThis(), &key, *data TSRMLS_CC); - zend_hash_move_forward_ex(array, &pos); - } -} - -PHP_METHOD(Pimple, __construct) -{ - zval *values = NULL, **pData = NULL, offset; - HashPosition pos; - char *str_index = NULL; - zend_uint str_length; - ulong num_index; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|a!", &values) == FAILURE || !values) { - return; - } - - zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(values), &pos); - while (zend_hash_has_more_elements_ex(Z_ARRVAL_P(values), &pos) == SUCCESS) { - zend_hash_get_current_data_ex(Z_ARRVAL_P(values), (void **)&pData, &pos); - zend_hash_get_current_key_ex(Z_ARRVAL_P(values), &str_index, &str_length, &num_index, 0, &pos); - INIT_ZVAL(offset); - if (zend_hash_get_current_key_type_ex(Z_ARRVAL_P(values), &pos) == HASH_KEY_IS_LONG) { - ZVAL_LONG(&offset, num_index); - } else { - ZVAL_STRINGL(&offset, str_index, (str_length - 1), 0); - } - pimple_object_write_dimension(getThis(), &offset, *pData TSRMLS_CC); - zend_hash_move_forward_ex(Z_ARRVAL_P(values), &pos); - } -} - -/* - * This is PHP code snippet handling extend()s calls : - - $extended = function ($c) use ($callable, $factory) { - return $callable($factory($c), $c); - }; - - */ -PHP_METHOD(PimpleClosure, invoker) -{ - pimple_closure_object *pcobj = NULL; - zval *arg = NULL, *retval = NULL, *newretval = NULL; - zend_fcall_info fci = {0}; - zval **args[2]; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &arg) == FAILURE) { - return; - } - - pcobj = zend_object_store_get_object(getThis() TSRMLS_CC); - - fci.function_name = pcobj->factory; - args[0] = &arg; - zend_fcall_info_argp(&fci TSRMLS_CC, 1, args); - fci.retval_ptr_ptr = &retval; - fci.size = sizeof(fci); - - if (zend_call_function(&fci, NULL TSRMLS_CC) == FAILURE || EG(exception)) { - efree(fci.params); - return; /* Should here return default zval */ - } - - efree(fci.params); - memset(&fci, 0, sizeof(fci)); - fci.size = sizeof(fci); - - fci.function_name = pcobj->callable; - args[0] = &retval; - args[1] = &arg; - zend_fcall_info_argp(&fci TSRMLS_CC, 2, args); - fci.retval_ptr_ptr = &newretval; - - if (zend_call_function(&fci, NULL TSRMLS_CC) == FAILURE || EG(exception)) { - efree(fci.params); - zval_ptr_dtor(&retval); - return; - } - - efree(fci.params); - zval_ptr_dtor(&retval); - - RETVAL_ZVAL(newretval, 1 ,1); -} - -PHP_MINIT_FUNCTION(pimple) -{ - zend_class_entry tmp_pimple_ce, tmp_pimple_closure_ce, tmp_pimple_serviceprovider_iface_ce; - INIT_NS_CLASS_ENTRY(tmp_pimple_ce, PIMPLE_NS, "Container", pimple_ce_functions); - INIT_NS_CLASS_ENTRY(tmp_pimple_closure_ce, PIMPLE_NS, "ContainerClosure", NULL); - INIT_NS_CLASS_ENTRY(tmp_pimple_serviceprovider_iface_ce, PIMPLE_NS, "ServiceProviderInterface", pimple_serviceprovider_iface_ce_functions); - - tmp_pimple_ce.create_object = pimple_object_create; - tmp_pimple_closure_ce.create_object = pimple_closure_object_create; - - pimple_ce = zend_register_internal_class(&tmp_pimple_ce TSRMLS_CC); - zend_class_implements(pimple_ce TSRMLS_CC, 1, zend_ce_arrayaccess); - - pimple_closure_ce = zend_register_internal_class(&tmp_pimple_closure_ce TSRMLS_CC); - pimple_closure_ce->ce_flags |= ZEND_ACC_FINAL_CLASS; - - pimple_serviceprovider_ce = zend_register_internal_interface(&tmp_pimple_serviceprovider_iface_ce TSRMLS_CC); - - memcpy(&pimple_closure_object_handlers, zend_get_std_object_handlers(), sizeof(*zend_get_std_object_handlers())); - pimple_object_handlers = std_object_handlers; - pimple_closure_object_handlers.get_closure = pimple_closure_get_closure; - - pimple_closure_invoker_function.function_name = "Pimple closure internal invoker"; - pimple_closure_invoker_function.fn_flags |= ZEND_ACC_CLOSURE; - pimple_closure_invoker_function.handler = ZEND_MN(PimpleClosure_invoker); - pimple_closure_invoker_function.num_args = 1; - pimple_closure_invoker_function.required_num_args = 1; - pimple_closure_invoker_function.scope = pimple_closure_ce; - pimple_closure_invoker_function.type = ZEND_INTERNAL_FUNCTION; - pimple_closure_invoker_function.module = &pimple_module_entry; - - return SUCCESS; -} - -PHP_MINFO_FUNCTION(pimple) -{ - php_info_print_table_start(); - php_info_print_table_header(2, "SensioLabs Pimple C support", "enabled"); - php_info_print_table_row(2, "Pimple supported version", PIMPLE_VERSION); - php_info_print_table_end(); - - php_info_print_box_start(0); - php_write((void *)ZEND_STRL("SensioLabs Pimple C support developed by Julien Pauli") TSRMLS_CC); - if (!sapi_module.phpinfo_as_text) { - php_write((void *)ZEND_STRL(sensiolabs_logo) TSRMLS_CC); - } - php_info_print_box_end(); -} - -zend_module_entry pimple_module_entry = { - STANDARD_MODULE_HEADER, - "pimple", - NULL, - PHP_MINIT(pimple), - NULL, - NULL, - NULL, - PHP_MINFO(pimple), - PIMPLE_VERSION, - STANDARD_MODULE_PROPERTIES -}; - -#ifdef COMPILE_DL_PIMPLE -ZEND_GET_MODULE(pimple) -#endif diff --git a/vendor/pimple/pimple/ext/pimple/pimple_compat.h b/vendor/pimple/pimple/ext/pimple/pimple_compat.h deleted file mode 100644 index d234e17..0000000 --- a/vendor/pimple/pimple/ext/pimple/pimple_compat.h +++ /dev/null @@ -1,81 +0,0 @@ - -/* - * This file is part of Pimple. - * - * Copyright (c) 2014 Fabien Potencier - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is furnished - * to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#ifndef PIMPLE_COMPAT_H_ -#define PIMPLE_COMPAT_H_ - -#include "Zend/zend_extensions.h" /* for ZEND_EXTENSION_API_NO */ - -#define PHP_5_0_X_API_NO 220040412 -#define PHP_5_1_X_API_NO 220051025 -#define PHP_5_2_X_API_NO 220060519 -#define PHP_5_3_X_API_NO 220090626 -#define PHP_5_4_X_API_NO 220100525 -#define PHP_5_5_X_API_NO 220121212 -#define PHP_5_6_X_API_NO 220131226 - -#define IS_PHP_56 ZEND_EXTENSION_API_NO == PHP_5_6_X_API_NO -#define IS_AT_LEAST_PHP_56 ZEND_EXTENSION_API_NO >= PHP_5_6_X_API_NO - -#define IS_PHP_55 ZEND_EXTENSION_API_NO == PHP_5_5_X_API_NO -#define IS_AT_LEAST_PHP_55 ZEND_EXTENSION_API_NO >= PHP_5_5_X_API_NO - -#define IS_PHP_54 ZEND_EXTENSION_API_NO == PHP_5_4_X_API_NO -#define IS_AT_LEAST_PHP_54 ZEND_EXTENSION_API_NO >= PHP_5_4_X_API_NO - -#define IS_PHP_53 ZEND_EXTENSION_API_NO == PHP_5_3_X_API_NO -#define IS_AT_LEAST_PHP_53 ZEND_EXTENSION_API_NO >= PHP_5_3_X_API_NO - -#if IS_PHP_53 -#define object_properties_init(obj, ce) do { \ - zend_hash_copy(obj->properties, &ce->default_properties, zval_copy_property_ctor(ce), NULL, sizeof(zval *)); \ - } while (0); -#endif - -#define ZEND_OBJ_INIT(obj, ce) do { \ - zend_object_std_init(obj, ce TSRMLS_CC); \ - object_properties_init((obj), (ce)); \ - } while(0); - -#if IS_PHP_53 || IS_PHP_54 -static void zend_hash_get_current_key_zval_ex(const HashTable *ht, zval *key, HashPosition *pos) { - Bucket *p; - - p = pos ? (*pos) : ht->pInternalPointer; - - if (!p) { - Z_TYPE_P(key) = IS_NULL; - } else if (p->nKeyLength) { - Z_TYPE_P(key) = IS_STRING; - Z_STRVAL_P(key) = estrndup(p->arKey, p->nKeyLength - 1); - Z_STRLEN_P(key) = p->nKeyLength - 1; - } else { - Z_TYPE_P(key) = IS_LONG; - Z_LVAL_P(key) = p->h; - } -} -#endif - -#endif /* PIMPLE_COMPAT_H_ */ diff --git a/vendor/pimple/pimple/ext/pimple/tests/001.phpt b/vendor/pimple/pimple/ext/pimple/tests/001.phpt deleted file mode 100644 index 0809ea2..0000000 --- a/vendor/pimple/pimple/ext/pimple/tests/001.phpt +++ /dev/null @@ -1,45 +0,0 @@ ---TEST-- -Test for read_dim/write_dim handlers ---SKIPIF-- -<?php if (!extension_loaded("pimple")) print "skip"; ?> ---FILE-- -<?php -$p = new Pimple\Container(); -$p[42] = 'foo'; -$p['foo'] = 42; - -echo $p[42]; -echo "\n"; -echo $p['foo']; -echo "\n"; -try { - var_dump($p['nonexistant']); - echo "Exception excpected"; -} catch (InvalidArgumentException $e) { } - -$p[54.2] = 'foo2'; -echo $p[54]; -echo "\n"; -$p[242.99] = 'foo99'; -echo $p[242]; - -echo "\n"; - -$p[5] = 'bar'; -$p[5] = 'baz'; -echo $p[5]; - -echo "\n"; - -$p['str'] = 'str'; -$p['str'] = 'strstr'; -echo $p['str']; -?> - ---EXPECTF-- -foo -42 -foo2 -foo99 -baz -strstr \ No newline at end of file diff --git a/vendor/pimple/pimple/ext/pimple/tests/002.phpt b/vendor/pimple/pimple/ext/pimple/tests/002.phpt deleted file mode 100644 index 7b56d2c..0000000 --- a/vendor/pimple/pimple/ext/pimple/tests/002.phpt +++ /dev/null @@ -1,15 +0,0 @@ ---TEST-- -Test for constructor ---SKIPIF-- -<?php if (!extension_loaded("pimple")) print "skip"; ?> ---FILE-- -<?php -$p = new Pimple\Container(); -var_dump($p[42]); - -$p = new Pimple\Container(array(42=>'foo')); -var_dump($p[42]); -?> ---EXPECT-- -NULL -string(3) "foo" diff --git a/vendor/pimple/pimple/ext/pimple/tests/003.phpt b/vendor/pimple/pimple/ext/pimple/tests/003.phpt deleted file mode 100644 index a22cfa3..0000000 --- a/vendor/pimple/pimple/ext/pimple/tests/003.phpt +++ /dev/null @@ -1,16 +0,0 @@ ---TEST-- -Test empty dimensions ---SKIPIF-- -<?php if (!extension_loaded("pimple")) print "skip"; ?> ---FILE-- -<?php -$p = new Pimple\Container(); -$p[] = 42; -var_dump($p[0]); -$p[41] = 'foo'; -$p[] = 'bar'; -var_dump($p[42]); -?> ---EXPECT-- -int(42) -string(3) "bar" \ No newline at end of file diff --git a/vendor/pimple/pimple/ext/pimple/tests/004.phpt b/vendor/pimple/pimple/ext/pimple/tests/004.phpt deleted file mode 100644 index 1e1d251..0000000 --- a/vendor/pimple/pimple/ext/pimple/tests/004.phpt +++ /dev/null @@ -1,30 +0,0 @@ ---TEST-- -Test has/unset dim handlers ---SKIPIF-- -<?php if (!extension_loaded("pimple")) print "skip"; ?> ---FILE-- -<?php -$p = new Pimple\Container(); -$p[] = 42; -var_dump($p[0]); -unset($p[0]); -var_dump($p[0]); -$p['foo'] = 'bar'; -var_dump(isset($p['foo'])); -unset($p['foo']); -try { - var_dump($p['foo']); - echo "Excpected exception"; -} catch (InvalidArgumentException $e) { } -var_dump(isset($p['bar'])); -$p['bar'] = NULL; -var_dump(isset($p['bar'])); -var_dump(empty($p['bar'])); -?> ---EXPECT-- -int(42) -NULL -bool(true) -bool(false) -bool(true) -bool(true) \ No newline at end of file diff --git a/vendor/pimple/pimple/ext/pimple/tests/005.phpt b/vendor/pimple/pimple/ext/pimple/tests/005.phpt deleted file mode 100644 index 0479ee0..0000000 --- a/vendor/pimple/pimple/ext/pimple/tests/005.phpt +++ /dev/null @@ -1,27 +0,0 @@ ---TEST-- -Test simple class inheritance ---SKIPIF-- -<?php if (!extension_loaded("pimple")) print "skip"; ?> ---FILE-- -<?php -class MyPimple extends Pimple\Container -{ - public $someAttr = 'fooAttr'; - - public function offsetget($o) - { - var_dump("hit"); - return parent::offsetget($o); - } -} - -$p = new MyPimple; -$p[42] = 'foo'; -echo $p[42]; -echo "\n"; -echo $p->someAttr; -?> ---EXPECT-- -string(3) "hit" -foo -fooAttr \ No newline at end of file diff --git a/vendor/pimple/pimple/ext/pimple/tests/006.phpt b/vendor/pimple/pimple/ext/pimple/tests/006.phpt deleted file mode 100644 index cfe8a11..0000000 --- a/vendor/pimple/pimple/ext/pimple/tests/006.phpt +++ /dev/null @@ -1,51 +0,0 @@ ---TEST-- -Test complex class inheritance ---SKIPIF-- -<?php if (!extension_loaded("pimple")) print "skip"; ?> ---FILE-- -<?php -class MyPimple extends Pimple\Container -{ - public function offsetget($o) - { - var_dump("hit offsetget in " . __CLASS__); - return parent::offsetget($o); - } -} - -class TestPimple extends MyPimple -{ - public function __construct($values) - { - array_shift($values); - parent::__construct($values); - } - - public function offsetget($o) - { - var_dump('hit offsetget in ' . __CLASS__); - return parent::offsetget($o); - } - - public function offsetset($o, $v) - { - var_dump('hit offsetset'); - return parent::offsetset($o, $v); - } -} - -$defaultValues = array('foo' => 'bar', 88 => 'baz'); - -$p = new TestPimple($defaultValues); -$p[42] = 'foo'; -var_dump($p[42]); -var_dump($p[0]); -?> ---EXPECT-- -string(13) "hit offsetset" -string(27) "hit offsetget in TestPimple" -string(25) "hit offsetget in MyPimple" -string(3) "foo" -string(27) "hit offsetget in TestPimple" -string(25) "hit offsetget in MyPimple" -string(3) "baz" \ No newline at end of file diff --git a/vendor/pimple/pimple/ext/pimple/tests/007.phpt b/vendor/pimple/pimple/ext/pimple/tests/007.phpt deleted file mode 100644 index 5aac683..0000000 --- a/vendor/pimple/pimple/ext/pimple/tests/007.phpt +++ /dev/null @@ -1,22 +0,0 @@ ---TEST-- -Test for read_dim/write_dim handlers ---SKIPIF-- -<?php if (!extension_loaded("pimple")) print "skip"; ?> ---FILE-- -<?php -$p = new Pimple\Container(); -$p[42] = 'foo'; -$p['foo'] = 42; - -echo $p[42]; -echo "\n"; -echo $p['foo']; -echo "\n"; -try { - var_dump($p['nonexistant']); - echo "Exception excpected"; -} catch (InvalidArgumentException $e) { } -?> ---EXPECTF-- -foo -42 \ No newline at end of file diff --git a/vendor/pimple/pimple/ext/pimple/tests/008.phpt b/vendor/pimple/pimple/ext/pimple/tests/008.phpt deleted file mode 100644 index db7eeec..0000000 --- a/vendor/pimple/pimple/ext/pimple/tests/008.phpt +++ /dev/null @@ -1,29 +0,0 @@ ---TEST-- -Test frozen services ---SKIPIF-- -<?php if (!extension_loaded("pimple")) print "skip"; ?> ---FILE-- -<?php -$p = new Pimple\Container(); -$p[42] = 'foo'; -$p[42] = 'bar'; - -$p['foo'] = function () { }; -$p['foo'] = function () { }; - -$a = $p['foo']; - -try { - $p['foo'] = function () { }; - echo "Exception excpected"; -} catch (RuntimeException $e) { } - -$p[42] = function() { }; -$a = $p[42]; - -try { - $p[42] = function () { }; - echo "Exception excpected"; -} catch (RuntimeException $e) { } -?> ---EXPECTF-- diff --git a/vendor/pimple/pimple/ext/pimple/tests/009.phpt b/vendor/pimple/pimple/ext/pimple/tests/009.phpt deleted file mode 100644 index bb05ea2..0000000 --- a/vendor/pimple/pimple/ext/pimple/tests/009.phpt +++ /dev/null @@ -1,13 +0,0 @@ ---TEST-- -Test service is called as callback, and only once ---SKIPIF-- -<?php if (!extension_loaded("pimple")) print "skip"; ?> ---FILE-- -<?php -$p = new Pimple\Container(); -$p['foo'] = function($arg) use ($p) { var_dump($p === $arg); }; -$a = $p['foo']; -$b = $p['foo']; /* should return not calling the callback */ -?> ---EXPECTF-- -bool(true) \ No newline at end of file diff --git a/vendor/pimple/pimple/ext/pimple/tests/010.phpt b/vendor/pimple/pimple/ext/pimple/tests/010.phpt deleted file mode 100644 index badce01..0000000 --- a/vendor/pimple/pimple/ext/pimple/tests/010.phpt +++ /dev/null @@ -1,45 +0,0 @@ ---TEST-- -Test service is called as callback for every callback type ---SKIPIF-- -<?php if (!extension_loaded("pimple")) print "skip"; ?> ---FILE-- -<?php -function callme() -{ - return 'called'; -} - -$a = function() { return 'called'; }; - -class Foo -{ - public static function bar() - { - return 'called'; - } -} - -$p = new Pimple\Container(); -$p['foo'] = 'callme'; -echo $p['foo'] . "\n"; - -$p['bar'] = $a; -echo $p['bar'] . "\n"; - -$p['baz'] = "Foo::bar"; -echo $p['baz'] . "\n"; - -$p['foobar'] = array('Foo', 'bar'); -var_dump($p['foobar']); - -?> ---EXPECTF-- -callme -called -Foo::bar -array(2) { - [0]=> - string(3) "Foo" - [1]=> - string(3) "bar" -} \ No newline at end of file diff --git a/vendor/pimple/pimple/ext/pimple/tests/011.phpt b/vendor/pimple/pimple/ext/pimple/tests/011.phpt deleted file mode 100644 index 6682ab8..0000000 --- a/vendor/pimple/pimple/ext/pimple/tests/011.phpt +++ /dev/null @@ -1,19 +0,0 @@ ---TEST-- -Test service callback throwing an exception ---SKIPIF-- -<?php if (!extension_loaded("pimple")) print "skip"; ?> ---FILE-- -<?php -class CallBackException extends RuntimeException { } - -$p = new Pimple\Container(); -$p['foo'] = function () { throw new CallBackException; }; -try { - echo $p['foo'] . "\n"; - echo "should not come here"; -} catch (CallBackException $e) { - echo "all right!"; -} -?> ---EXPECTF-- -all right! \ No newline at end of file diff --git a/vendor/pimple/pimple/ext/pimple/tests/012.phpt b/vendor/pimple/pimple/ext/pimple/tests/012.phpt deleted file mode 100644 index 4c6ac48..0000000 --- a/vendor/pimple/pimple/ext/pimple/tests/012.phpt +++ /dev/null @@ -1,28 +0,0 @@ ---TEST-- -Test service factory ---SKIPIF-- -<?php if (!extension_loaded("pimple")) print "skip"; ?> ---FILE-- -<?php - -$p = new Pimple\Container(); - -$p->factory($f = function() { var_dump('called-1'); return 'ret-1';}); - -$p[] = $f; - -$p[] = function () { var_dump('called-2'); return 'ret-2'; }; - -var_dump($p[0]); -var_dump($p[0]); -var_dump($p[1]); -var_dump($p[1]); -?> ---EXPECTF-- -string(8) "called-1" -string(5) "ret-1" -string(8) "called-1" -string(5) "ret-1" -string(8) "called-2" -string(5) "ret-2" -string(5) "ret-2" \ No newline at end of file diff --git a/vendor/pimple/pimple/ext/pimple/tests/013.phpt b/vendor/pimple/pimple/ext/pimple/tests/013.phpt deleted file mode 100644 index f419958..0000000 --- a/vendor/pimple/pimple/ext/pimple/tests/013.phpt +++ /dev/null @@ -1,33 +0,0 @@ ---TEST-- -Test keys() ---SKIPIF-- -<?php if (!extension_loaded("pimple")) print "skip"; ?> ---FILE-- -<?php - -$p = new Pimple\Container(); - -var_dump($p->keys()); - -$p['foo'] = 'bar'; -$p[] = 'foo'; - -var_dump($p->keys()); - -unset($p['foo']); - -var_dump($p->keys()); -?> ---EXPECTF-- -array(0) { -} -array(2) { - [0]=> - string(3) "foo" - [1]=> - int(0) -} -array(1) { - [0]=> - int(0) -} \ No newline at end of file diff --git a/vendor/pimple/pimple/ext/pimple/tests/014.phpt b/vendor/pimple/pimple/ext/pimple/tests/014.phpt deleted file mode 100644 index ac93721..0000000 --- a/vendor/pimple/pimple/ext/pimple/tests/014.phpt +++ /dev/null @@ -1,30 +0,0 @@ ---TEST-- -Test raw() ---SKIPIF-- -<?php if (!extension_loaded("pimple")) print "skip"; ?> ---FILE-- -<?php - -$p = new Pimple\Container(); -$f = function () { var_dump('called-2'); return 'ret-2'; }; - -$p['foo'] = $f; -$p[42] = $f; - -var_dump($p['foo']); -var_dump($p->raw('foo')); -var_dump($p[42]); - -unset($p['foo']); - -try { - $p->raw('foo'); - echo "expected exception"; -} catch (InvalidArgumentException $e) { } ---EXPECTF-- -string(8) "called-2" -string(5) "ret-2" -object(Closure)#%i (0) { -} -string(8) "called-2" -string(5) "ret-2" \ No newline at end of file diff --git a/vendor/pimple/pimple/ext/pimple/tests/015.phpt b/vendor/pimple/pimple/ext/pimple/tests/015.phpt deleted file mode 100644 index 314f008..0000000 --- a/vendor/pimple/pimple/ext/pimple/tests/015.phpt +++ /dev/null @@ -1,17 +0,0 @@ ---TEST-- -Test protect() ---SKIPIF-- -<?php if (!extension_loaded("pimple")) print "skip"; ?> ---FILE-- -<?php - -$p = new Pimple\Container(); -$f = function () { return 'foo'; }; -$p['foo'] = $f; - -$p->protect($f); - -var_dump($p['foo']); ---EXPECTF-- -object(Closure)#%i (0) { -} \ No newline at end of file diff --git a/vendor/pimple/pimple/ext/pimple/tests/016.phpt b/vendor/pimple/pimple/ext/pimple/tests/016.phpt deleted file mode 100644 index e55edb0..0000000 --- a/vendor/pimple/pimple/ext/pimple/tests/016.phpt +++ /dev/null @@ -1,24 +0,0 @@ ---TEST-- -Test extend() ---SKIPIF-- -<?php if (!extension_loaded("pimple")) print "skip"; ?> ---FILE-- -<?php -/* - This is part of Pimple::extend() code : - - $extended = function ($c) use ($callable, $factory) { - return $callable($factory($c), $c); - }; -*/ - -$p = new Pimple\Container(); -$p[12] = function ($v) { var_dump($v); return 'foo';}; /* $factory in code above */ - -$c = $p->extend(12, function ($w) { var_dump($w); return 'bar'; }); /* $callable in code above */ - -var_dump($c('param')); ---EXPECTF-- -string(5) "param" -string(3) "foo" -string(3) "bar" \ No newline at end of file diff --git a/vendor/pimple/pimple/ext/pimple/tests/017.phpt b/vendor/pimple/pimple/ext/pimple/tests/017.phpt deleted file mode 100644 index bac23ce..0000000 --- a/vendor/pimple/pimple/ext/pimple/tests/017.phpt +++ /dev/null @@ -1,17 +0,0 @@ ---TEST-- -Test extend() with exception in service extension ---SKIPIF-- -<?php if (!extension_loaded("pimple")) print "skip"; ?> ---FILE-- -<?php - -$p = new Pimple\Container(); -$p[12] = function ($v) { return 'foo';}; - -$c = $p->extend(12, function ($w) { throw new BadMethodCallException; }); - -try { - $p[12]; - echo "Exception expected"; -} catch (BadMethodCallException $e) { } ---EXPECTF-- diff --git a/vendor/pimple/pimple/ext/pimple/tests/017_1.phpt b/vendor/pimple/pimple/ext/pimple/tests/017_1.phpt deleted file mode 100644 index 8f881d6..0000000 --- a/vendor/pimple/pimple/ext/pimple/tests/017_1.phpt +++ /dev/null @@ -1,17 +0,0 @@ ---TEST-- -Test extend() with exception in service factory ---SKIPIF-- -<?php if (!extension_loaded("pimple")) print "skip"; ?> ---FILE-- -<?php - -$p = new Pimple\Container(); -$p[12] = function ($v) { throw new BadMethodCallException; }; - -$c = $p->extend(12, function ($w) { return 'foobar'; }); - -try { - $p[12]; - echo "Exception expected"; -} catch (BadMethodCallException $e) { } ---EXPECTF-- diff --git a/vendor/pimple/pimple/ext/pimple/tests/018.phpt b/vendor/pimple/pimple/ext/pimple/tests/018.phpt deleted file mode 100644 index 27c12a1..0000000 --- a/vendor/pimple/pimple/ext/pimple/tests/018.phpt +++ /dev/null @@ -1,23 +0,0 @@ ---TEST-- -Test register() ---SKIPIF-- -<?php if (!extension_loaded("pimple")) print "skip"; ?> ---FILE-- -<?php - -class Foo implements Pimple\ServiceProviderInterface -{ - public function register(Pimple\Container $p) - { - var_dump($p); - } -} - -$p = new Pimple\Container(); -$p->register(new Foo, array(42 => 'bar')); - -var_dump($p[42]); ---EXPECTF-- -object(Pimple\Container)#1 (0) { -} -string(3) "bar" \ No newline at end of file diff --git a/vendor/pimple/pimple/ext/pimple/tests/019.phpt b/vendor/pimple/pimple/ext/pimple/tests/019.phpt deleted file mode 100644 index 28a9aec..0000000 --- a/vendor/pimple/pimple/ext/pimple/tests/019.phpt +++ /dev/null @@ -1,18 +0,0 @@ ---TEST-- -Test register() returns static and is a fluent interface ---SKIPIF-- -<?php if (!extension_loaded("pimple")) print "skip"; ?> ---FILE-- -<?php - -class Foo implements Pimple\ServiceProviderInterface -{ - public function register(Pimple\Container $p) - { - } -} - -$p = new Pimple\Container(); -var_dump($p === $p->register(new Foo)); ---EXPECTF-- -bool(true) diff --git a/vendor/pimple/pimple/ext/pimple/tests/bench.phpb b/vendor/pimple/pimple/ext/pimple/tests/bench.phpb deleted file mode 100644 index 8f983e6..0000000 --- a/vendor/pimple/pimple/ext/pimple/tests/bench.phpb +++ /dev/null @@ -1,51 +0,0 @@ -<?php - -if (!class_exists('Pimple\Container')) { - require_once __DIR__ . '/../../../src/Pimple/Container.php'; -} else { - echo "pimple-c extension detected, using...\n\n"; -} - -$time = microtime(true); - -function foo() { } -$factory = function () { }; - -for ($i=0; $i<10000; $i++) { - -$p = new Pimple\Container; - -$p['foo'] = 'bar'; - -if (!isset($p[3])) { - $p[3] = $p['foo']; - $p[] = 'bar'; -} - -$p[2] = 42; - -if (isset($p[2])) { - unset($p[2]); -} - -$p[42] = $p['foo']; - -$p['cb'] = function($arg) { }; - -$p[] = $p['cb']; - -echo $p['cb']; -echo $p['cb']; -echo $p['cb']; - -//$p->factory($factory); - -$p['factory'] = $factory; - -echo $p['factory']; -echo $p['factory']; -echo $p['factory']; - -} - -echo microtime(true) - $time; diff --git a/vendor/pimple/pimple/ext/pimple/tests/bench_shared.phpb b/vendor/pimple/pimple/ext/pimple/tests/bench_shared.phpb deleted file mode 100644 index aec541f..0000000 --- a/vendor/pimple/pimple/ext/pimple/tests/bench_shared.phpb +++ /dev/null @@ -1,25 +0,0 @@ -<?php - -if (!class_exists('Pimple\Container')) { - require_once __DIR__ . '/../../../src/Pimple/Container.php'; -} else { - echo "pimple-c extension detected, using...\n\n"; -} - -$time = microtime(true); - - -$service = function ($arg) { return "I'm a service"; }; - -for ($i=0; $i<10000; $i++) { - -$p = new Pimple\Container; -$p['my_service'] = $service; - -$a = $p['my_service']; -$b = $p['my_service']; - -} - -echo microtime(true) - $time; -?> diff --git a/vendor/pimple/pimple/phpunit.xml.dist b/vendor/pimple/pimple/phpunit.xml.dist deleted file mode 100644 index 5c8d487..0000000 --- a/vendor/pimple/pimple/phpunit.xml.dist +++ /dev/null @@ -1,14 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> - -<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="http://schema.phpunit.de/4.1/phpunit.xsd" - backupGlobals="false" - colors="true" - bootstrap="vendor/autoload.php" -> - <testsuites> - <testsuite name="Pimple Test Suite"> - <directory>./src/Pimple/Tests</directory> - </testsuite> - </testsuites> -</phpunit> diff --git a/vendor/pimple/pimple/src/Pimple/Container.php b/vendor/pimple/pimple/src/Pimple/Container.php deleted file mode 100644 index c976431..0000000 --- a/vendor/pimple/pimple/src/Pimple/Container.php +++ /dev/null @@ -1,282 +0,0 @@ -<?php - -/* - * This file is part of Pimple. - * - * Copyright (c) 2009 Fabien Potencier - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is furnished - * to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -namespace Pimple; - -/** - * Container main class. - * - * @author Fabien Potencier - */ -class Container implements \ArrayAccess -{ - private $values = array(); - private $factories; - private $protected; - private $frozen = array(); - private $raw = array(); - private $keys = array(); - - /** - * Instantiate the container. - * - * Objects and parameters can be passed as argument to the constructor. - * - * @param array $values The parameters or objects. - */ - public function __construct(array $values = array()) - { - $this->factories = new \SplObjectStorage(); - $this->protected = new \SplObjectStorage(); - - foreach ($values as $key => $value) { - $this->offsetSet($key, $value); - } - } - - /** - * Sets a parameter or an object. - * - * Objects must be defined as Closures. - * - * Allowing any PHP callable leads to difficult to debug problems - * as function names (strings) are callable (creating a function with - * the same name as an existing parameter would break your container). - * - * @param string $id The unique identifier for the parameter or object - * @param mixed $value The value of the parameter or a closure to define an object - * - * @throws \RuntimeException Prevent override of a frozen service - */ - public function offsetSet($id, $value) - { - if (isset($this->frozen[$id])) { - throw new \RuntimeException(sprintf('Cannot override frozen service "%s".', $id)); - } - - $this->values[$id] = $value; - $this->keys[$id] = true; - } - - /** - * Gets a parameter or an object. - * - * @param string $id The unique identifier for the parameter or object - * - * @return mixed The value of the parameter or an object - * - * @throws \InvalidArgumentException if the identifier is not defined - */ - public function offsetGet($id) - { - if (!isset($this->keys[$id])) { - throw new \InvalidArgumentException(sprintf('Identifier "%s" is not defined.', $id)); - } - - if ( - isset($this->raw[$id]) - || !is_object($this->values[$id]) - || isset($this->protected[$this->values[$id]]) - || !method_exists($this->values[$id], '__invoke') - ) { - return $this->values[$id]; - } - - if (isset($this->factories[$this->values[$id]])) { - return $this->values[$id]($this); - } - - $raw = $this->values[$id]; - $val = $this->values[$id] = $raw($this); - $this->raw[$id] = $raw; - - $this->frozen[$id] = true; - - return $val; - } - - /** - * Checks if a parameter or an object is set. - * - * @param string $id The unique identifier for the parameter or object - * - * @return bool - */ - public function offsetExists($id) - { - return isset($this->keys[$id]); - } - - /** - * Unsets a parameter or an object. - * - * @param string $id The unique identifier for the parameter or object - */ - public function offsetUnset($id) - { - if (isset($this->keys[$id])) { - if (is_object($this->values[$id])) { - unset($this->factories[$this->values[$id]], $this->protected[$this->values[$id]]); - } - - unset($this->values[$id], $this->frozen[$id], $this->raw[$id], $this->keys[$id]); - } - } - - /** - * Marks a callable as being a factory service. - * - * @param callable $callable A service definition to be used as a factory - * - * @return callable The passed callable - * - * @throws \InvalidArgumentException Service definition has to be a closure of an invokable object - */ - public function factory($callable) - { - if (!method_exists($callable, '__invoke')) { - throw new \InvalidArgumentException('Service definition is not a Closure or invokable object.'); - } - - $this->factories->attach($callable); - - return $callable; - } - - /** - * Protects a callable from being interpreted as a service. - * - * This is useful when you want to store a callable as a parameter. - * - * @param callable $callable A callable to protect from being evaluated - * - * @return callable The passed callable - * - * @throws \InvalidArgumentException Service definition has to be a closure of an invokable object - */ - public function protect($callable) - { - if (!method_exists($callable, '__invoke')) { - throw new \InvalidArgumentException('Callable is not a Closure or invokable object.'); - } - - $this->protected->attach($callable); - - return $callable; - } - - /** - * Gets a parameter or the closure defining an object. - * - * @param string $id The unique identifier for the parameter or object - * - * @return mixed The value of the parameter or the closure defining an object - * - * @throws \InvalidArgumentException if the identifier is not defined - */ - public function raw($id) - { - if (!isset($this->keys[$id])) { - throw new \InvalidArgumentException(sprintf('Identifier "%s" is not defined.', $id)); - } - - if (isset($this->raw[$id])) { - return $this->raw[$id]; - } - - return $this->values[$id]; - } - - /** - * Extends an object definition. - * - * Useful when you want to extend an existing object definition, - * without necessarily loading that object. - * - * @param string $id The unique identifier for the object - * @param callable $callable A service definition to extend the original - * - * @return callable The wrapped callable - * - * @throws \InvalidArgumentException if the identifier is not defined or not a service definition - */ - public function extend($id, $callable) - { - if (!isset($this->keys[$id])) { - throw new \InvalidArgumentException(sprintf('Identifier "%s" is not defined.', $id)); - } - - if (!is_object($this->values[$id]) || !method_exists($this->values[$id], '__invoke')) { - throw new \InvalidArgumentException(sprintf('Identifier "%s" does not contain an object definition.', $id)); - } - - if (!is_object($callable) || !method_exists($callable, '__invoke')) { - throw new \InvalidArgumentException('Extension service definition is not a Closure or invokable object.'); - } - - $factory = $this->values[$id]; - - $extended = function ($c) use ($callable, $factory) { - return $callable($factory($c), $c); - }; - - if (isset($this->factories[$factory])) { - $this->factories->detach($factory); - $this->factories->attach($extended); - } - - return $this[$id] = $extended; - } - - /** - * Returns all defined value names. - * - * @return array An array of value names - */ - public function keys() - { - return array_keys($this->values); - } - - /** - * Registers a service provider. - * - * @param ServiceProviderInterface $provider A ServiceProviderInterface instance - * @param array $values An array of values that customizes the provider - * - * @return static - */ - public function register(ServiceProviderInterface $provider, array $values = array()) - { - $provider->register($this); - - foreach ($values as $key => $value) { - $this[$key] = $value; - } - - return $this; - } -} diff --git a/vendor/pimple/pimple/src/Pimple/ServiceProviderInterface.php b/vendor/pimple/pimple/src/Pimple/ServiceProviderInterface.php deleted file mode 100644 index c004594..0000000 --- a/vendor/pimple/pimple/src/Pimple/ServiceProviderInterface.php +++ /dev/null @@ -1,46 +0,0 @@ -<?php - -/* - * This file is part of Pimple. - * - * Copyright (c) 2009 Fabien Potencier - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is furnished - * to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -namespace Pimple; - -/** - * Pimple service provider interface. - * - * @author Fabien Potencier - * @author Dominik Zogg - */ -interface ServiceProviderInterface -{ - /** - * Registers services on the given container. - * - * This method should only be used to configure services and parameters. - * It should not get services. - * - * @param Container $pimple A container instance - */ - public function register(Container $pimple); -} diff --git a/vendor/pimple/pimple/src/Pimple/Tests/Fixtures/Invokable.php b/vendor/pimple/pimple/src/Pimple/Tests/Fixtures/Invokable.php deleted file mode 100644 index aba453b..0000000 --- a/vendor/pimple/pimple/src/Pimple/Tests/Fixtures/Invokable.php +++ /dev/null @@ -1,38 +0,0 @@ -<?php - -/* - * This file is part of Pimple. - * - * Copyright (c) 2009 Fabien Potencier - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is furnished - * to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -namespace Pimple\Tests\Fixtures; - -class Invokable -{ - public function __invoke($value = null) - { - $service = new Service(); - $service->value = $value; - - return $service; - } -} diff --git a/vendor/pimple/pimple/src/Pimple/Tests/Fixtures/NonInvokable.php b/vendor/pimple/pimple/src/Pimple/Tests/Fixtures/NonInvokable.php deleted file mode 100644 index 33cd4e5..0000000 --- a/vendor/pimple/pimple/src/Pimple/Tests/Fixtures/NonInvokable.php +++ /dev/null @@ -1,34 +0,0 @@ -<?php - -/* - * This file is part of Pimple. - * - * Copyright (c) 2009 Fabien Potencier - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is furnished - * to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -namespace Pimple\Tests\Fixtures; - -class NonInvokable -{ - public function __call($a, $b) - { - } -} diff --git a/vendor/pimple/pimple/src/Pimple/Tests/Fixtures/PimpleServiceProvider.php b/vendor/pimple/pimple/src/Pimple/Tests/Fixtures/PimpleServiceProvider.php deleted file mode 100644 index 0c910af..0000000 --- a/vendor/pimple/pimple/src/Pimple/Tests/Fixtures/PimpleServiceProvider.php +++ /dev/null @@ -1,54 +0,0 @@ -<?php - -/* - * This file is part of Pimple. - * - * Copyright (c) 2009 Fabien Potencier - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is furnished - * to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -namespace Pimple\Tests\Fixtures; - -use Pimple\Container; -use Pimple\ServiceProviderInterface; - -class PimpleServiceProvider implements ServiceProviderInterface -{ - /** - * Registers services on the given container. - * - * This method should only be used to configure services and parameters. - * It should not get services. - * - * @param Container $pimple An Container instance - */ - public function register(Container $pimple) - { - $pimple['param'] = 'value'; - - $pimple['service'] = function () { - return new Service(); - }; - - $pimple['factory'] = $pimple->factory(function () { - return new Service(); - }); - } -} diff --git a/vendor/pimple/pimple/src/Pimple/Tests/Fixtures/Service.php b/vendor/pimple/pimple/src/Pimple/Tests/Fixtures/Service.php deleted file mode 100644 index d71b184..0000000 --- a/vendor/pimple/pimple/src/Pimple/Tests/Fixtures/Service.php +++ /dev/null @@ -1,35 +0,0 @@ -<?php - -/* - * This file is part of Pimple. - * - * Copyright (c) 2009 Fabien Potencier - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is furnished - * to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -namespace Pimple\Tests\Fixtures; - -/** - * @author Igor Wiedler <igor@wiedler.ch> - */ -class Service -{ - public $value; -} diff --git a/vendor/pimple/pimple/src/Pimple/Tests/PimpleServiceProviderInterfaceTest.php b/vendor/pimple/pimple/src/Pimple/Tests/PimpleServiceProviderInterfaceTest.php deleted file mode 100644 index 8e5c4c7..0000000 --- a/vendor/pimple/pimple/src/Pimple/Tests/PimpleServiceProviderInterfaceTest.php +++ /dev/null @@ -1,76 +0,0 @@ -<?php - -/* - * This file is part of Pimple. - * - * Copyright (c) 2009 Fabien Potencier - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is furnished - * to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -namespace Pimple\Tests; - -use Pimple\Container; - -/** - * @author Dominik Zogg <dominik.zogg@gmail.com> - */ -class PimpleServiceProviderInterfaceTest extends \PHPUnit_Framework_TestCase -{ - public function testProvider() - { - $pimple = new Container(); - - $pimpleServiceProvider = new Fixtures\PimpleServiceProvider(); - $pimpleServiceProvider->register($pimple); - - $this->assertEquals('value', $pimple['param']); - $this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $pimple['service']); - - $serviceOne = $pimple['factory']; - $this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $serviceOne); - - $serviceTwo = $pimple['factory']; - $this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $serviceTwo); - - $this->assertNotSame($serviceOne, $serviceTwo); - } - - public function testProviderWithRegisterMethod() - { - $pimple = new Container(); - - $pimple->register(new Fixtures\PimpleServiceProvider(), array( - 'anotherParameter' => 'anotherValue', - )); - - $this->assertEquals('value', $pimple['param']); - $this->assertEquals('anotherValue', $pimple['anotherParameter']); - - $this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $pimple['service']); - - $serviceOne = $pimple['factory']; - $this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $serviceOne); - - $serviceTwo = $pimple['factory']; - $this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $serviceTwo); - - $this->assertNotSame($serviceOne, $serviceTwo); - } -} diff --git a/vendor/pimple/pimple/src/Pimple/Tests/PimpleTest.php b/vendor/pimple/pimple/src/Pimple/Tests/PimpleTest.php deleted file mode 100644 index 918f620..0000000 --- a/vendor/pimple/pimple/src/Pimple/Tests/PimpleTest.php +++ /dev/null @@ -1,440 +0,0 @@ -<?php - -/* - * This file is part of Pimple. - * - * Copyright (c) 2009 Fabien Potencier - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is furnished - * to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -namespace Pimple\Tests; - -use Pimple\Container; - -/** - * @author Igor Wiedler <igor@wiedler.ch> - */ -class PimpleTest extends \PHPUnit_Framework_TestCase -{ - public function testWithString() - { - $pimple = new Container(); - $pimple['param'] = 'value'; - - $this->assertEquals('value', $pimple['param']); - } - - public function testWithClosure() - { - $pimple = new Container(); - $pimple['service'] = function () { - return new Fixtures\Service(); - }; - - $this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $pimple['service']); - } - - public function testServicesShouldBeDifferent() - { - $pimple = new Container(); - $pimple['service'] = $pimple->factory(function () { - return new Fixtures\Service(); - }); - - $serviceOne = $pimple['service']; - $this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $serviceOne); - - $serviceTwo = $pimple['service']; - $this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $serviceTwo); - - $this->assertNotSame($serviceOne, $serviceTwo); - } - - public function testShouldPassContainerAsParameter() - { - $pimple = new Container(); - $pimple['service'] = function () { - return new Fixtures\Service(); - }; - $pimple['container'] = function ($container) { - return $container; - }; - - $this->assertNotSame($pimple, $pimple['service']); - $this->assertSame($pimple, $pimple['container']); - } - - public function testIsset() - { - $pimple = new Container(); - $pimple['param'] = 'value'; - $pimple['service'] = function () { - return new Fixtures\Service(); - }; - - $pimple['null'] = null; - - $this->assertTrue(isset($pimple['param'])); - $this->assertTrue(isset($pimple['service'])); - $this->assertTrue(isset($pimple['null'])); - $this->assertFalse(isset($pimple['non_existent'])); - } - - public function testConstructorInjection() - { - $params = array('param' => 'value'); - $pimple = new Container($params); - - $this->assertSame($params['param'], $pimple['param']); - } - - /** - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage Identifier "foo" is not defined. - */ - public function testOffsetGetValidatesKeyIsPresent() - { - $pimple = new Container(); - echo $pimple['foo']; - } - - public function testOffsetGetHonorsNullValues() - { - $pimple = new Container(); - $pimple['foo'] = null; - $this->assertNull($pimple['foo']); - } - - public function testUnset() - { - $pimple = new Container(); - $pimple['param'] = 'value'; - $pimple['service'] = function () { - return new Fixtures\Service(); - }; - - unset($pimple['param'], $pimple['service']); - $this->assertFalse(isset($pimple['param'])); - $this->assertFalse(isset($pimple['service'])); - } - - /** - * @dataProvider serviceDefinitionProvider - */ - public function testShare($service) - { - $pimple = new Container(); - $pimple['shared_service'] = $service; - - $serviceOne = $pimple['shared_service']; - $this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $serviceOne); - - $serviceTwo = $pimple['shared_service']; - $this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $serviceTwo); - - $this->assertSame($serviceOne, $serviceTwo); - } - - /** - * @dataProvider serviceDefinitionProvider - */ - public function testProtect($service) - { - $pimple = new Container(); - $pimple['protected'] = $pimple->protect($service); - - $this->assertSame($service, $pimple['protected']); - } - - public function testGlobalFunctionNameAsParameterValue() - { - $pimple = new Container(); - $pimple['global_function'] = 'strlen'; - $this->assertSame('strlen', $pimple['global_function']); - } - - public function testRaw() - { - $pimple = new Container(); - $pimple['service'] = $definition = $pimple->factory(function () { return 'foo'; }); - $this->assertSame($definition, $pimple->raw('service')); - } - - public function testRawHonorsNullValues() - { - $pimple = new Container(); - $pimple['foo'] = null; - $this->assertNull($pimple->raw('foo')); - } - - public function testFluentRegister() - { - $pimple = new Container(); - $this->assertSame($pimple, $pimple->register($this->getMock('Pimple\ServiceProviderInterface'))); - } - - /** - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage Identifier "foo" is not defined. - */ - public function testRawValidatesKeyIsPresent() - { - $pimple = new Container(); - $pimple->raw('foo'); - } - - /** - * @dataProvider serviceDefinitionProvider - */ - public function testExtend($service) - { - $pimple = new Container(); - $pimple['shared_service'] = function () { - return new Fixtures\Service(); - }; - $pimple['factory_service'] = $pimple->factory(function () { - return new Fixtures\Service(); - }); - - $pimple->extend('shared_service', $service); - $serviceOne = $pimple['shared_service']; - $this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $serviceOne); - $serviceTwo = $pimple['shared_service']; - $this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $serviceTwo); - $this->assertSame($serviceOne, $serviceTwo); - $this->assertSame($serviceOne->value, $serviceTwo->value); - - $pimple->extend('factory_service', $service); - $serviceOne = $pimple['factory_service']; - $this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $serviceOne); - $serviceTwo = $pimple['factory_service']; - $this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $serviceTwo); - $this->assertNotSame($serviceOne, $serviceTwo); - $this->assertNotSame($serviceOne->value, $serviceTwo->value); - } - - public function testExtendDoesNotLeakWithFactories() - { - if (extension_loaded('pimple')) { - $this->markTestSkipped('Pimple extension does not support this test'); - } - $pimple = new Container(); - - $pimple['foo'] = $pimple->factory(function () { return; }); - $pimple['foo'] = $pimple->extend('foo', function ($foo, $pimple) { return; }); - unset($pimple['foo']); - - $p = new \ReflectionProperty($pimple, 'values'); - $p->setAccessible(true); - $this->assertEmpty($p->getValue($pimple)); - - $p = new \ReflectionProperty($pimple, 'factories'); - $p->setAccessible(true); - $this->assertCount(0, $p->getValue($pimple)); - } - - /** - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage Identifier "foo" is not defined. - */ - public function testExtendValidatesKeyIsPresent() - { - $pimple = new Container(); - $pimple->extend('foo', function () {}); - } - - public function testKeys() - { - $pimple = new Container(); - $pimple['foo'] = 123; - $pimple['bar'] = 123; - - $this->assertEquals(array('foo', 'bar'), $pimple->keys()); - } - - /** @test */ - public function settingAnInvokableObjectShouldTreatItAsFactory() - { - $pimple = new Container(); - $pimple['invokable'] = new Fixtures\Invokable(); - - $this->assertInstanceOf('Pimple\Tests\Fixtures\Service', $pimple['invokable']); - } - - /** @test */ - public function settingNonInvokableObjectShouldTreatItAsParameter() - { - $pimple = new Container(); - $pimple['non_invokable'] = new Fixtures\NonInvokable(); - - $this->assertInstanceOf('Pimple\Tests\Fixtures\NonInvokable', $pimple['non_invokable']); - } - - /** - * @dataProvider badServiceDefinitionProvider - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage Service definition is not a Closure or invokable object. - */ - public function testFactoryFailsForInvalidServiceDefinitions($service) - { - $pimple = new Container(); - $pimple->factory($service); - } - - /** - * @dataProvider badServiceDefinitionProvider - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage Callable is not a Closure or invokable object. - */ - public function testProtectFailsForInvalidServiceDefinitions($service) - { - $pimple = new Container(); - $pimple->protect($service); - } - - /** - * @dataProvider badServiceDefinitionProvider - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage Identifier "foo" does not contain an object definition. - */ - public function testExtendFailsForKeysNotContainingServiceDefinitions($service) - { - $pimple = new Container(); - $pimple['foo'] = $service; - $pimple->extend('foo', function () {}); - } - - /** - * @dataProvider badServiceDefinitionProvider - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage Extension service definition is not a Closure or invokable object. - */ - public function testExtendFailsForInvalidServiceDefinitions($service) - { - $pimple = new Container(); - $pimple['foo'] = function () {}; - $pimple->extend('foo', $service); - } - - /** - * Provider for invalid service definitions. - */ - public function badServiceDefinitionProvider() - { - return array( - array(123), - array(new Fixtures\NonInvokable()), - ); - } - - /** - * Provider for service definitions. - */ - public function serviceDefinitionProvider() - { - return array( - array(function ($value) { - $service = new Fixtures\Service(); - $service->value = $value; - - return $service; - }), - array(new Fixtures\Invokable()), - ); - } - - public function testDefiningNewServiceAfterFreeze() - { - $pimple = new Container(); - $pimple['foo'] = function () { - return 'foo'; - }; - $foo = $pimple['foo']; - - $pimple['bar'] = function () { - return 'bar'; - }; - $this->assertSame('bar', $pimple['bar']); - } - - /** - * @expectedException \RuntimeException - * @expectedExceptionMessage Cannot override frozen service "foo". - */ - public function testOverridingServiceAfterFreeze() - { - $pimple = new Container(); - $pimple['foo'] = function () { - return 'foo'; - }; - $foo = $pimple['foo']; - - $pimple['foo'] = function () { - return 'bar'; - }; - } - - public function testRemovingServiceAfterFreeze() - { - $pimple = new Container(); - $pimple['foo'] = function () { - return 'foo'; - }; - $foo = $pimple['foo']; - - unset($pimple['foo']); - $pimple['foo'] = function () { - return 'bar'; - }; - $this->assertSame('bar', $pimple['foo']); - } - - public function testExtendingService() - { - $pimple = new Container(); - $pimple['foo'] = function () { - return 'foo'; - }; - $pimple['foo'] = $pimple->extend('foo', function ($foo, $app) { - return "$foo.bar"; - }); - $pimple['foo'] = $pimple->extend('foo', function ($foo, $app) { - return "$foo.baz"; - }); - $this->assertSame('foo.bar.baz', $pimple['foo']); - } - - public function testExtendingServiceAfterOtherServiceFreeze() - { - $pimple = new Container(); - $pimple['foo'] = function () { - return 'foo'; - }; - $pimple['bar'] = function () { - return 'bar'; - }; - $foo = $pimple['foo']; - - $pimple['bar'] = $pimple->extend('bar', function ($bar, $app) { - return "$bar.baz"; - }); - $this->assertSame('bar.baz', $pimple['bar']); - } -} diff --git a/vendor/psr/http-message/CHANGELOG.md b/vendor/psr/http-message/CHANGELOG.md deleted file mode 100644 index 74b1ef9..0000000 --- a/vendor/psr/http-message/CHANGELOG.md +++ /dev/null @@ -1,36 +0,0 @@ -# Changelog - -All notable changes to this project will be documented in this file, in reverse chronological order by release. - -## 1.0.1 - 2016-08-06 - -### Added - -- Nothing. - -### Deprecated - -- Nothing. - -### Removed - -- Nothing. - -### Fixed - -- Updated all `@return self` annotation references in interfaces to use - `@return static`, which more closelly follows the semantics of the - specification. -- Updated the `MessageInterface::getHeaders()` return annotation to use the - value `string[][]`, indicating the format is a nested array of strings. -- Updated the `@link` annotation for `RequestInterface::withRequestTarget()` - to point to the correct section of RFC 7230. -- Updated the `ServerRequestInterface::withUploadedFiles()` parameter annotation - to add the parameter name (`$uploadedFiles`). -- Updated a `@throws` annotation for the `UploadedFileInterface::moveTo()` - method to correctly reference the method parameter (it was referencing an - incorrect parameter name previously). - -## 1.0.0 - 2016-05-18 - -Initial stable release; reflects accepted PSR-7 specification. diff --git a/vendor/psr/http-message/LICENSE b/vendor/psr/http-message/LICENSE deleted file mode 100644 index c2d8e45..0000000 --- a/vendor/psr/http-message/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2014 PHP Framework Interoperability Group - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/vendor/psr/http-message/README.md b/vendor/psr/http-message/README.md deleted file mode 100644 index 2818533..0000000 --- a/vendor/psr/http-message/README.md +++ /dev/null @@ -1,13 +0,0 @@ -PSR Http Message -================ - -This repository holds all interfaces/classes/traits related to -[PSR-7](http://www.php-fig.org/psr/psr-7/). - -Note that this is not a HTTP message implementation of its own. It is merely an -interface that describes a HTTP message. See the specification for more details. - -Usage ------ - -We'll certainly need some stuff in here. \ No newline at end of file diff --git a/vendor/psr/http-message/composer.json b/vendor/psr/http-message/composer.json deleted file mode 100644 index b0d2937..0000000 --- a/vendor/psr/http-message/composer.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "psr/http-message", - "description": "Common interface for HTTP messages", - "keywords": ["psr", "psr-7", "http", "http-message", "request", "response"], - "homepage": "https://github.com/php-fig/http-message", - "license": "MIT", - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "require": { - "php": ">=5.3.0" - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - } -} diff --git a/vendor/psr/http-message/src/MessageInterface.php b/vendor/psr/http-message/src/MessageInterface.php deleted file mode 100644 index dd46e5e..0000000 --- a/vendor/psr/http-message/src/MessageInterface.php +++ /dev/null @@ -1,187 +0,0 @@ -<?php - -namespace Psr\Http\Message; - -/** - * HTTP messages consist of requests from a client to a server and responses - * from a server to a client. This interface defines the methods common to - * each. - * - * Messages are considered immutable; all methods that might change state MUST - * be implemented such that they retain the internal state of the current - * message and return an instance that contains the changed state. - * - * @link http://www.ietf.org/rfc/rfc7230.txt - * @link http://www.ietf.org/rfc/rfc7231.txt - */ -interface MessageInterface -{ - /** - * Retrieves the HTTP protocol version as a string. - * - * The string MUST contain only the HTTP version number (e.g., "1.1", "1.0"). - * - * @return string HTTP protocol version. - */ - public function getProtocolVersion(); - - /** - * Return an instance with the specified HTTP protocol version. - * - * The version string MUST contain only the HTTP version number (e.g., - * "1.1", "1.0"). - * - * This method MUST be implemented in such a way as to retain the - * immutability of the message, and MUST return an instance that has the - * new protocol version. - * - * @param string $version HTTP protocol version - * @return static - */ - public function withProtocolVersion($version); - - /** - * Retrieves all message header values. - * - * The keys represent the header name as it will be sent over the wire, and - * each value is an array of strings associated with the header. - * - * // Represent the headers as a string - * foreach ($message->getHeaders() as $name => $values) { - * echo $name . ": " . implode(", ", $values); - * } - * - * // Emit headers iteratively: - * foreach ($message->getHeaders() as $name => $values) { - * foreach ($values as $value) { - * header(sprintf('%s: %s', $name, $value), false); - * } - * } - * - * While header names are not case-sensitive, getHeaders() will preserve the - * exact case in which headers were originally specified. - * - * @return string[][] Returns an associative array of the message's headers. Each - * key MUST be a header name, and each value MUST be an array of strings - * for that header. - */ - public function getHeaders(); - - /** - * Checks if a header exists by the given case-insensitive name. - * - * @param string $name Case-insensitive header field name. - * @return bool Returns true if any header names match the given header - * name using a case-insensitive string comparison. Returns false if - * no matching header name is found in the message. - */ - public function hasHeader($name); - - /** - * Retrieves a message header value by the given case-insensitive name. - * - * This method returns an array of all the header values of the given - * case-insensitive header name. - * - * If the header does not appear in the message, this method MUST return an - * empty array. - * - * @param string $name Case-insensitive header field name. - * @return string[] An array of string values as provided for the given - * header. If the header does not appear in the message, this method MUST - * return an empty array. - */ - public function getHeader($name); - - /** - * Retrieves a comma-separated string of the values for a single header. - * - * This method returns all of the header values of the given - * case-insensitive header name as a string concatenated together using - * a comma. - * - * NOTE: Not all header values may be appropriately represented using - * comma concatenation. For such headers, use getHeader() instead - * and supply your own delimiter when concatenating. - * - * If the header does not appear in the message, this method MUST return - * an empty string. - * - * @param string $name Case-insensitive header field name. - * @return string A string of values as provided for the given header - * concatenated together using a comma. If the header does not appear in - * the message, this method MUST return an empty string. - */ - public function getHeaderLine($name); - - /** - * Return an instance with the provided value replacing the specified header. - * - * While header names are case-insensitive, the casing of the header will - * be preserved by this function, and returned from getHeaders(). - * - * This method MUST be implemented in such a way as to retain the - * immutability of the message, and MUST return an instance that has the - * new and/or updated header and value. - * - * @param string $name Case-insensitive header field name. - * @param string|string[] $value Header value(s). - * @return static - * @throws \InvalidArgumentException for invalid header names or values. - */ - public function withHeader($name, $value); - - /** - * Return an instance with the specified header appended with the given value. - * - * Existing values for the specified header will be maintained. The new - * value(s) will be appended to the existing list. If the header did not - * exist previously, it will be added. - * - * This method MUST be implemented in such a way as to retain the - * immutability of the message, and MUST return an instance that has the - * new header and/or value. - * - * @param string $name Case-insensitive header field name to add. - * @param string|string[] $value Header value(s). - * @return static - * @throws \InvalidArgumentException for invalid header names or values. - */ - public function withAddedHeader($name, $value); - - /** - * Return an instance without the specified header. - * - * Header resolution MUST be done without case-sensitivity. - * - * This method MUST be implemented in such a way as to retain the - * immutability of the message, and MUST return an instance that removes - * the named header. - * - * @param string $name Case-insensitive header field name to remove. - * @return static - */ - public function withoutHeader($name); - - /** - * Gets the body of the message. - * - * @return StreamInterface Returns the body as a stream. - */ - public function getBody(); - - /** - * Return an instance with the specified message body. - * - * The body MUST be a StreamInterface object. - * - * This method MUST be implemented in such a way as to retain the - * immutability of the message, and MUST return a new instance that has the - * new body stream. - * - * @param StreamInterface $body Body. - * @return static - * @throws \InvalidArgumentException When the body is not valid. - */ - public function withBody(StreamInterface $body); -} diff --git a/vendor/psr/http-message/src/RequestInterface.php b/vendor/psr/http-message/src/RequestInterface.php deleted file mode 100644 index a96d4fd..0000000 --- a/vendor/psr/http-message/src/RequestInterface.php +++ /dev/null @@ -1,129 +0,0 @@ -<?php - -namespace Psr\Http\Message; - -/** - * Representation of an outgoing, client-side request. - * - * Per the HTTP specification, this interface includes properties for - * each of the following: - * - * - Protocol version - * - HTTP method - * - URI - * - Headers - * - Message body - * - * During construction, implementations MUST attempt to set the Host header from - * a provided URI if no Host header is provided. - * - * Requests are considered immutable; all methods that might change state MUST - * be implemented such that they retain the internal state of the current - * message and return an instance that contains the changed state. - */ -interface RequestInterface extends MessageInterface -{ - /** - * Retrieves the message's request target. - * - * Retrieves the message's request-target either as it will appear (for - * clients), as it appeared at request (for servers), or as it was - * specified for the instance (see withRequestTarget()). - * - * In most cases, this will be the origin-form of the composed URI, - * unless a value was provided to the concrete implementation (see - * withRequestTarget() below). - * - * If no URI is available, and no request-target has been specifically - * provided, this method MUST return the string "/". - * - * @return string - */ - public function getRequestTarget(); - - /** - * Return an instance with the specific request-target. - * - * If the request needs a non-origin-form request-target — e.g., for - * specifying an absolute-form, authority-form, or asterisk-form — - * this method may be used to create an instance with the specified - * request-target, verbatim. - * - * This method MUST be implemented in such a way as to retain the - * immutability of the message, and MUST return an instance that has the - * changed request target. - * - * @link http://tools.ietf.org/html/rfc7230#section-5.3 (for the various - * request-target forms allowed in request messages) - * @param mixed $requestTarget - * @return static - */ - public function withRequestTarget($requestTarget); - - /** - * Retrieves the HTTP method of the request. - * - * @return string Returns the request method. - */ - public function getMethod(); - - /** - * Return an instance with the provided HTTP method. - * - * While HTTP method names are typically all uppercase characters, HTTP - * method names are case-sensitive and thus implementations SHOULD NOT - * modify the given string. - * - * This method MUST be implemented in such a way as to retain the - * immutability of the message, and MUST return an instance that has the - * changed request method. - * - * @param string $method Case-sensitive method. - * @return static - * @throws \InvalidArgumentException for invalid HTTP methods. - */ - public function withMethod($method); - - /** - * Retrieves the URI instance. - * - * This method MUST return a UriInterface instance. - * - * @link http://tools.ietf.org/html/rfc3986#section-4.3 - * @return UriInterface Returns a UriInterface instance - * representing the URI of the request. - */ - public function getUri(); - - /** - * Returns an instance with the provided URI. - * - * This method MUST update the Host header of the returned request by - * default if the URI contains a host component. If the URI does not - * contain a host component, any pre-existing Host header MUST be carried - * over to the returned request. - * - * You can opt-in to preserving the original state of the Host header by - * setting `$preserveHost` to `true`. When `$preserveHost` is set to - * `true`, this method interacts with the Host header in the following ways: - * - * - If the Host header is missing or empty, and the new URI contains - * a host component, this method MUST update the Host header in the returned - * request. - * - If the Host header is missing or empty, and the new URI does not contain a - * host component, this method MUST NOT update the Host header in the returned - * request. - * - If a Host header is present and non-empty, this method MUST NOT update - * the Host header in the returned request. - * - * This method MUST be implemented in such a way as to retain the - * immutability of the message, and MUST return an instance that has the - * new UriInterface instance. - * - * @link http://tools.ietf.org/html/rfc3986#section-4.3 - * @param UriInterface $uri New request URI to use. - * @param bool $preserveHost Preserve the original state of the Host header. - * @return static - */ - public function withUri(UriInterface $uri, $preserveHost = false); -} diff --git a/vendor/psr/http-message/src/ResponseInterface.php b/vendor/psr/http-message/src/ResponseInterface.php deleted file mode 100644 index c306514..0000000 --- a/vendor/psr/http-message/src/ResponseInterface.php +++ /dev/null @@ -1,68 +0,0 @@ -<?php - -namespace Psr\Http\Message; - -/** - * Representation of an outgoing, server-side response. - * - * Per the HTTP specification, this interface includes properties for - * each of the following: - * - * - Protocol version - * - Status code and reason phrase - * - Headers - * - Message body - * - * Responses are considered immutable; all methods that might change state MUST - * be implemented such that they retain the internal state of the current - * message and return an instance that contains the changed state. - */ -interface ResponseInterface extends MessageInterface -{ - /** - * Gets the response status code. - * - * The status code is a 3-digit integer result code of the server's attempt - * to understand and satisfy the request. - * - * @return int Status code. - */ - public function getStatusCode(); - - /** - * Return an instance with the specified status code and, optionally, reason phrase. - * - * If no reason phrase is specified, implementations MAY choose to default - * to the RFC 7231 or IANA recommended reason phrase for the response's - * status code. - * - * This method MUST be implemented in such a way as to retain the - * immutability of the message, and MUST return an instance that has the - * updated status and reason phrase. - * - * @link http://tools.ietf.org/html/rfc7231#section-6 - * @link http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml - * @param int $code The 3-digit integer result code to set. - * @param string $reasonPhrase The reason phrase to use with the - * provided status code; if none is provided, implementations MAY - * use the defaults as suggested in the HTTP specification. - * @return static - * @throws \InvalidArgumentException For invalid status code arguments. - */ - public function withStatus($code, $reasonPhrase = ''); - - /** - * Gets the response reason phrase associated with the status code. - * - * Because a reason phrase is not a required element in a response - * status line, the reason phrase value MAY be null. Implementations MAY - * choose to return the default RFC 7231 recommended reason phrase (or those - * listed in the IANA HTTP Status Code Registry) for the response's - * status code. - * - * @link http://tools.ietf.org/html/rfc7231#section-6 - * @link http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml - * @return string Reason phrase; must return an empty string if none present. - */ - public function getReasonPhrase(); -} diff --git a/vendor/psr/http-message/src/ServerRequestInterface.php b/vendor/psr/http-message/src/ServerRequestInterface.php deleted file mode 100644 index 0251234..0000000 --- a/vendor/psr/http-message/src/ServerRequestInterface.php +++ /dev/null @@ -1,261 +0,0 @@ -<?php - -namespace Psr\Http\Message; - -/** - * Representation of an incoming, server-side HTTP request. - * - * Per the HTTP specification, this interface includes properties for - * each of the following: - * - * - Protocol version - * - HTTP method - * - URI - * - Headers - * - Message body - * - * Additionally, it encapsulates all data as it has arrived to the - * application from the CGI and/or PHP environment, including: - * - * - The values represented in $_SERVER. - * - Any cookies provided (generally via $_COOKIE) - * - Query string arguments (generally via $_GET, or as parsed via parse_str()) - * - Upload files, if any (as represented by $_FILES) - * - Deserialized body parameters (generally from $_POST) - * - * $_SERVER values MUST be treated as immutable, as they represent application - * state at the time of request; as such, no methods are provided to allow - * modification of those values. The other values provide such methods, as they - * can be restored from $_SERVER or the request body, and may need treatment - * during the application (e.g., body parameters may be deserialized based on - * content type). - * - * Additionally, this interface recognizes the utility of introspecting a - * request to derive and match additional parameters (e.g., via URI path - * matching, decrypting cookie values, deserializing non-form-encoded body - * content, matching authorization headers to users, etc). These parameters - * are stored in an "attributes" property. - * - * Requests are considered immutable; all methods that might change state MUST - * be implemented such that they retain the internal state of the current - * message and return an instance that contains the changed state. - */ -interface ServerRequestInterface extends RequestInterface -{ - /** - * Retrieve server parameters. - * - * Retrieves data related to the incoming request environment, - * typically derived from PHP's $_SERVER superglobal. The data IS NOT - * REQUIRED to originate from $_SERVER. - * - * @return array - */ - public function getServerParams(); - - /** - * Retrieve cookies. - * - * Retrieves cookies sent by the client to the server. - * - * The data MUST be compatible with the structure of the $_COOKIE - * superglobal. - * - * @return array - */ - public function getCookieParams(); - - /** - * Return an instance with the specified cookies. - * - * The data IS NOT REQUIRED to come from the $_COOKIE superglobal, but MUST - * be compatible with the structure of $_COOKIE. Typically, this data will - * be injected at instantiation. - * - * This method MUST NOT update the related Cookie header of the request - * instance, nor related values in the server params. - * - * This method MUST be implemented in such a way as to retain the - * immutability of the message, and MUST return an instance that has the - * updated cookie values. - * - * @param array $cookies Array of key/value pairs representing cookies. - * @return static - */ - public function withCookieParams(array $cookies); - - /** - * Retrieve query string arguments. - * - * Retrieves the deserialized query string arguments, if any. - * - * Note: the query params might not be in sync with the URI or server - * params. If you need to ensure you are only getting the original - * values, you may need to parse the query string from `getUri()->getQuery()` - * or from the `QUERY_STRING` server param. - * - * @return array - */ - public function getQueryParams(); - - /** - * Return an instance with the specified query string arguments. - * - * These values SHOULD remain immutable over the course of the incoming - * request. They MAY be injected during instantiation, such as from PHP's - * $_GET superglobal, or MAY be derived from some other value such as the - * URI. In cases where the arguments are parsed from the URI, the data - * MUST be compatible with what PHP's parse_str() would return for - * purposes of how duplicate query parameters are handled, and how nested - * sets are handled. - * - * Setting query string arguments MUST NOT change the URI stored by the - * request, nor the values in the server params. - * - * This method MUST be implemented in such a way as to retain the - * immutability of the message, and MUST return an instance that has the - * updated query string arguments. - * - * @param array $query Array of query string arguments, typically from - * $_GET. - * @return static - */ - public function withQueryParams(array $query); - - /** - * Retrieve normalized file upload data. - * - * This method returns upload metadata in a normalized tree, with each leaf - * an instance of Psr\Http\Message\UploadedFileInterface. - * - * These values MAY be prepared from $_FILES or the message body during - * instantiation, or MAY be injected via withUploadedFiles(). - * - * @return array An array tree of UploadedFileInterface instances; an empty - * array MUST be returned if no data is present. - */ - public function getUploadedFiles(); - - /** - * Create a new instance with the specified uploaded files. - * - * This method MUST be implemented in such a way as to retain the - * immutability of the message, and MUST return an instance that has the - * updated body parameters. - * - * @param array $uploadedFiles An array tree of UploadedFileInterface instances. - * @return static - * @throws \InvalidArgumentException if an invalid structure is provided. - */ - public function withUploadedFiles(array $uploadedFiles); - - /** - * Retrieve any parameters provided in the request body. - * - * If the request Content-Type is either application/x-www-form-urlencoded - * or multipart/form-data, and the request method is POST, this method MUST - * return the contents of $_POST. - * - * Otherwise, this method may return any results of deserializing - * the request body content; as parsing returns structured content, the - * potential types MUST be arrays or objects only. A null value indicates - * the absence of body content. - * - * @return null|array|object The deserialized body parameters, if any. - * These will typically be an array or object. - */ - public function getParsedBody(); - - /** - * Return an instance with the specified body parameters. - * - * These MAY be injected during instantiation. - * - * If the request Content-Type is either application/x-www-form-urlencoded - * or multipart/form-data, and the request method is POST, use this method - * ONLY to inject the contents of $_POST. - * - * The data IS NOT REQUIRED to come from $_POST, but MUST be the results of - * deserializing the request body content. Deserialization/parsing returns - * structured data, and, as such, this method ONLY accepts arrays or objects, - * or a null value if nothing was available to parse. - * - * As an example, if content negotiation determines that the request data - * is a JSON payload, this method could be used to create a request - * instance with the deserialized parameters. - * - * This method MUST be implemented in such a way as to retain the - * immutability of the message, and MUST return an instance that has the - * updated body parameters. - * - * @param null|array|object $data The deserialized body data. This will - * typically be in an array or object. - * @return static - * @throws \InvalidArgumentException if an unsupported argument type is - * provided. - */ - public function withParsedBody($data); - - /** - * Retrieve attributes derived from the request. - * - * The request "attributes" may be used to allow injection of any - * parameters derived from the request: e.g., the results of path - * match operations; the results of decrypting cookies; the results of - * deserializing non-form-encoded message bodies; etc. Attributes - * will be application and request specific, and CAN be mutable. - * - * @return array Attributes derived from the request. - */ - public function getAttributes(); - - /** - * Retrieve a single derived request attribute. - * - * Retrieves a single derived request attribute as described in - * getAttributes(). If the attribute has not been previously set, returns - * the default value as provided. - * - * This method obviates the need for a hasAttribute() method, as it allows - * specifying a default value to return if the attribute is not found. - * - * @see getAttributes() - * @param string $name The attribute name. - * @param mixed $default Default value to return if the attribute does not exist. - * @return mixed - */ - public function getAttribute($name, $default = null); - - /** - * Return an instance with the specified derived request attribute. - * - * This method allows setting a single derived request attribute as - * described in getAttributes(). - * - * This method MUST be implemented in such a way as to retain the - * immutability of the message, and MUST return an instance that has the - * updated attribute. - * - * @see getAttributes() - * @param string $name The attribute name. - * @param mixed $value The value of the attribute. - * @return static - */ - public function withAttribute($name, $value); - - /** - * Return an instance that removes the specified derived request attribute. - * - * This method allows removing a single derived request attribute as - * described in getAttributes(). - * - * This method MUST be implemented in such a way as to retain the - * immutability of the message, and MUST return an instance that removes - * the attribute. - * - * @see getAttributes() - * @param string $name The attribute name. - * @return static - */ - public function withoutAttribute($name); -} diff --git a/vendor/psr/http-message/src/StreamInterface.php b/vendor/psr/http-message/src/StreamInterface.php deleted file mode 100644 index f68f391..0000000 --- a/vendor/psr/http-message/src/StreamInterface.php +++ /dev/null @@ -1,158 +0,0 @@ -<?php - -namespace Psr\Http\Message; - -/** - * Describes a data stream. - * - * Typically, an instance will wrap a PHP stream; this interface provides - * a wrapper around the most common operations, including serialization of - * the entire stream to a string. - */ -interface StreamInterface -{ - /** - * Reads all data from the stream into a string, from the beginning to end. - * - * This method MUST attempt to seek to the beginning of the stream before - * reading data and read the stream until the end is reached. - * - * Warning: This could attempt to load a large amount of data into memory. - * - * This method MUST NOT raise an exception in order to conform with PHP's - * string casting operations. - * - * @see http://php.net/manual/en/language.oop5.magic.php#object.tostring - * @return string - */ - public function __toString(); - - /** - * Closes the stream and any underlying resources. - * - * @return void - */ - public function close(); - - /** - * Separates any underlying resources from the stream. - * - * After the stream has been detached, the stream is in an unusable state. - * - * @return resource|null Underlying PHP stream, if any - */ - public function detach(); - - /** - * Get the size of the stream if known. - * - * @return int|null Returns the size in bytes if known, or null if unknown. - */ - public function getSize(); - - /** - * Returns the current position of the file read/write pointer - * - * @return int Position of the file pointer - * @throws \RuntimeException on error. - */ - public function tell(); - - /** - * Returns true if the stream is at the end of the stream. - * - * @return bool - */ - public function eof(); - - /** - * Returns whether or not the stream is seekable. - * - * @return bool - */ - public function isSeekable(); - - /** - * Seek to a position in the stream. - * - * @link http://www.php.net/manual/en/function.fseek.php - * @param int $offset Stream offset - * @param int $whence Specifies how the cursor position will be calculated - * based on the seek offset. Valid values are identical to the built-in - * PHP $whence values for `fseek()`. SEEK_SET: Set position equal to - * offset bytes SEEK_CUR: Set position to current location plus offset - * SEEK_END: Set position to end-of-stream plus offset. - * @throws \RuntimeException on failure. - */ - public function seek($offset, $whence = SEEK_SET); - - /** - * Seek to the beginning of the stream. - * - * If the stream is not seekable, this method will raise an exception; - * otherwise, it will perform a seek(0). - * - * @see seek() - * @link http://www.php.net/manual/en/function.fseek.php - * @throws \RuntimeException on failure. - */ - public function rewind(); - - /** - * Returns whether or not the stream is writable. - * - * @return bool - */ - public function isWritable(); - - /** - * Write data to the stream. - * - * @param string $string The string that is to be written. - * @return int Returns the number of bytes written to the stream. - * @throws \RuntimeException on failure. - */ - public function write($string); - - /** - * Returns whether or not the stream is readable. - * - * @return bool - */ - public function isReadable(); - - /** - * Read data from the stream. - * - * @param int $length Read up to $length bytes from the object and return - * them. Fewer than $length bytes may be returned if underlying stream - * call returns fewer bytes. - * @return string Returns the data read from the stream, or an empty string - * if no bytes are available. - * @throws \RuntimeException if an error occurs. - */ - public function read($length); - - /** - * Returns the remaining contents in a string - * - * @return string - * @throws \RuntimeException if unable to read or an error occurs while - * reading. - */ - public function getContents(); - - /** - * Get stream metadata as an associative array or retrieve a specific key. - * - * The keys returned are identical to the keys returned from PHP's - * stream_get_meta_data() function. - * - * @link http://php.net/manual/en/function.stream-get-meta-data.php - * @param string $key Specific metadata to retrieve. - * @return array|mixed|null Returns an associative array if no key is - * provided. Returns a specific key value if a key is provided and the - * value is found, or null if the key is not found. - */ - public function getMetadata($key = null); -} diff --git a/vendor/psr/http-message/src/UploadedFileInterface.php b/vendor/psr/http-message/src/UploadedFileInterface.php deleted file mode 100644 index f8a6901..0000000 --- a/vendor/psr/http-message/src/UploadedFileInterface.php +++ /dev/null @@ -1,123 +0,0 @@ -<?php - -namespace Psr\Http\Message; - -/** - * Value object representing a file uploaded through an HTTP request. - * - * Instances of this interface are considered immutable; all methods that - * might change state MUST be implemented such that they retain the internal - * state of the current instance and return an instance that contains the - * changed state. - */ -interface UploadedFileInterface -{ - /** - * Retrieve a stream representing the uploaded file. - * - * This method MUST return a StreamInterface instance, representing the - * uploaded file. The purpose of this method is to allow utilizing native PHP - * stream functionality to manipulate the file upload, such as - * stream_copy_to_stream() (though the result will need to be decorated in a - * native PHP stream wrapper to work with such functions). - * - * If the moveTo() method has been called previously, this method MUST raise - * an exception. - * - * @return StreamInterface Stream representation of the uploaded file. - * @throws \RuntimeException in cases when no stream is available or can be - * created. - */ - public function getStream(); - - /** - * Move the uploaded file to a new location. - * - * Use this method as an alternative to move_uploaded_file(). This method is - * guaranteed to work in both SAPI and non-SAPI environments. - * Implementations must determine which environment they are in, and use the - * appropriate method (move_uploaded_file(), rename(), or a stream - * operation) to perform the operation. - * - * $targetPath may be an absolute path, or a relative path. If it is a - * relative path, resolution should be the same as used by PHP's rename() - * function. - * - * The original file or stream MUST be removed on completion. - * - * If this method is called more than once, any subsequent calls MUST raise - * an exception. - * - * When used in an SAPI environment where $_FILES is populated, when writing - * files via moveTo(), is_uploaded_file() and move_uploaded_file() SHOULD be - * used to ensure permissions and upload status are verified correctly. - * - * If you wish to move to a stream, use getStream(), as SAPI operations - * cannot guarantee writing to stream destinations. - * - * @see http://php.net/is_uploaded_file - * @see http://php.net/move_uploaded_file - * @param string $targetPath Path to which to move the uploaded file. - * @throws \InvalidArgumentException if the $targetPath specified is invalid. - * @throws \RuntimeException on any error during the move operation, or on - * the second or subsequent call to the method. - */ - public function moveTo($targetPath); - - /** - * Retrieve the file size. - * - * Implementations SHOULD return the value stored in the "size" key of - * the file in the $_FILES array if available, as PHP calculates this based - * on the actual size transmitted. - * - * @return int|null The file size in bytes or null if unknown. - */ - public function getSize(); - - /** - * Retrieve the error associated with the uploaded file. - * - * The return value MUST be one of PHP's UPLOAD_ERR_XXX constants. - * - * If the file was uploaded successfully, this method MUST return - * UPLOAD_ERR_OK. - * - * Implementations SHOULD return the value stored in the "error" key of - * the file in the $_FILES array. - * - * @see http://php.net/manual/en/features.file-upload.errors.php - * @return int One of PHP's UPLOAD_ERR_XXX constants. - */ - public function getError(); - - /** - * Retrieve the filename sent by the client. - * - * Do not trust the value returned by this method. A client could send - * a malicious filename with the intention to corrupt or hack your - * application. - * - * Implementations SHOULD return the value stored in the "name" key of - * the file in the $_FILES array. - * - * @return string|null The filename sent by the client or null if none - * was provided. - */ - public function getClientFilename(); - - /** - * Retrieve the media type sent by the client. - * - * Do not trust the value returned by this method. A client could send - * a malicious media type with the intention to corrupt or hack your - * application. - * - * Implementations SHOULD return the value stored in the "type" key of - * the file in the $_FILES array. - * - * @return string|null The media type sent by the client or null if none - * was provided. - */ - public function getClientMediaType(); -} diff --git a/vendor/psr/http-message/src/UriInterface.php b/vendor/psr/http-message/src/UriInterface.php deleted file mode 100644 index 9d7ab9e..0000000 --- a/vendor/psr/http-message/src/UriInterface.php +++ /dev/null @@ -1,323 +0,0 @@ -<?php -namespace Psr\Http\Message; - -/** - * Value object representing a URI. - * - * This interface is meant to represent URIs according to RFC 3986 and to - * provide methods for most common operations. Additional functionality for - * working with URIs can be provided on top of the interface or externally. - * Its primary use is for HTTP requests, but may also be used in other - * contexts. - * - * Instances of this interface are considered immutable; all methods that - * might change state MUST be implemented such that they retain the internal - * state of the current instance and return an instance that contains the - * changed state. - * - * Typically the Host header will be also be present in the request message. - * For server-side requests, the scheme will typically be discoverable in the - * server parameters. - * - * @link http://tools.ietf.org/html/rfc3986 (the URI specification) - */ -interface UriInterface -{ - /** - * Retrieve the scheme component of the URI. - * - * If no scheme is present, this method MUST return an empty string. - * - * The value returned MUST be normalized to lowercase, per RFC 3986 - * Section 3.1. - * - * The trailing ":" character is not part of the scheme and MUST NOT be - * added. - * - * @see https://tools.ietf.org/html/rfc3986#section-3.1 - * @return string The URI scheme. - */ - public function getScheme(); - - /** - * Retrieve the authority component of the URI. - * - * If no authority information is present, this method MUST return an empty - * string. - * - * The authority syntax of the URI is: - * - * <pre> - * [user-info@]host[:port] - * </pre> - * - * If the port component is not set or is the standard port for the current - * scheme, it SHOULD NOT be included. - * - * @see https://tools.ietf.org/html/rfc3986#section-3.2 - * @return string The URI authority, in "[user-info@]host[:port]" format. - */ - public function getAuthority(); - - /** - * Retrieve the user information component of the URI. - * - * If no user information is present, this method MUST return an empty - * string. - * - * If a user is present in the URI, this will return that value; - * additionally, if the password is also present, it will be appended to the - * user value, with a colon (":") separating the values. - * - * The trailing "@" character is not part of the user information and MUST - * NOT be added. - * - * @return string The URI user information, in "username[:password]" format. - */ - public function getUserInfo(); - - /** - * Retrieve the host component of the URI. - * - * If no host is present, this method MUST return an empty string. - * - * The value returned MUST be normalized to lowercase, per RFC 3986 - * Section 3.2.2. - * - * @see http://tools.ietf.org/html/rfc3986#section-3.2.2 - * @return string The URI host. - */ - public function getHost(); - - /** - * Retrieve the port component of the URI. - * - * If a port is present, and it is non-standard for the current scheme, - * this method MUST return it as an integer. If the port is the standard port - * used with the current scheme, this method SHOULD return null. - * - * If no port is present, and no scheme is present, this method MUST return - * a null value. - * - * If no port is present, but a scheme is present, this method MAY return - * the standard port for that scheme, but SHOULD return null. - * - * @return null|int The URI port. - */ - public function getPort(); - - /** - * Retrieve the path component of the URI. - * - * The path can either be empty or absolute (starting with a slash) or - * rootless (not starting with a slash). Implementations MUST support all - * three syntaxes. - * - * Normally, the empty path "" and absolute path "/" are considered equal as - * defined in RFC 7230 Section 2.7.3. But this method MUST NOT automatically - * do this normalization because in contexts with a trimmed base path, e.g. - * the front controller, this difference becomes significant. It's the task - * of the user to handle both "" and "/". - * - * The value returned MUST be percent-encoded, but MUST NOT double-encode - * any characters. To determine what characters to encode, please refer to - * RFC 3986, Sections 2 and 3.3. - * - * As an example, if the value should include a slash ("/") not intended as - * delimiter between path segments, that value MUST be passed in encoded - * form (e.g., "%2F") to the instance. - * - * @see https://tools.ietf.org/html/rfc3986#section-2 - * @see https://tools.ietf.org/html/rfc3986#section-3.3 - * @return string The URI path. - */ - public function getPath(); - - /** - * Retrieve the query string of the URI. - * - * If no query string is present, this method MUST return an empty string. - * - * The leading "?" character is not part of the query and MUST NOT be - * added. - * - * The value returned MUST be percent-encoded, but MUST NOT double-encode - * any characters. To determine what characters to encode, please refer to - * RFC 3986, Sections 2 and 3.4. - * - * As an example, if a value in a key/value pair of the query string should - * include an ampersand ("&") not intended as a delimiter between values, - * that value MUST be passed in encoded form (e.g., "%26") to the instance. - * - * @see https://tools.ietf.org/html/rfc3986#section-2 - * @see https://tools.ietf.org/html/rfc3986#section-3.4 - * @return string The URI query string. - */ - public function getQuery(); - - /** - * Retrieve the fragment component of the URI. - * - * If no fragment is present, this method MUST return an empty string. - * - * The leading "#" character is not part of the fragment and MUST NOT be - * added. - * - * The value returned MUST be percent-encoded, but MUST NOT double-encode - * any characters. To determine what characters to encode, please refer to - * RFC 3986, Sections 2 and 3.5. - * - * @see https://tools.ietf.org/html/rfc3986#section-2 - * @see https://tools.ietf.org/html/rfc3986#section-3.5 - * @return string The URI fragment. - */ - public function getFragment(); - - /** - * Return an instance with the specified scheme. - * - * This method MUST retain the state of the current instance, and return - * an instance that contains the specified scheme. - * - * Implementations MUST support the schemes "http" and "https" case - * insensitively, and MAY accommodate other schemes if required. - * - * An empty scheme is equivalent to removing the scheme. - * - * @param string $scheme The scheme to use with the new instance. - * @return static A new instance with the specified scheme. - * @throws \InvalidArgumentException for invalid or unsupported schemes. - */ - public function withScheme($scheme); - - /** - * Return an instance with the specified user information. - * - * This method MUST retain the state of the current instance, and return - * an instance that contains the specified user information. - * - * Password is optional, but the user information MUST include the - * user; an empty string for the user is equivalent to removing user - * information. - * - * @param string $user The user name to use for authority. - * @param null|string $password The password associated with $user. - * @return static A new instance with the specified user information. - */ - public function withUserInfo($user, $password = null); - - /** - * Return an instance with the specified host. - * - * This method MUST retain the state of the current instance, and return - * an instance that contains the specified host. - * - * An empty host value is equivalent to removing the host. - * - * @param string $host The hostname to use with the new instance. - * @return static A new instance with the specified host. - * @throws \InvalidArgumentException for invalid hostnames. - */ - public function withHost($host); - - /** - * Return an instance with the specified port. - * - * This method MUST retain the state of the current instance, and return - * an instance that contains the specified port. - * - * Implementations MUST raise an exception for ports outside the - * established TCP and UDP port ranges. - * - * A null value provided for the port is equivalent to removing the port - * information. - * - * @param null|int $port The port to use with the new instance; a null value - * removes the port information. - * @return static A new instance with the specified port. - * @throws \InvalidArgumentException for invalid ports. - */ - public function withPort($port); - - /** - * Return an instance with the specified path. - * - * This method MUST retain the state of the current instance, and return - * an instance that contains the specified path. - * - * The path can either be empty or absolute (starting with a slash) or - * rootless (not starting with a slash). Implementations MUST support all - * three syntaxes. - * - * If the path is intended to be domain-relative rather than path relative then - * it must begin with a slash ("/"). Paths not starting with a slash ("/") - * are assumed to be relative to some base path known to the application or - * consumer. - * - * Users can provide both encoded and decoded path characters. - * Implementations ensure the correct encoding as outlined in getPath(). - * - * @param string $path The path to use with the new instance. - * @return static A new instance with the specified path. - * @throws \InvalidArgumentException for invalid paths. - */ - public function withPath($path); - - /** - * Return an instance with the specified query string. - * - * This method MUST retain the state of the current instance, and return - * an instance that contains the specified query string. - * - * Users can provide both encoded and decoded query characters. - * Implementations ensure the correct encoding as outlined in getQuery(). - * - * An empty query string value is equivalent to removing the query string. - * - * @param string $query The query string to use with the new instance. - * @return static A new instance with the specified query string. - * @throws \InvalidArgumentException for invalid query strings. - */ - public function withQuery($query); - - /** - * Return an instance with the specified URI fragment. - * - * This method MUST retain the state of the current instance, and return - * an instance that contains the specified URI fragment. - * - * Users can provide both encoded and decoded fragment characters. - * Implementations ensure the correct encoding as outlined in getFragment(). - * - * An empty fragment value is equivalent to removing the fragment. - * - * @param string $fragment The fragment to use with the new instance. - * @return static A new instance with the specified fragment. - */ - public function withFragment($fragment); - - /** - * Return the string representation as a URI reference. - * - * Depending on which components of the URI are present, the resulting - * string is either a full URI or relative reference according to RFC 3986, - * Section 4.1. The method concatenates the various components of the URI, - * using the appropriate delimiters: - * - * - If a scheme is present, it MUST be suffixed by ":". - * - If an authority is present, it MUST be prefixed by "//". - * - The path can be concatenated without delimiters. But there are two - * cases where the path has to be adjusted to make the URI reference - * valid as PHP does not allow to throw an exception in __toString(): - * - If the path is rootless and an authority is present, the path MUST - * be prefixed by "/". - * - If the path is starting with more than one "/" and no authority is - * present, the starting slashes MUST be reduced to one. - * - If a query is present, it MUST be prefixed by "?". - * - If a fragment is present, it MUST be prefixed by "#". - * - * @see http://tools.ietf.org/html/rfc3986#section-4.1 - * @return string - */ - public function __toString(); -} diff --git a/vendor/slim/slim/CONTRIBUTING.md b/vendor/slim/slim/CONTRIBUTING.md deleted file mode 100644 index 9bbb6b1..0000000 --- a/vendor/slim/slim/CONTRIBUTING.md +++ /dev/null @@ -1,20 +0,0 @@ -# How to Contribute - -## Pull Requests - -1. Fork the Slim Framework repository -2. Create a new branch for each feature or improvement -3. Send a pull request from each feature branch to the **develop** branch - -It is very important to separate new features or improvements into separate feature branches, and to send a -pull request for each branch. This allows me to review and pull in new features or improvements individually. - -## Style Guide - -All pull requests must adhere to the [PSR-2 standard](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md). - -## Unit Testing - -All pull requests must be accompanied by passing unit tests and complete code coverage. The Slim Framework uses phpunit for testing. - -[Learn about PHPUnit](https://github.com/sebastianbergmann/phpunit/) diff --git a/vendor/slim/slim/LICENSE.md b/vendor/slim/slim/LICENSE.md deleted file mode 100644 index 0875f84..0000000 --- a/vendor/slim/slim/LICENSE.md +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2011-2016 Josh Lockhart - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/vendor/slim/slim/README.md b/vendor/slim/slim/README.md deleted file mode 100644 index d20f393..0000000 --- a/vendor/slim/slim/README.md +++ /dev/null @@ -1,84 +0,0 @@ -# Slim Framework - -[](https://travis-ci.org/slimphp/Slim) -[](https://coveralls.io/r/slimphp/Slim) -[](https://packagist.org/packages/slim/slim) -[](https://packagist.org/packages/slim/slim) - -Slim is a PHP micro-framework that helps you quickly write simple yet powerful web applications and APIs. - -## Installation - -It's recommended that you use [Composer](https://getcomposer.org/) to install Slim. - -```bash -$ composer require slim/slim "^3.0" -``` - -This will install Slim and all required dependencies. Slim requires PHP 5.5.0 or newer. - -## Usage - -Create an index.php file with the following contents: - -```php -<?php - -require 'vendor/autoload.php'; - -$app = new Slim\App(); - -$app->get('/hello/{name}', function ($request, $response, $args) { - $response->write("Hello, " . $args['name']); - return $response; -}); - -$app->run(); -``` - -You may quickly test this using the built-in PHP server: -```bash -$ php -S localhost:8000 -``` - -Going to http://localhost:8000/hello/world will now display "Hello, world". - -For more information on how to configure your web server, see the [Documentation](http://www.slimframework.com/docs/start/web-servers.html). - -## Tests - -To execute the test suite, you'll need phpunit. - -```bash -$ phpunit -``` - -## Contributing - -Please see [CONTRIBUTING](CONTRIBUTING.md) for details. - -## Learn More - -Learn more at these links: - -- [Website](http://www.slimframework.com) -- [Documentation](http://www.slimframework.com/docs/start/installation.html) -- [Support Forum](http://help.slimframework.com) -- [Twitter](https://twitter.com/slimphp) -- [Resources](https://github.com/xssc/awesome-slim) - -## Security - -If you discover security related issues, please email security@slimframework.com instead of using the issue tracker. - -## Credits - -- [Josh Lockhart](https://github.com/codeguy) -- [Andrew Smith](https://github.com/silentworks) -- [Rob Allen](https://github.com/akrabat) -- [Gabriel Manricks](https://github.com/gmanricks) -- [All Contributors](../../contributors) - -## License - -The Slim Framework is licensed under the MIT license. See [License File](LICENSE.md) for more information. diff --git a/vendor/slim/slim/Slim/App.php b/vendor/slim/slim/Slim/App.php deleted file mode 100644 index c083539..0000000 --- a/vendor/slim/slim/Slim/App.php +++ /dev/null @@ -1,644 +0,0 @@ -<?php -/** - * Slim Framework (http://slimframework.com) - * - * @link https://github.com/slimphp/Slim - * @copyright Copyright (c) 2011-2016 Josh Lockhart - * @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License) - */ -namespace Slim; - -use Exception; -use Throwable; -use Closure; -use InvalidArgumentException; -use Psr\Http\Message\RequestInterface; -use Psr\Http\Message\ServerRequestInterface; -use Psr\Http\Message\ResponseInterface; -use Interop\Container\ContainerInterface; -use FastRoute\Dispatcher; -use Slim\Exception\SlimException; -use Slim\Exception\MethodNotAllowedException; -use Slim\Exception\NotFoundException; -use Slim\Http\Uri; -use Slim\Http\Headers; -use Slim\Http\Body; -use Slim\Http\Request; -use Slim\Interfaces\Http\EnvironmentInterface; -use Slim\Interfaces\RouteGroupInterface; -use Slim\Interfaces\RouteInterface; -use Slim\Interfaces\RouterInterface; - -/** - * App - * - * This is the primary class with which you instantiate, - * configure, and run a Slim Framework application. - * The \Slim\App class also accepts Slim Framework middleware. - * - * @property-read array $settings App settings - * @property-read EnvironmentInterface $environment - * @property-read RequestInterface $request - * @property-read ResponseInterface $response - * @property-read RouterInterface $router - * @property-read callable $errorHandler - * @property-read callable $phpErrorHandler - * @property-read callable $notFoundHandler function($request, $response) - * @property-read callable $notAllowedHandler function($request, $response, $allowedHttpMethods) - */ -class App -{ - use MiddlewareAwareTrait; - - /** - * Current version - * - * @var string - */ - const VERSION = '3.5.0'; - - /** - * Container - * - * @var ContainerInterface - */ - private $container; - - /******************************************************************************** - * Constructor - *******************************************************************************/ - - /** - * Create new application - * - * @param ContainerInterface|array $container Either a ContainerInterface or an associative array of app settings - * @throws InvalidArgumentException when no container is provided that implements ContainerInterface - */ - public function __construct($container = []) - { - if (is_array($container)) { - $container = new Container($container); - } - if (!$container instanceof ContainerInterface) { - throw new InvalidArgumentException('Expected a ContainerInterface'); - } - $this->container = $container; - } - - /** - * Enable access to the DI container by consumers of $app - * - * @return ContainerInterface - */ - public function getContainer() - { - return $this->container; - } - - /** - * Add middleware - * - * This method prepends new middleware to the app's middleware stack. - * - * @param callable|string $callable The callback routine - * - * @return static - */ - public function add($callable) - { - return $this->addMiddleware(new DeferredCallable($callable, $this->container)); - } - - /** - * Calling a non-existant method on App checks to see if there's an item - * in the container that is callable and if so, calls it. - * - * @param string $method - * @param array $args - * @return mixed - */ - public function __call($method, $args) - { - if ($this->container->has($method)) { - $obj = $this->container->get($method); - if (is_callable($obj)) { - return call_user_func_array($obj, $args); - } - } - - throw new \BadMethodCallException("Method $method is not a valid method"); - } - - /******************************************************************************** - * Router proxy methods - *******************************************************************************/ - - /** - * Add GET route - * - * @param string $pattern The route URI pattern - * @param callable|string $callable The route callback routine - * - * @return \Slim\Interfaces\RouteInterface - */ - public function get($pattern, $callable) - { - return $this->map(['GET'], $pattern, $callable); - } - - /** - * Add POST route - * - * @param string $pattern The route URI pattern - * @param callable|string $callable The route callback routine - * - * @return \Slim\Interfaces\RouteInterface - */ - public function post($pattern, $callable) - { - return $this->map(['POST'], $pattern, $callable); - } - - /** - * Add PUT route - * - * @param string $pattern The route URI pattern - * @param callable|string $callable The route callback routine - * - * @return \Slim\Interfaces\RouteInterface - */ - public function put($pattern, $callable) - { - return $this->map(['PUT'], $pattern, $callable); - } - - /** - * Add PATCH route - * - * @param string $pattern The route URI pattern - * @param callable|string $callable The route callback routine - * - * @return \Slim\Interfaces\RouteInterface - */ - public function patch($pattern, $callable) - { - return $this->map(['PATCH'], $pattern, $callable); - } - - /** - * Add DELETE route - * - * @param string $pattern The route URI pattern - * @param callable|string $callable The route callback routine - * - * @return \Slim\Interfaces\RouteInterface - */ - public function delete($pattern, $callable) - { - return $this->map(['DELETE'], $pattern, $callable); - } - - /** - * Add OPTIONS route - * - * @param string $pattern The route URI pattern - * @param callable|string $callable The route callback routine - * - * @return \Slim\Interfaces\RouteInterface - */ - public function options($pattern, $callable) - { - return $this->map(['OPTIONS'], $pattern, $callable); - } - - /** - * Add route for any HTTP method - * - * @param string $pattern The route URI pattern - * @param callable|string $callable The route callback routine - * - * @return \Slim\Interfaces\RouteInterface - */ - public function any($pattern, $callable) - { - return $this->map(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'], $pattern, $callable); - } - - /** - * Add route with multiple methods - * - * @param string[] $methods Numeric array of HTTP method names - * @param string $pattern The route URI pattern - * @param callable|string $callable The route callback routine - * - * @return RouteInterface - */ - public function map(array $methods, $pattern, $callable) - { - if ($callable instanceof Closure) { - $callable = $callable->bindTo($this->container); - } - - $route = $this->container->get('router')->map($methods, $pattern, $callable); - if (is_callable([$route, 'setContainer'])) { - $route->setContainer($this->container); - } - - if (is_callable([$route, 'setOutputBuffering'])) { - $route->setOutputBuffering($this->container->get('settings')['outputBuffering']); - } - - return $route; - } - - /** - * Route Groups - * - * This method accepts a route pattern and a callback. All route - * declarations in the callback will be prepended by the group(s) - * that it is in. - * - * @param string $pattern - * @param callable $callable - * - * @return RouteGroupInterface - */ - public function group($pattern, $callable) - { - /** @var RouteGroup $group */ - $group = $this->container->get('router')->pushGroup($pattern, $callable); - $group->setContainer($this->container); - $group($this); - $this->container->get('router')->popGroup(); - return $group; - } - - /******************************************************************************** - * Runner - *******************************************************************************/ - - /** - * Run application - * - * This method traverses the application middleware stack and then sends the - * resultant Response object to the HTTP client. - * - * @param bool|false $silent - * @return ResponseInterface - * - * @throws Exception - * @throws MethodNotAllowedException - * @throws NotFoundException - */ - public function run($silent = false) - { - $request = $this->container->get('request'); - $response = $this->container->get('response'); - - $response = $this->process($request, $response); - - if (!$silent) { - $this->respond($response); - } - - return $response; - } - - /** - * Process a request - * - * This method traverses the application middleware stack and then returns the - * resultant Response object. - * - * @param ServerRequestInterface $request - * @param ResponseInterface $response - * @return ResponseInterface - * - * @throws Exception - * @throws MethodNotAllowedException - * @throws NotFoundException - */ - public function process(ServerRequestInterface $request, ResponseInterface $response) - { - // Ensure basePath is set - $router = $this->container->get('router'); - if (is_callable([$request->getUri(), 'getBasePath']) && is_callable([$router, 'setBasePath'])) { - $router->setBasePath($request->getUri()->getBasePath()); - } - - // Dispatch the Router first if the setting for this is on - if ($this->container->get('settings')['determineRouteBeforeAppMiddleware'] === true) { - // Dispatch router (note: you won't be able to alter routes after this) - $request = $this->dispatchRouterAndPrepareRoute($request, $router); - } - - // Traverse middleware stack - try { - $response = $this->callMiddlewareStack($request, $response); - } catch (Exception $e) { - $response = $this->handleException($e, $request, $response); - } catch (Throwable $e) { - $response = $this->handlePhpError($e, $request, $response); - } - - $response = $this->finalize($response); - - return $response; - } - - /** - * Send the response the client - * - * @param ResponseInterface $response - */ - public function respond(ResponseInterface $response) - { - // Send response - if (!headers_sent()) { - // Status - header(sprintf( - 'HTTP/%s %s %s', - $response->getProtocolVersion(), - $response->getStatusCode(), - $response->getReasonPhrase() - )); - - // Headers - foreach ($response->getHeaders() as $name => $values) { - foreach ($values as $value) { - header(sprintf('%s: %s', $name, $value), false); - } - } - } - - // Body - if (!$this->isEmptyResponse($response)) { - $body = $response->getBody(); - if ($body->isSeekable()) { - $body->rewind(); - } - $settings = $this->container->get('settings'); - $chunkSize = $settings['responseChunkSize']; - - $contentLength = $response->getHeaderLine('Content-Length'); - if (!$contentLength) { - $contentLength = $body->getSize(); - } - - - if (isset($contentLength)) { - $amountToRead = $contentLength; - while ($amountToRead > 0 && !$body->eof()) { - $data = $body->read(min($chunkSize, $amountToRead)); - echo $data; - - $amountToRead -= strlen($data); - - if (connection_status() != CONNECTION_NORMAL) { - break; - } - } - } else { - while (!$body->eof()) { - echo $body->read($chunkSize); - if (connection_status() != CONNECTION_NORMAL) { - break; - } - } - } - } - } - - /** - * Invoke application - * - * This method implements the middleware interface. It receives - * Request and Response objects, and it returns a Response object - * after compiling the routes registered in the Router and dispatching - * the Request object to the appropriate Route callback routine. - * - * @param ServerRequestInterface $request The most recent Request object - * @param ResponseInterface $response The most recent Response object - * - * @return ResponseInterface - * @throws MethodNotAllowedException - * @throws NotFoundException - */ - public function __invoke(ServerRequestInterface $request, ResponseInterface $response) - { - // Get the route info - $routeInfo = $request->getAttribute('routeInfo'); - - /** @var \Slim\Interfaces\RouterInterface $router */ - $router = $this->container->get('router'); - - // If router hasn't been dispatched or the URI changed then dispatch - if (null === $routeInfo || ($routeInfo['request'] !== [$request->getMethod(), (string) $request->getUri()])) { - $request = $this->dispatchRouterAndPrepareRoute($request, $router); - $routeInfo = $request->getAttribute('routeInfo'); - } - - if ($routeInfo[0] === Dispatcher::FOUND) { - $route = $router->lookupRoute($routeInfo[1]); - return $route->run($request, $response); - } elseif ($routeInfo[0] === Dispatcher::METHOD_NOT_ALLOWED) { - if (!$this->container->has('notAllowedHandler')) { - throw new MethodNotAllowedException($request, $response, $routeInfo[1]); - } - /** @var callable $notAllowedHandler */ - $notAllowedHandler = $this->container->get('notAllowedHandler'); - return $notAllowedHandler($request, $response, $routeInfo[1]); - } - - if (!$this->container->has('notFoundHandler')) { - throw new NotFoundException($request, $response); - } - /** @var callable $notFoundHandler */ - $notFoundHandler = $this->container->get('notFoundHandler'); - return $notFoundHandler($request, $response); - } - - /** - * Perform a sub-request from within an application route - * - * This method allows you to prepare and initiate a sub-request, run within - * the context of the current request. This WILL NOT issue a remote HTTP - * request. Instead, it will route the provided URL, method, headers, - * cookies, body, and server variables against the set of registered - * application routes. The result response object is returned. - * - * @param string $method The request method (e.g., GET, POST, PUT, etc.) - * @param string $path The request URI path - * @param string $query The request URI query string - * @param array $headers The request headers (key-value array) - * @param array $cookies The request cookies (key-value array) - * @param string $bodyContent The request body - * @param ResponseInterface $response The response object (optional) - * @return ResponseInterface - */ - public function subRequest( - $method, - $path, - $query = '', - array $headers = [], - array $cookies = [], - $bodyContent = '', - ResponseInterface $response = null - ) { - $env = $this->container->get('environment'); - $uri = Uri::createFromEnvironment($env)->withPath($path)->withQuery($query); - $headers = new Headers($headers); - $serverParams = $env->all(); - $body = new Body(fopen('php://temp', 'r+')); - $body->write($bodyContent); - $body->rewind(); - $request = new Request($method, $uri, $headers, $cookies, $serverParams, $body); - - if (!$response) { - $response = $this->container->get('response'); - } - - return $this($request, $response); - } - - /** - * Dispatch the router to find the route. Prepare the route for use. - * - * @param ServerRequestInterface $request - * @param RouterInterface $router - * @return ServerRequestInterface - */ - protected function dispatchRouterAndPrepareRoute(ServerRequestInterface $request, RouterInterface $router) - { - $routeInfo = $router->dispatch($request); - - if ($routeInfo[0] === Dispatcher::FOUND) { - $routeArguments = []; - foreach ($routeInfo[2] as $k => $v) { - $routeArguments[$k] = urldecode($v); - } - - $route = $router->lookupRoute($routeInfo[1]); - $route->prepare($request, $routeArguments); - - // add route to the request's attributes in case a middleware or handler needs access to the route - $request = $request->withAttribute('route', $route); - } - - $routeInfo['request'] = [$request->getMethod(), (string) $request->getUri()]; - - return $request->withAttribute('routeInfo', $routeInfo); - } - - /** - * Finalize response - * - * @param ResponseInterface $response - * @return ResponseInterface - */ - protected function finalize(ResponseInterface $response) - { - // stop PHP sending a Content-Type automatically - ini_set('default_mimetype', ''); - - if ($this->isEmptyResponse($response)) { - return $response->withoutHeader('Content-Type')->withoutHeader('Content-Length'); - } - - // Add Content-Length header if `addContentLengthHeader` setting is set - if (isset($this->container->get('settings')['addContentLengthHeader']) && - $this->container->get('settings')['addContentLengthHeader'] == true) { - if (ob_get_length() > 0) { - throw new \RuntimeException("Unexpected data in output buffer. " . - "Maybe you have characters before an opening <?php tag?"); - } - $size = $response->getBody()->getSize(); - if ($size !== null && !$response->hasHeader('Content-Length')) { - $response = $response->withHeader('Content-Length', (string) $size); - } - } - - return $response; - } - - /** - * Helper method, which returns true if the provided response must not output a body and false - * if the response could have a body. - * - * @see https://tools.ietf.org/html/rfc7231 - * - * @param ResponseInterface $response - * @return bool - */ - protected function isEmptyResponse(ResponseInterface $response) - { - if (method_exists($response, 'isEmpty')) { - return $response->isEmpty(); - } - - return in_array($response->getStatusCode(), [204, 205, 304]); - } - - /** - * Call relevant handler from the Container if needed. If it doesn't exist, - * then just re-throw. - * - * @param Exception $e - * @param ServerRequestInterface $request - * @param ResponseInterface $response - * - * @return ResponseInterface - * @throws Exception if a handler is needed and not found - */ - protected function handleException(Exception $e, ServerRequestInterface $request, ResponseInterface $response) - { - if ($e instanceof MethodNotAllowedException) { - $handler = 'notAllowedHandler'; - $params = [$e->getRequest(), $e->getResponse(), $e->getAllowedMethods()]; - } elseif ($e instanceof NotFoundException) { - $handler = 'notFoundHandler'; - $params = [$e->getRequest(), $e->getResponse()]; - } elseif ($e instanceof SlimException) { - // This is a Stop exception and contains the response - return $e->getResponse(); - } else { - // Other exception, use $request and $response params - $handler = 'errorHandler'; - $params = [$request, $response, $e]; - } - - if ($this->container->has($handler)) { - $callable = $this->container->get($handler); - // Call the registered handler - return call_user_func_array($callable, $params); - } - - // No handlers found, so just throw the exception - throw $e; - } - - /** - * Call relevant handler from the Container if needed. If it doesn't exist, - * then just re-throw. - * - * @param Throwable $e - * @param ServerRequestInterface $request - * @param ResponseInterface $response - * @return ResponseInterface - * @throws Throwable - */ - protected function handlePhpError(Throwable $e, ServerRequestInterface $request, ResponseInterface $response) - { - $handler = 'phpErrorHandler'; - $params = [$request, $response, $e]; - - if ($this->container->has($handler)) { - $callable = $this->container->get($handler); - // Call the registered handler - return call_user_func_array($callable, $params); - } - - // No handlers found, so just throw the exception - throw $e; - } -} diff --git a/vendor/slim/slim/Slim/CallableResolver.php b/vendor/slim/slim/Slim/CallableResolver.php deleted file mode 100644 index 169ac48..0000000 --- a/vendor/slim/slim/Slim/CallableResolver.php +++ /dev/null @@ -1,90 +0,0 @@ -<?php -/** - * Slim Framework (http://slimframework.com) - * - * @link https://github.com/slimphp/Slim - * @copyright Copyright (c) 2011-2016 Josh Lockhart - * @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License) - */ -namespace Slim; - -use RuntimeException; -use Interop\Container\ContainerInterface; -use Slim\Interfaces\CallableResolverInterface; - -/** - * This class resolves a string of the format 'class:method' into a closure - * that can be dispatched. - */ -final class CallableResolver implements CallableResolverInterface -{ - /** - * @var ContainerInterface - */ - private $container; - - /** - * @param ContainerInterface $container - */ - public function __construct(ContainerInterface $container) - { - $this->container = $container; - } - - /** - * Resolve toResolve into a closure that that the router can dispatch. - * - * If toResolve is of the format 'class:method', then try to extract 'class' - * from the container otherwise instantiate it and then dispatch 'method'. - * - * @param mixed $toResolve - * - * @return callable - * - * @throws RuntimeException if the callable does not exist - * @throws RuntimeException if the callable is not resolvable - */ - public function resolve($toResolve) - { - $resolved = $toResolve; - - if (!is_callable($toResolve) && is_string($toResolve)) { - // check for slim callable as "class:method" - $callablePattern = '!^([^\:]+)\:([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)$!'; - if (preg_match($callablePattern, $toResolve, $matches)) { - $class = $matches[1]; - $method = $matches[2]; - - if ($this->container->has($class)) { - $resolved = [$this->container->get($class), $method]; - } else { - if (!class_exists($class)) { - throw new RuntimeException(sprintf('Callable %s does not exist', $class)); - } - $resolved = [new $class($this->container), $method]; - } - } else { - // check if string is something in the DIC that's callable or is a class name which - // has an __invoke() method - $class = $toResolve; - if ($this->container->has($class)) { - $resolved = $this->container->get($class); - } else { - if (!class_exists($class)) { - throw new RuntimeException(sprintf('Callable %s does not exist', $class)); - } - $resolved = new $class($this->container); - } - } - } - - if (!is_callable($resolved)) { - throw new RuntimeException(sprintf( - '%s is not resolvable', - is_array($toResolve) || is_object($toResolve) ? json_encode($toResolve) : $toResolve - )); - } - - return $resolved; - } -} diff --git a/vendor/slim/slim/Slim/CallableResolverAwareTrait.php b/vendor/slim/slim/Slim/CallableResolverAwareTrait.php deleted file mode 100644 index f7ff485..0000000 --- a/vendor/slim/slim/Slim/CallableResolverAwareTrait.php +++ /dev/null @@ -1,47 +0,0 @@ -<?php -/** - * Slim Framework (http://slimframework.com) - * - * @link https://github.com/slimphp/Slim - * @copyright Copyright (c) 2011-2016 Josh Lockhart - * @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License) - */ -namespace Slim; - -use RuntimeException; -use Interop\Container\ContainerInterface; -use Slim\Interfaces\CallableResolverInterface; - -/** - * ResolveCallable - * - * This is an internal class that enables resolution of 'class:method' strings - * into a closure. This class is an implementation detail and is used only inside - * of the Slim application. - * - * @property ContainerInterface $container - */ -trait CallableResolverAwareTrait -{ - /** - * Resolve a string of the format 'class:method' into a closure that the - * router can dispatch. - * - * @param callable|string $callable - * - * @return \Closure - * - * @throws RuntimeException If the string cannot be resolved as a callable - */ - protected function resolveCallable($callable) - { - if (!$this->container instanceof ContainerInterface) { - return $callable; - } - - /** @var CallableResolverInterface $resolver */ - $resolver = $this->container->get('callableResolver'); - - return $resolver->resolve($callable); - } -} diff --git a/vendor/slim/slim/Slim/Collection.php b/vendor/slim/slim/Slim/Collection.php deleted file mode 100644 index 5d19734..0000000 --- a/vendor/slim/slim/Slim/Collection.php +++ /dev/null @@ -1,202 +0,0 @@ -<?php -/** - * Slim Framework (http://slimframework.com) - * - * @link https://github.com/slimphp/Slim - * @copyright Copyright (c) 2011-2016 Josh Lockhart - * @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License) - */ -namespace Slim; - -use ArrayIterator; -use Slim\Interfaces\CollectionInterface; - -/** - * Collection - * - * This class provides a common interface used by many other - * classes in a Slim application that manage "collections" - * of data that must be inspected and/or manipulated - */ -class Collection implements CollectionInterface -{ - /** - * The source data - * - * @var array - */ - protected $data = []; - - /** - * Create new collection - * - * @param array $items Pre-populate collection with this key-value array - */ - public function __construct(array $items = []) - { - $this->replace($items); - } - - /******************************************************************************** - * Collection interface - *******************************************************************************/ - - /** - * Set collection item - * - * @param string $key The data key - * @param mixed $value The data value - */ - public function set($key, $value) - { - $this->data[$key] = $value; - } - - /** - * Get collection item for key - * - * @param string $key The data key - * @param mixed $default The default value to return if data key does not exist - * - * @return mixed The key's value, or the default value - */ - public function get($key, $default = null) - { - return $this->has($key) ? $this->data[$key] : $default; - } - - /** - * Add item to collection, replacing existing items with the same data key - * - * @param array $items Key-value array of data to append to this collection - */ - public function replace(array $items) - { - foreach ($items as $key => $value) { - $this->set($key, $value); - } - } - - /** - * Get all items in collection - * - * @return array The collection's source data - */ - public function all() - { - return $this->data; - } - - /** - * Get collection keys - * - * @return array The collection's source data keys - */ - public function keys() - { - return array_keys($this->data); - } - - /** - * Does this collection have a given key? - * - * @param string $key The data key - * - * @return bool - */ - public function has($key) - { - return array_key_exists($key, $this->data); - } - - /** - * Remove item from collection - * - * @param string $key The data key - */ - public function remove($key) - { - unset($this->data[$key]); - } - - /** - * Remove all items from collection - */ - public function clear() - { - $this->data = []; - } - - /******************************************************************************** - * ArrayAccess interface - *******************************************************************************/ - - /** - * Does this collection have a given key? - * - * @param string $key The data key - * - * @return bool - */ - public function offsetExists($key) - { - return $this->has($key); - } - - /** - * Get collection item for key - * - * @param string $key The data key - * - * @return mixed The key's value, or the default value - */ - public function offsetGet($key) - { - return $this->get($key); - } - - /** - * Set collection item - * - * @param string $key The data key - * @param mixed $value The data value - */ - public function offsetSet($key, $value) - { - $this->set($key, $value); - } - - /** - * Remove item from collection - * - * @param string $key The data key - */ - public function offsetUnset($key) - { - $this->remove($key); - } - - /** - * Get number of items in collection - * - * @return int - */ - public function count() - { - return count($this->data); - } - - /******************************************************************************** - * IteratorAggregate interface - *******************************************************************************/ - - /** - * Get collection iterator - * - * @return \ArrayIterator - */ - public function getIterator() - { - return new ArrayIterator($this->data); - } -} diff --git a/vendor/slim/slim/Slim/Container.php b/vendor/slim/slim/Slim/Container.php deleted file mode 100644 index 2d15a8d..0000000 --- a/vendor/slim/slim/Slim/Container.php +++ /dev/null @@ -1,179 +0,0 @@ -<?php -/** - * Slim Framework (http://slimframework.com) - * - * @link https://github.com/slimphp/Slim - * @copyright Copyright (c) 2011-2016 Josh Lockhart - * @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License) - */ -namespace Slim; - -use Interop\Container\ContainerInterface; -use Interop\Container\Exception\ContainerException; -use Pimple\Container as PimpleContainer; -use Slim\Exception\ContainerValueNotFoundException; -use Slim\Exception\ContainerException as SlimContainerException; - -/** - * Slim's default DI container is Pimple. - * - * Slim\App expects a container that implements Interop\Container\ContainerInterface - * with these service keys configured and ready for use: - * - * - settings: an array or instance of \ArrayAccess - * - environment: an instance of \Slim\Interfaces\Http\EnvironmentInterface - * - request: an instance of \Psr\Http\Message\ServerRequestInterface - * - response: an instance of \Psr\Http\Message\ResponseInterface - * - router: an instance of \Slim\Interfaces\RouterInterface - * - foundHandler: an instance of \Slim\Interfaces\InvocationStrategyInterface - * - errorHandler: a callable with the signature: function($request, $response, $exception) - * - notFoundHandler: a callable with the signature: function($request, $response) - * - notAllowedHandler: a callable with the signature: function($request, $response, $allowedHttpMethods) - * - callableResolver: an instance of callableResolver - * - * @property-read array settings - * @property-read \Slim\Interfaces\Http\EnvironmentInterface environment - * @property-read \Psr\Http\Message\ServerRequestInterface request - * @property-read \Psr\Http\Message\ResponseInterface response - * @property-read \Slim\Interfaces\RouterInterface router - * @property-read \Slim\Interfaces\InvocationStrategyInterface foundHandler - * @property-read callable errorHandler - * @property-read callable notFoundHandler - * @property-read callable notAllowedHandler - * @property-read \Slim\Interfaces\CallableResolverInterface callableResolver - */ -class Container extends PimpleContainer implements ContainerInterface -{ - /** - * Default settings - * - * @var array - */ - private $defaultSettings = [ - 'httpVersion' => '1.1', - 'responseChunkSize' => 4096, - 'outputBuffering' => 'append', - 'determineRouteBeforeAppMiddleware' => false, - 'displayErrorDetails' => false, - 'addContentLengthHeader' => true, - 'routerCacheFile' => false, - ]; - - /** - * Create new container - * - * @param array $values The parameters or objects. - */ - public function __construct(array $values = []) - { - parent::__construct($values); - - $userSettings = isset($values['settings']) ? $values['settings'] : []; - $this->registerDefaultServices($userSettings); - } - - /** - * This function registers the default services that Slim needs to work. - * - * All services are shared - that is, they are registered such that the - * same instance is returned on subsequent calls. - * - * @param array $userSettings Associative array of application settings - * - * @return void - */ - private function registerDefaultServices($userSettings) - { - $defaultSettings = $this->defaultSettings; - - /** - * This service MUST return an array or an - * instance of \ArrayAccess. - * - * @return array|\ArrayAccess - */ - $this['settings'] = function () use ($userSettings, $defaultSettings) { - return new Collection(array_merge($defaultSettings, $userSettings)); - }; - - $defaultProvider = new DefaultServicesProvider(); - $defaultProvider->register($this); - } - - /******************************************************************************** - * Methods to satisfy Interop\Container\ContainerInterface - *******************************************************************************/ - - /** - * Finds an entry of the container by its identifier and returns it. - * - * @param string $id Identifier of the entry to look for. - * - * @throws ContainerValueNotFoundException No entry was found for this identifier. - * @throws ContainerException Error while retrieving the entry. - * - * @return mixed Entry. - */ - public function get($id) - { - if (!$this->offsetExists($id)) { - throw new ContainerValueNotFoundException(sprintf('Identifier "%s" is not defined.', $id)); - } - try { - return $this->offsetGet($id); - } catch (\InvalidArgumentException $exception) { - if ($this->exceptionThrownByContainer($exception)) { - throw new SlimContainerException( - sprintf('Container error while retrieving "%s"', $id), - null, - $exception - ); - } else { - throw $exception; - } - } - } - - /** - * Tests whether an exception needs to be recast for compliance with Container-Interop. This will be if the - * exception was thrown by Pimple. - * - * @param \InvalidArgumentException $exception - * - * @return bool - */ - private function exceptionThrownByContainer(\InvalidArgumentException $exception) - { - $trace = $exception->getTrace()[0]; - - return $trace['class'] === PimpleContainer::class && $trace['function'] === 'offsetGet'; - } - - /** - * Returns true if the container can return an entry for the given identifier. - * Returns false otherwise. - * - * @param string $id Identifier of the entry to look for. - * - * @return boolean - */ - public function has($id) - { - return $this->offsetExists($id); - } - - - /******************************************************************************** - * Magic methods for convenience - *******************************************************************************/ - - public function __get($name) - { - return $this->get($name); - } - - public function __isset($name) - { - return $this->has($name); - } -} diff --git a/vendor/slim/slim/Slim/DefaultServicesProvider.php b/vendor/slim/slim/Slim/DefaultServicesProvider.php deleted file mode 100644 index 5e1398d..0000000 --- a/vendor/slim/slim/Slim/DefaultServicesProvider.php +++ /dev/null @@ -1,203 +0,0 @@ -<?php -/** - * Slim Framework (http://slimframework.com) - * - * @link https://github.com/slimphp/Slim - * @copyright Copyright (c) 2011-2016 Josh Lockhart - * @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License) - */ -namespace Slim; - -use Psr\Http\Message\ResponseInterface; -use Psr\Http\Message\ServerRequestInterface; -use Slim\Handlers\PhpError; -use Slim\Handlers\Error; -use Slim\Handlers\NotFound; -use Slim\Handlers\NotAllowed; -use Slim\Handlers\Strategies\RequestResponse; -use Slim\Http\Environment; -use Slim\Http\Headers; -use Slim\Http\Request; -use Slim\Http\Response; -use Slim\Interfaces\CallableResolverInterface; -use Slim\Interfaces\Http\EnvironmentInterface; -use Slim\Interfaces\InvocationStrategyInterface; -use Slim\Interfaces\RouterInterface; - -/** - * Slim's default Service Provider. - */ -class DefaultServicesProvider -{ - /** - * Register Slim's default services. - * - * @param Container $container A DI container implementing ArrayAccess and container-interop. - */ - public function register($container) - { - if (!isset($container['environment'])) { - /** - * This service MUST return a shared instance - * of \Slim\Interfaces\Http\EnvironmentInterface. - * - * @return EnvironmentInterface - */ - $container['environment'] = function () { - return new Environment($_SERVER); - }; - } - - if (!isset($container['request'])) { - /** - * PSR-7 Request object - * - * @param Container $container - * - * @return ServerRequestInterface - */ - $container['request'] = function ($container) { - return Request::createFromEnvironment($container->get('environment')); - }; - } - - if (!isset($container['response'])) { - /** - * PSR-7 Response object - * - * @param Container $container - * - * @return ResponseInterface - */ - $container['response'] = function ($container) { - $headers = new Headers(['Content-Type' => 'text/html; charset=UTF-8']); - $response = new Response(200, $headers); - - return $response->withProtocolVersion($container->get('settings')['httpVersion']); - }; - } - - if (!isset($container['router'])) { - /** - * This service MUST return a SHARED instance - * of \Slim\Interfaces\RouterInterface. - * - * @param Container $container - * - * @return RouterInterface - */ - $container['router'] = function ($container) { - $routerCacheFile = false; - if (isset($container->get('settings')['routerCacheFile'])) { - $routerCacheFile = $container->get('settings')['routerCacheFile']; - } - - return (new Router)->setCacheFile($routerCacheFile); - }; - } - - if (!isset($container['foundHandler'])) { - /** - * This service MUST return a SHARED instance - * of \Slim\Interfaces\InvocationStrategyInterface. - * - * @return InvocationStrategyInterface - */ - $container['foundHandler'] = function () { - return new RequestResponse; - }; - } - - if (!isset($container['phpErrorHandler'])) { - /** - * This service MUST return a callable - * that accepts three arguments: - * - * 1. Instance of \Psr\Http\Message\ServerRequestInterface - * 2. Instance of \Psr\Http\Message\ResponseInterface - * 3. Instance of \Error - * - * The callable MUST return an instance of - * \Psr\Http\Message\ResponseInterface. - * - * @param Container $container - * - * @return callable - */ - $container['phpErrorHandler'] = function ($container) { - return new PhpError($container->get('settings')['displayErrorDetails']); - }; - } - - if (!isset($container['errorHandler'])) { - /** - * This service MUST return a callable - * that accepts three arguments: - * - * 1. Instance of \Psr\Http\Message\ServerRequestInterface - * 2. Instance of \Psr\Http\Message\ResponseInterface - * 3. Instance of \Exception - * - * The callable MUST return an instance of - * \Psr\Http\Message\ResponseInterface. - * - * @param Container $container - * - * @return callable - */ - $container['errorHandler'] = function ($container) { - return new Error($container->get('settings')['displayErrorDetails']); - }; - } - - if (!isset($container['notFoundHandler'])) { - /** - * This service MUST return a callable - * that accepts two arguments: - * - * 1. Instance of \Psr\Http\Message\ServerRequestInterface - * 2. Instance of \Psr\Http\Message\ResponseInterface - * - * The callable MUST return an instance of - * \Psr\Http\Message\ResponseInterface. - * - * @return callable - */ - $container['notFoundHandler'] = function () { - return new NotFound; - }; - } - - if (!isset($container['notAllowedHandler'])) { - /** - * This service MUST return a callable - * that accepts three arguments: - * - * 1. Instance of \Psr\Http\Message\ServerRequestInterface - * 2. Instance of \Psr\Http\Message\ResponseInterface - * 3. Array of allowed HTTP methods - * - * The callable MUST return an instance of - * \Psr\Http\Message\ResponseInterface. - * - * @return callable - */ - $container['notAllowedHandler'] = function () { - return new NotAllowed; - }; - } - - if (!isset($container['callableResolver'])) { - /** - * Instance of \Slim\Interfaces\CallableResolverInterface - * - * @param Container $container - * - * @return CallableResolverInterface - */ - $container['callableResolver'] = function ($container) { - return new CallableResolver($container); - }; - } - } -} diff --git a/vendor/slim/slim/Slim/DeferredCallable.php b/vendor/slim/slim/Slim/DeferredCallable.php deleted file mode 100644 index af5aed7..0000000 --- a/vendor/slim/slim/Slim/DeferredCallable.php +++ /dev/null @@ -1,45 +0,0 @@ -<?php -/** - * Slim Framework (http://slimframework.com) - * - * @link https://github.com/slimphp/Slim - * @copyright Copyright (c) 2011-2016 Josh Lockhart - * @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License) - */ - -namespace Slim; - -use Closure; -use Interop\Container\ContainerInterface; - -class DeferredCallable -{ - use CallableResolverAwareTrait; - - private $callable; - /** @var ContainerInterface */ - private $container; - - /** - * DeferredMiddleware constructor. - * @param callable|string $callable - * @param ContainerInterface $container - */ - public function __construct($callable, ContainerInterface $container = null) - { - $this->callable = $callable; - $this->container = $container; - } - - public function __invoke() - { - $callable = $this->resolveCallable($this->callable); - if ($callable instanceof Closure) { - $callable = $callable->bindTo($this->container); - } - - $args = func_get_args(); - - return call_user_func_array($callable, $args); - } -} diff --git a/vendor/slim/slim/Slim/Exception/ContainerException.php b/vendor/slim/slim/Slim/Exception/ContainerException.php deleted file mode 100644 index 0200e1a..0000000 --- a/vendor/slim/slim/Slim/Exception/ContainerException.php +++ /dev/null @@ -1,20 +0,0 @@ -<?php -/** - * Slim Framework (http://slimframework.com) - * - * @link https://github.com/codeguy/Slim - * @copyright Copyright (c) 2011-2015 Josh Lockhart - * @license https://github.com/codeguy/Slim/blob/master/LICENSE (MIT License) - */ -namespace Slim\Exception; - -use InvalidArgumentException; -use Interop\Container\Exception\ContainerException as InteropContainerException; - -/** - * Container Exception - */ -class ContainerException extends InvalidArgumentException implements InteropContainerException -{ - -} diff --git a/vendor/slim/slim/Slim/Exception/ContainerValueNotFoundException.php b/vendor/slim/slim/Slim/Exception/ContainerValueNotFoundException.php deleted file mode 100644 index 0ea7671..0000000 --- a/vendor/slim/slim/Slim/Exception/ContainerValueNotFoundException.php +++ /dev/null @@ -1,20 +0,0 @@ -<?php -/** - * Slim Framework (http://slimframework.com) - * - * @link https://github.com/codeguy/Slim - * @copyright Copyright (c) 2011-2016 Josh Lockhart - * @license https://github.com/codeguy/Slim/blob/master/LICENSE (MIT License) - */ -namespace Slim\Exception; - -use RuntimeException; -use Interop\Container\Exception\NotFoundException as InteropNotFoundException; - -/** - * Not Found Exception - */ -class ContainerValueNotFoundException extends RuntimeException implements InteropNotFoundException -{ - -} diff --git a/vendor/slim/slim/Slim/Exception/MethodNotAllowedException.php b/vendor/slim/slim/Slim/Exception/MethodNotAllowedException.php deleted file mode 100644 index d104d19..0000000 --- a/vendor/slim/slim/Slim/Exception/MethodNotAllowedException.php +++ /dev/null @@ -1,45 +0,0 @@ -<?php -/** - * Slim Framework (http://slimframework.com) - * - * @link https://github.com/codeguy/Slim - * @copyright Copyright (c) 2011-2016 Josh Lockhart - * @license https://github.com/codeguy/Slim/blob/master/LICENSE (MIT License) - */ -namespace Slim\Exception; - -use Psr\Http\Message\ServerRequestInterface; -use Psr\Http\Message\ResponseInterface; - -class MethodNotAllowedException extends SlimException -{ - /** - * HTTP methods allowed - * - * @var string[] - */ - protected $allowedMethods; - - /** - * Create new exception - * - * @param ServerRequestInterface $request - * @param ResponseInterface $response - * @param string[] $allowedMethods - */ - public function __construct(ServerRequestInterface $request, ResponseInterface $response, array $allowedMethods) - { - parent::__construct($request, $response); - $this->allowedMethods = $allowedMethods; - } - - /** - * Get allowed methods - * - * @return string[] - */ - public function getAllowedMethods() - { - return $this->allowedMethods; - } -} diff --git a/vendor/slim/slim/Slim/Exception/NotFoundException.php b/vendor/slim/slim/Slim/Exception/NotFoundException.php deleted file mode 100644 index 65365eb..0000000 --- a/vendor/slim/slim/Slim/Exception/NotFoundException.php +++ /dev/null @@ -1,14 +0,0 @@ -<?php -/** - * Slim Framework (http://slimframework.com) - * - * @link https://github.com/codeguy/Slim - * @copyright Copyright (c) 2011-2016 Josh Lockhart - * @license https://github.com/codeguy/Slim/blob/master/LICENSE (MIT License) - */ -namespace Slim\Exception; - -class NotFoundException extends SlimException -{ - -} diff --git a/vendor/slim/slim/Slim/Exception/SlimException.php b/vendor/slim/slim/Slim/Exception/SlimException.php deleted file mode 100644 index b8a03a5..0000000 --- a/vendor/slim/slim/Slim/Exception/SlimException.php +++ /dev/null @@ -1,69 +0,0 @@ -<?php -/** - * Slim Framework (http://slimframework.com) - * - * @link https://github.com/slimphp/Slim - * @copyright Copyright (c) 2011-2016 Josh Lockhart - * @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License) - */ -namespace Slim\Exception; - -use Exception; -use Psr\Http\Message\ServerRequestInterface; -use Psr\Http\Message\ResponseInterface; - -/** - * Stop Exception - * - * This Exception is thrown when the Slim application needs to abort - * processing and return control flow to the outer PHP script. - */ -class SlimException extends Exception -{ - /** - * A request object - * - * @var ServerRequestInterface - */ - protected $request; - - /** - * A response object to send to the HTTP client - * - * @var ResponseInterface - */ - protected $response; - - /** - * Create new exception - * - * @param ServerRequestInterface $request - * @param ResponseInterface $response - */ - public function __construct(ServerRequestInterface $request, ResponseInterface $response) - { - parent::__construct(); - $this->request = $request; - $this->response = $response; - } - - /** - * Get request - * - * @return ServerRequestInterface - */ - public function getRequest() - { - return $this->request; - } - - /** - * Get response - * - * @return ResponseInterface - */ - public function getResponse() - { - return $this->response; - } -} diff --git a/vendor/slim/slim/Slim/Handlers/AbstractError.php b/vendor/slim/slim/Slim/Handlers/AbstractError.php deleted file mode 100644 index 5a6cee3..0000000 --- a/vendor/slim/slim/Slim/Handlers/AbstractError.php +++ /dev/null @@ -1,99 +0,0 @@ -<?php -/** - * Slim Framework (http://slimframework.com) - * - * @link https://github.com/slimphp/Slim - * @copyright Copyright (c) 2011-2016 Josh Lockhart - * @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License) - */ -namespace Slim\Handlers; - -/** - * Abstract Slim application error handler - */ -abstract class AbstractError extends AbstractHandler -{ - /** - * @var bool - */ - protected $displayErrorDetails; - - /** - * Constructor - * - * @param bool $displayErrorDetails Set to true to display full details - */ - public function __construct($displayErrorDetails = false) - { - $this->displayErrorDetails = (bool) $displayErrorDetails; - } - - /** - * Write to the error log if displayErrorDetails is false - * - * @param \Exception|\Throwable $throwable - * - * @return void - */ - protected function writeToErrorLog($throwable) - { - if ($this->displayErrorDetails) { - return; - } - - $message = 'Slim Application Error:' . PHP_EOL; - $message .= $this->renderThrowableAsText($throwable); - while ($throwable = $throwable->getPrevious()) { - $message .= PHP_EOL . 'Previous error:' . PHP_EOL; - $message .= $this->renderThrowableAsText($throwable); - } - - $message .= PHP_EOL . 'View in rendered output by enabling the "displayErrorDetails" setting.' . PHP_EOL; - - $this->logError($message); - } - - /** - * Render error as Text. - * - * @param \Exception|\Throwable $throwable - * - * @return string - */ - protected function renderThrowableAsText($throwable) - { - $text = sprintf('Type: %s' . PHP_EOL, get_class($throwable)); - - if ($code = $throwable->getCode()) { - $text .= sprintf('Code: %s' . PHP_EOL, $code); - } - - if ($message = $throwable->getMessage()) { - $text .= sprintf('Message: %s' . PHP_EOL, htmlentities($message)); - } - - if ($file = $throwable->getFile()) { - $text .= sprintf('File: %s' . PHP_EOL, $file); - } - - if ($line = $throwable->getLine()) { - $text .= sprintf('Line: %s' . PHP_EOL, $line); - } - - if ($trace = $throwable->getTraceAsString()) { - $text .= sprintf('Trace: %s', $trace); - } - - return $text; - } - - /** - * Wraps the error_log function so that this can be easily tested - * - * @param $message - */ - protected function logError($message) - { - error_log($message); - } -} diff --git a/vendor/slim/slim/Slim/Handlers/AbstractHandler.php b/vendor/slim/slim/Slim/Handlers/AbstractHandler.php deleted file mode 100644 index decdf72..0000000 --- a/vendor/slim/slim/Slim/Handlers/AbstractHandler.php +++ /dev/null @@ -1,59 +0,0 @@ -<?php -/** - * Slim Framework (http://slimframework.com) - * - * @link https://github.com/slimphp/Slim - * @copyright Copyright (c) 2011-2016 Josh Lockhart - * @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License) - */ -namespace Slim\Handlers; - -use Psr\Http\Message\ServerRequestInterface; - -/** - * Abstract Slim application handler - */ -abstract class AbstractHandler -{ - /** - * Known handled content types - * - * @var array - */ - protected $knownContentTypes = [ - 'application/json', - 'application/xml', - 'text/xml', - 'text/html', - ]; - - /** - * Determine which content type we know about is wanted using Accept header - * - * Note: This method is a bare-bones implementation designed specifically for - * Slim's error handling requirements. Consider a fully-feature solution such - * as willdurand/negotiation for any other situation. - * - * @param ServerRequestInterface $request - * @return string - */ - protected function determineContentType(ServerRequestInterface $request) - { - $acceptHeader = $request->getHeaderLine('Accept'); - $selectedContentTypes = array_intersect(explode(',', $acceptHeader), $this->knownContentTypes); - - if (count($selectedContentTypes)) { - return current($selectedContentTypes); - } - - // handle +json and +xml specially - if (preg_match('/\+(json|xml)/', $acceptHeader, $matches)) { - $mediaType = 'application/' . $matches[1]; - if (in_array($mediaType, $this->knownContentTypes)) { - return $mediaType; - } - } - - return 'text/html'; - } -} diff --git a/vendor/slim/slim/Slim/Handlers/Error.php b/vendor/slim/slim/Slim/Handlers/Error.php deleted file mode 100644 index b995188..0000000 --- a/vendor/slim/slim/Slim/Handlers/Error.php +++ /dev/null @@ -1,206 +0,0 @@ -<?php -/** - * Slim Framework (http://slimframework.com) - * - * @link https://github.com/slimphp/Slim - * @copyright Copyright (c) 2011-2016 Josh Lockhart - * @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License) - */ -namespace Slim\Handlers; - -use Psr\Http\Message\ResponseInterface; -use Psr\Http\Message\ServerRequestInterface; -use Slim\Http\Body; -use UnexpectedValueException; - -/** - * Default Slim application error handler - * - * It outputs the error message and diagnostic information in either JSON, XML, - * or HTML based on the Accept header. - */ -class Error extends AbstractError -{ - /** - * Invoke error handler - * - * @param ServerRequestInterface $request The most recent Request object - * @param ResponseInterface $response The most recent Response object - * @param \Exception $exception The caught Exception object - * - * @return ResponseInterface - * @throws UnexpectedValueException - */ - public function __invoke(ServerRequestInterface $request, ResponseInterface $response, \Exception $exception) - { - $contentType = $this->determineContentType($request); - switch ($contentType) { - case 'application/json': - $output = $this->renderJsonErrorMessage($exception); - break; - - case 'text/xml': - case 'application/xml': - $output = $this->renderXmlErrorMessage($exception); - break; - - case 'text/html': - $output = $this->renderHtmlErrorMessage($exception); - break; - - default: - throw new UnexpectedValueException('Cannot render unknown content type ' . $contentType); - } - - $this->writeToErrorLog($exception); - - $body = new Body(fopen('php://temp', 'r+')); - $body->write($output); - - return $response - ->withStatus(500) - ->withHeader('Content-type', $contentType) - ->withBody($body); - } - - /** - * Render HTML error page - * - * @param \Exception $exception - * - * @return string - */ - protected function renderHtmlErrorMessage(\Exception $exception) - { - $title = 'Slim Application Error'; - - if ($this->displayErrorDetails) { - $html = '<p>The application could not run because of the following error:</p>'; - $html .= '<h2>Details</h2>'; - $html .= $this->renderHtmlException($exception); - - while ($exception = $exception->getPrevious()) { - $html .= '<h2>Previous exception</h2>'; - $html .= $this->renderHtmlException($exception); - } - } else { - $html = '<p>A website error has occurred. Sorry for the temporary inconvenience.</p>'; - } - - $output = sprintf( - "<html><head><meta http-equiv='Content-Type' content='text/html; charset=utf-8'>" . - "<title>%s</title><style>body{margin:0;padding:30px;font:12px/1.5 Helvetica,Arial,Verdana," . - "sans-serif;}h1{margin:0;font-size:48px;font-weight:normal;line-height:48px;}strong{" . - "display:inline-block;width:65px;}</style></head><body><h1>%s</h1>%s</body></html>", - $title, - $title, - $html - ); - - return $output; - } - - /** - * Render exception as HTML. - * - * @param \Exception $exception - * - * @return string - */ - protected function renderHtmlException(\Exception $exception) - { - $html = sprintf('<div><strong>Type:</strong> %s</div>', get_class($exception)); - - if (($code = $exception->getCode())) { - $html .= sprintf('<div><strong>Code:</strong> %s</div>', $code); - } - - if (($message = $exception->getMessage())) { - $html .= sprintf('<div><strong>Message:</strong> %s</div>', htmlentities($message)); - } - - if (($file = $exception->getFile())) { - $html .= sprintf('<div><strong>File:</strong> %s</div>', $file); - } - - if (($line = $exception->getLine())) { - $html .= sprintf('<div><strong>Line:</strong> %s</div>', $line); - } - - if (($trace = $exception->getTraceAsString())) { - $html .= '<h2>Trace</h2>'; - $html .= sprintf('<pre>%s</pre>', htmlentities($trace)); - } - - return $html; - } - - /** - * Render JSON error - * - * @param \Exception $exception - * - * @return string - */ - protected function renderJsonErrorMessage(\Exception $exception) - { - $error = [ - 'message' => 'Slim Application Error', - ]; - - if ($this->displayErrorDetails) { - $error['exception'] = []; - - do { - $error['exception'][] = [ - 'type' => get_class($exception), - 'code' => $exception->getCode(), - 'message' => $exception->getMessage(), - 'file' => $exception->getFile(), - 'line' => $exception->getLine(), - 'trace' => explode("\n", $exception->getTraceAsString()), - ]; - } while ($exception = $exception->getPrevious()); - } - - return json_encode($error, JSON_PRETTY_PRINT); - } - - /** - * Render XML error - * - * @param \Exception $exception - * - * @return string - */ - protected function renderXmlErrorMessage(\Exception $exception) - { - $xml = "<error>\n <message>Slim Application Error</message>\n"; - if ($this->displayErrorDetails) { - do { - $xml .= " <exception>\n"; - $xml .= " <type>" . get_class($exception) . "</type>\n"; - $xml .= " <code>" . $exception->getCode() . "</code>\n"; - $xml .= " <message>" . $this->createCdataSection($exception->getMessage()) . "</message>\n"; - $xml .= " <file>" . $exception->getFile() . "</file>\n"; - $xml .= " <line>" . $exception->getLine() . "</line>\n"; - $xml .= " <trace>" . $this->createCdataSection($exception->getTraceAsString()) . "</trace>\n"; - $xml .= " </exception>\n"; - } while ($exception = $exception->getPrevious()); - } - $xml .= "</error>"; - - return $xml; - } - - /** - * Returns a CDATA section with the given content. - * - * @param string $content - * @return string - */ - private function createCdataSection($content) - { - return sprintf('<![CDATA[%s]]>', str_replace(']]>', ']]]]><![CDATA[>', $content)); - } -} diff --git a/vendor/slim/slim/Slim/Handlers/NotAllowed.php b/vendor/slim/slim/Slim/Handlers/NotAllowed.php deleted file mode 100644 index 3442f20..0000000 --- a/vendor/slim/slim/Slim/Handlers/NotAllowed.php +++ /dev/null @@ -1,147 +0,0 @@ -<?php -/** - * Slim Framework (http://slimframework.com) - * - * @link https://github.com/slimphp/Slim - * @copyright Copyright (c) 2011-2016 Josh Lockhart - * @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License) - */ -namespace Slim\Handlers; - -use Psr\Http\Message\ServerRequestInterface; -use Psr\Http\Message\ResponseInterface; -use Slim\Http\Body; -use UnexpectedValueException; - -/** - * Default Slim application not allowed handler - * - * It outputs a simple message in either JSON, XML or HTML based on the - * Accept header. - */ -class NotAllowed extends AbstractHandler -{ - /** - * Invoke error handler - * - * @param ServerRequestInterface $request The most recent Request object - * @param ResponseInterface $response The most recent Response object - * @param string[] $methods Allowed HTTP methods - * - * @return ResponseInterface - * @throws UnexpectedValueException - */ - public function __invoke(ServerRequestInterface $request, ResponseInterface $response, array $methods) - { - if ($request->getMethod() === 'OPTIONS') { - $status = 200; - $contentType = 'text/plain'; - $output = $this->renderPlainNotAllowedMessage($methods); - } else { - $status = 405; - $contentType = $this->determineContentType($request); - switch ($contentType) { - case 'application/json': - $output = $this->renderJsonNotAllowedMessage($methods); - break; - - case 'text/xml': - case 'application/xml': - $output = $this->renderXmlNotAllowedMessage($methods); - break; - - case 'text/html': - $output = $this->renderHtmlNotAllowedMessage($methods); - break; - default: - throw new UnexpectedValueException('Cannot render unknown content type ' . $contentType); - } - } - - $body = new Body(fopen('php://temp', 'r+')); - $body->write($output); - $allow = implode(', ', $methods); - - return $response - ->withStatus($status) - ->withHeader('Content-type', $contentType) - ->withHeader('Allow', $allow) - ->withBody($body); - } - - /** - * Render PLAIN not allowed message - * - * @param array $methods - * @return string - */ - protected function renderPlainNotAllowedMessage($methods) - { - $allow = implode(', ', $methods); - - return 'Allowed methods: ' . $allow; - } - - /** - * Render JSON not allowed message - * - * @param array $methods - * @return string - */ - protected function renderJsonNotAllowedMessage($methods) - { - $allow = implode(', ', $methods); - - return '{"message":"Method not allowed. Must be one of: ' . $allow . '"}'; - } - - /** - * Render XML not allowed message - * - * @param array $methods - * @return string - */ - protected function renderXmlNotAllowedMessage($methods) - { - $allow = implode(', ', $methods); - - return "<root><message>Method not allowed. Must be one of: $allow</message></root>"; - } - - /** - * Render HTML not allowed message - * - * @param array $methods - * @return string - */ - protected function renderHtmlNotAllowedMessage($methods) - { - $allow = implode(', ', $methods); - $output = <<<END -<html> - <head> - <title>Method not allowed</title> - <style> - body{ - margin:0; - padding:30px; - font:12px/1.5 Helvetica,Arial,Verdana,sans-serif; - } - h1{ - margin:0; - font-size:48px; - font-weight:normal; - line-height:48px; - } - </style> - </head> - <body> - <h1>Method not allowed</h1> - <p>Method not allowed. Must be one of: <strong>$allow</strong></p> - </body> -</html> -END; - - return $output; - } -} diff --git a/vendor/slim/slim/Slim/Handlers/NotFound.php b/vendor/slim/slim/Slim/Handlers/NotFound.php deleted file mode 100644 index ab1d47a..0000000 --- a/vendor/slim/slim/Slim/Handlers/NotFound.php +++ /dev/null @@ -1,126 +0,0 @@ -<?php -/** - * Slim Framework (http://slimframework.com) - * - * @link https://github.com/slimphp/Slim - * @copyright Copyright (c) 2011-2016 Josh Lockhart - * @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License) - */ -namespace Slim\Handlers; - -use Psr\Http\Message\ServerRequestInterface; -use Psr\Http\Message\ResponseInterface; -use Slim\Http\Body; -use UnexpectedValueException; - -/** - * Default Slim application not found handler. - * - * It outputs a simple message in either JSON, XML or HTML based on the - * Accept header. - */ -class NotFound extends AbstractHandler -{ - /** - * Invoke not found handler - * - * @param ServerRequestInterface $request The most recent Request object - * @param ResponseInterface $response The most recent Response object - * - * @return ResponseInterface - * @throws UnexpectedValueException - */ - public function __invoke(ServerRequestInterface $request, ResponseInterface $response) - { - $contentType = $this->determineContentType($request); - switch ($contentType) { - case 'application/json': - $output = $this->renderJsonNotFoundOutput(); - break; - - case 'text/xml': - case 'application/xml': - $output = $this->renderXmlNotFoundOutput(); - break; - - case 'text/html': - $output = $this->renderHtmlNotFoundOutput($request); - break; - - default: - throw new UnexpectedValueException('Cannot render unknown content type ' . $contentType); - } - - $body = new Body(fopen('php://temp', 'r+')); - $body->write($output); - - return $response->withStatus(404) - ->withHeader('Content-Type', $contentType) - ->withBody($body); - } - - /** - * Return a response for application/json content not found - * - * @return ResponseInterface - */ - protected function renderJsonNotFoundOutput() - { - return '{"message":"Not found"}'; - } - - /** - * Return a response for xml content not found - * - * @return ResponseInterface - */ - protected function renderXmlNotFoundOutput() - { - return '<root><message>Not found</message></root>'; - } - - /** - * Return a response for text/html content not found - * - * @param ServerRequestInterface $request The most recent Request object - * - * @return ResponseInterface - */ - protected function renderHtmlNotFoundOutput(ServerRequestInterface $request) - { - $homeUrl = (string)($request->getUri()->withPath('')->withQuery('')->withFragment('')); - return <<<END -<html> - <head> - <title>Page Not Found</title> - <style> - body{ - margin:0; - padding:30px; - font:12px/1.5 Helvetica,Arial,Verdana,sans-serif; - } - h1{ - margin:0; - font-size:48px; - font-weight:normal; - line-height:48px; - } - strong{ - display:inline-block; - width:65px; - } - </style> - </head> - <body> - <h1>Page Not Found</h1> - <p> - The page you are looking for could not be found. Check the address bar - to ensure your URL is spelled correctly. If all else fails, you can - visit our home page at the link below. - </p> - <a href='$homeUrl'>Visit the Home Page</a> - </body> -</html> -END; - } -} diff --git a/vendor/slim/slim/Slim/Handlers/PhpError.php b/vendor/slim/slim/Slim/Handlers/PhpError.php deleted file mode 100644 index 0122ddb..0000000 --- a/vendor/slim/slim/Slim/Handlers/PhpError.php +++ /dev/null @@ -1,205 +0,0 @@ -<?php -/** - * Slim Framework (http://slimframework.com) - * - * @link https://github.com/slimphp/Slim - * @copyright Copyright (c) 2011-2016 Josh Lockhart - * @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License) - */ -namespace Slim\Handlers; - -use Psr\Http\Message\ResponseInterface; -use Psr\Http\Message\ServerRequestInterface; -use Slim\Http\Body; -use UnexpectedValueException; - -/** - * Default Slim application error handler for PHP 7+ Throwables - * - * It outputs the error message and diagnostic information in either JSON, XML, - * or HTML based on the Accept header. - */ -class PhpError extends AbstractError -{ - /** - * Invoke error handler - * - * @param ServerRequestInterface $request The most recent Request object - * @param ResponseInterface $response The most recent Response object - * @param \Throwable $error The caught Throwable object - * - * @return ResponseInterface - * @throws UnexpectedValueException - */ - public function __invoke(ServerRequestInterface $request, ResponseInterface $response, \Throwable $error) - { - $contentType = $this->determineContentType($request); - switch ($contentType) { - case 'application/json': - $output = $this->renderJsonErrorMessage($error); - break; - - case 'text/xml': - case 'application/xml': - $output = $this->renderXmlErrorMessage($error); - break; - - case 'text/html': - $output = $this->renderHtmlErrorMessage($error); - break; - default: - throw new UnexpectedValueException('Cannot render unknown content type ' . $contentType); - } - - $this->writeToErrorLog($error); - - $body = new Body(fopen('php://temp', 'r+')); - $body->write($output); - - return $response - ->withStatus(500) - ->withHeader('Content-type', $contentType) - ->withBody($body); - } - - /** - * Render HTML error page - * - * @param \Throwable $error - * - * @return string - */ - protected function renderHtmlErrorMessage(\Throwable $error) - { - $title = 'Slim Application Error'; - - if ($this->displayErrorDetails) { - $html = '<p>The application could not run because of the following error:</p>'; - $html .= '<h2>Details</h2>'; - $html .= $this->renderHtmlError($error); - - while ($error = $error->getPrevious()) { - $html .= '<h2>Previous error</h2>'; - $html .= $this->renderHtmlError($error); - } - } else { - $html = '<p>A website error has occurred. Sorry for the temporary inconvenience.</p>'; - } - - $output = sprintf( - "<html><head><meta http-equiv='Content-Type' content='text/html; charset=utf-8'>" . - "<title>%s</title><style>body{margin:0;padding:30px;font:12px/1.5 Helvetica,Arial,Verdana," . - "sans-serif;}h1{margin:0;font-size:48px;font-weight:normal;line-height:48px;}strong{" . - "display:inline-block;width:65px;}</style></head><body><h1>%s</h1>%s</body></html>", - $title, - $title, - $html - ); - - return $output; - } - - /** - * Render error as HTML. - * - * @param \Throwable $error - * - * @return string - */ - protected function renderHtmlError(\Throwable $error) - { - $html = sprintf('<div><strong>Type:</strong> %s</div>', get_class($error)); - - if (($code = $error->getCode())) { - $html .= sprintf('<div><strong>Code:</strong> %s</div>', $code); - } - - if (($message = $error->getMessage())) { - $html .= sprintf('<div><strong>Message:</strong> %s</div>', htmlentities($message)); - } - - if (($file = $error->getFile())) { - $html .= sprintf('<div><strong>File:</strong> %s</div>', $file); - } - - if (($line = $error->getLine())) { - $html .= sprintf('<div><strong>Line:</strong> %s</div>', $line); - } - - if (($trace = $error->getTraceAsString())) { - $html .= '<h2>Trace</h2>'; - $html .= sprintf('<pre>%s</pre>', htmlentities($trace)); - } - - return $html; - } - - /** - * Render JSON error - * - * @param \Throwable $error - * - * @return string - */ - protected function renderJsonErrorMessage(\Throwable $error) - { - $json = [ - 'message' => 'Slim Application Error', - ]; - - if ($this->displayErrorDetails) { - $json['error'] = []; - - do { - $json['error'][] = [ - 'type' => get_class($error), - 'code' => $error->getCode(), - 'message' => $error->getMessage(), - 'file' => $error->getFile(), - 'line' => $error->getLine(), - 'trace' => explode("\n", $error->getTraceAsString()), - ]; - } while ($error = $error->getPrevious()); - } - - return json_encode($json, JSON_PRETTY_PRINT); - } - - /** - * Render XML error - * - * @param \Throwable $error - * - * @return string - */ - protected function renderXmlErrorMessage(\Throwable $error) - { - $xml = "<error>\n <message>Slim Application Error</message>\n"; - if ($this->displayErrorDetails) { - do { - $xml .= " <error>\n"; - $xml .= " <type>" . get_class($error) . "</type>\n"; - $xml .= " <code>" . $error->getCode() . "</code>\n"; - $xml .= " <message>" . $this->createCdataSection($error->getMessage()) . "</message>\n"; - $xml .= " <file>" . $error->getFile() . "</file>\n"; - $xml .= " <line>" . $error->getLine() . "</line>\n"; - $xml .= " <trace>" . $this->createCdataSection($error->getTraceAsString()) . "</trace>\n"; - $xml .= " </error>\n"; - } while ($error = $error->getPrevious()); - } - $xml .= "</error>"; - - return $xml; - } - - /** - * Returns a CDATA section with the given content. - * - * @param string $content - * @return string - */ - private function createCdataSection($content) - { - return sprintf('<![CDATA[%s]]>', str_replace(']]>', ']]]]><![CDATA[>', $content)); - } -} diff --git a/vendor/slim/slim/Slim/Handlers/Strategies/RequestResponse.php b/vendor/slim/slim/Slim/Handlers/Strategies/RequestResponse.php deleted file mode 100644 index 157bdeb..0000000 --- a/vendor/slim/slim/Slim/Handlers/Strategies/RequestResponse.php +++ /dev/null @@ -1,43 +0,0 @@ -<?php -/** - * Slim Framework (http://slimframework.com) - * - * @link https://github.com/slimphp/Slim - * @copyright Copyright (c) 2011-2016 Josh Lockhart - * @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License) - */ -namespace Slim\Handlers\Strategies; - -use Psr\Http\Message\ResponseInterface; -use Psr\Http\Message\ServerRequestInterface; -use Slim\Interfaces\InvocationStrategyInterface; - -/** - * Default route callback strategy with route parameters as an array of arguments. - */ -class RequestResponse implements InvocationStrategyInterface -{ - /** - * Invoke a route callable with request, response, and all route parameters - * as an array of arguments. - * - * @param array|callable $callable - * @param ServerRequestInterface $request - * @param ResponseInterface $response - * @param array $routeArguments - * - * @return mixed - */ - public function __invoke( - callable $callable, - ServerRequestInterface $request, - ResponseInterface $response, - array $routeArguments - ) { - foreach ($routeArguments as $k => $v) { - $request = $request->withAttribute($k, $v); - } - - return call_user_func($callable, $request, $response, $routeArguments); - } -} diff --git a/vendor/slim/slim/Slim/Handlers/Strategies/RequestResponseArgs.php b/vendor/slim/slim/Slim/Handlers/Strategies/RequestResponseArgs.php deleted file mode 100644 index 11793d3..0000000 --- a/vendor/slim/slim/Slim/Handlers/Strategies/RequestResponseArgs.php +++ /dev/null @@ -1,42 +0,0 @@ -<?php -/** - * Slim Framework (http://slimframework.com) - * - * @link https://github.com/slimphp/Slim - * @copyright Copyright (c) 2011-2016 Josh Lockhart - * @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License) - */ -namespace Slim\Handlers\Strategies; - -use Psr\Http\Message\ResponseInterface; -use Psr\Http\Message\ServerRequestInterface; -use Slim\Interfaces\InvocationStrategyInterface; - -/** - * Route callback strategy with route parameters as individual arguments. - */ -class RequestResponseArgs implements InvocationStrategyInterface -{ - - /** - * Invoke a route callable with request, response and all route parameters - * as individual arguments. - * - * @param array|callable $callable - * @param ServerRequestInterface $request - * @param ResponseInterface $response - * @param array $routeArguments - * - * @return mixed - */ - public function __invoke( - callable $callable, - ServerRequestInterface $request, - ResponseInterface $response, - array $routeArguments - ) { - array_unshift($routeArguments, $request, $response); - - return call_user_func_array($callable, $routeArguments); - } -} diff --git a/vendor/slim/slim/Slim/Http/Body.php b/vendor/slim/slim/Slim/Http/Body.php deleted file mode 100644 index 06a25a2..0000000 --- a/vendor/slim/slim/Slim/Http/Body.php +++ /dev/null @@ -1,22 +0,0 @@ -<?php -/** - * Slim Framework (http://slimframework.com) - * - * @link https://github.com/slimphp/Slim - * @copyright Copyright (c) 2011-2016 Josh Lockhart - * @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License) - */ -namespace Slim\Http; - -/** - * Body - * - * This class represents an HTTP message body and encapsulates a - * streamable resource according to the PSR-7 standard. - * - * @link https://github.com/php-fig/http-message/blob/master/src/StreamInterface.php - */ -class Body extends Stream -{ - -} diff --git a/vendor/slim/slim/Slim/Http/Cookies.php b/vendor/slim/slim/Slim/Http/Cookies.php deleted file mode 100644 index 0604f81..0000000 --- a/vendor/slim/slim/Slim/Http/Cookies.php +++ /dev/null @@ -1,195 +0,0 @@ -<?php -/** - * Slim Framework (http://slimframework.com) - * - * @link https://github.com/slimphp/Slim - * @copyright Copyright (c) 2011-2016 Josh Lockhart - * @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License) - */ -namespace Slim\Http; - -use InvalidArgumentException; -use Slim\Interfaces\Http\CookiesInterface; - -/** - * Cookie helper - */ -class Cookies implements CookiesInterface -{ - /** - * Cookies from HTTP request - * - * @var array - */ - protected $requestCookies = []; - - /** - * Cookies for HTTP response - * - * @var array - */ - protected $responseCookies = []; - - /** - * Default cookie properties - * - * @var array - */ - protected $defaults = [ - 'value' => '', - 'domain' => null, - 'hostonly' => null, - 'path' => null, - 'expires' => null, - 'secure' => false, - 'httponly' => false - ]; - - /** - * Create new cookies helper - * - * @param array $cookies - */ - public function __construct(array $cookies = []) - { - $this->requestCookies = $cookies; - } - - /** - * Set default cookie properties - * - * @param array $settings - */ - public function setDefaults(array $settings) - { - $this->defaults = array_replace($this->defaults, $settings); - } - - /** - * Get request cookie - * - * @param string $name Cookie name - * @param mixed $default Cookie default value - * - * @return mixed Cookie value if present, else default - */ - public function get($name, $default = null) - { - return isset($this->requestCookies[$name]) ? $this->requestCookies[$name] : $default; - } - - /** - * Set response cookie - * - * @param string $name Cookie name - * @param string|array $value Cookie value, or cookie properties - */ - public function set($name, $value) - { - if (!is_array($value)) { - $value = ['value' => (string)$value]; - } - $this->responseCookies[$name] = array_replace($this->defaults, $value); - } - - /** - * Convert to `Set-Cookie` headers - * - * @return string[] - */ - public function toHeaders() - { - $headers = []; - foreach ($this->responseCookies as $name => $properties) { - $headers[] = $this->toHeader($name, $properties); - } - - return $headers; - } - - /** - * Convert to `Set-Cookie` header - * - * @param string $name Cookie name - * @param array $properties Cookie properties - * - * @return string - */ - protected function toHeader($name, array $properties) - { - $result = urlencode($name) . '=' . urlencode($properties['value']); - - if (isset($properties['domain'])) { - $result .= '; domain=' . $properties['domain']; - } - - if (isset($properties['path'])) { - $result .= '; path=' . $properties['path']; - } - - if (isset($properties['expires'])) { - if (is_string($properties['expires'])) { - $timestamp = strtotime($properties['expires']); - } else { - $timestamp = (int)$properties['expires']; - } - if ($timestamp !== 0) { - $result .= '; expires=' . gmdate('D, d-M-Y H:i:s e', $timestamp); - } - } - - if (isset($properties['secure']) && $properties['secure']) { - $result .= '; secure'; - } - - if (isset($properties['hostonly']) && $properties['hostonly']) { - $result .= '; HostOnly'; - } - - if (isset($properties['httponly']) && $properties['httponly']) { - $result .= '; HttpOnly'; - } - - return $result; - } - - /** - * Parse HTTP request `Cookie:` header and extract - * into a PHP associative array. - * - * @param string $header The raw HTTP request `Cookie:` header - * - * @return array Associative array of cookie names and values - * - * @throws InvalidArgumentException if the cookie data cannot be parsed - */ - public static function parseHeader($header) - { - if (is_array($header) === true) { - $header = isset($header[0]) ? $header[0] : ''; - } - - if (is_string($header) === false) { - throw new InvalidArgumentException('Cannot parse Cookie data. Header value must be a string.'); - } - - $header = rtrim($header, "\r\n"); - $pieces = preg_split('@\s*[;,]\s*@', $header); - $cookies = []; - - foreach ($pieces as $cookie) { - $cookie = explode('=', $cookie, 2); - - if (count($cookie) === 2) { - $key = urldecode($cookie[0]); - $value = urldecode($cookie[1]); - - if (!isset($cookies[$key])) { - $cookies[$key] = $value; - } - } - } - - return $cookies; - } -} diff --git a/vendor/slim/slim/Slim/Http/Environment.php b/vendor/slim/slim/Slim/Http/Environment.php deleted file mode 100644 index a106fa8..0000000 --- a/vendor/slim/slim/Slim/Http/Environment.php +++ /dev/null @@ -1,52 +0,0 @@ -<?php -/** - * Slim Framework (http://slimframework.com) - * - * @link https://github.com/slimphp/Slim - * @copyright Copyright (c) 2011-2016 Josh Lockhart - * @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License) - */ -namespace Slim\Http; - -use Slim\Collection; -use Slim\Interfaces\Http\EnvironmentInterface; - -/** - * Environment - * - * This class decouples the Slim application from the global PHP environment. - * This is particularly useful for unit testing, but it also lets us create - * custom sub-requests. - */ -class Environment extends Collection implements EnvironmentInterface -{ - /** - * Create mock environment - * - * @param array $userData Array of custom environment keys and values - * - * @return self - */ - public static function mock(array $userData = []) - { - $data = array_merge([ - 'SERVER_PROTOCOL' => 'HTTP/1.1', - 'REQUEST_METHOD' => 'GET', - 'SCRIPT_NAME' => '', - 'REQUEST_URI' => '', - 'QUERY_STRING' => '', - 'SERVER_NAME' => 'localhost', - 'SERVER_PORT' => 80, - 'HTTP_HOST' => 'localhost', - 'HTTP_ACCEPT' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', - 'HTTP_ACCEPT_LANGUAGE' => 'en-US,en;q=0.8', - 'HTTP_ACCEPT_CHARSET' => 'ISO-8859-1,utf-8;q=0.7,*;q=0.3', - 'HTTP_USER_AGENT' => 'Slim Framework', - 'REMOTE_ADDR' => '127.0.0.1', - 'REQUEST_TIME' => time(), - 'REQUEST_TIME_FLOAT' => microtime(true), - ], $userData); - - return new static($data); - } -} diff --git a/vendor/slim/slim/Slim/Http/Headers.php b/vendor/slim/slim/Slim/Http/Headers.php deleted file mode 100644 index 4aa7a5e..0000000 --- a/vendor/slim/slim/Slim/Http/Headers.php +++ /dev/null @@ -1,222 +0,0 @@ -<?php -/** - * Slim Framework (http://slimframework.com) - * - * @link https://github.com/slimphp/Slim - * @copyright Copyright (c) 2011-2016 Josh Lockhart - * @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License) - */ -namespace Slim\Http; - -use Slim\Collection; -use Slim\Interfaces\Http\HeadersInterface; - -/** - * Headers - * - * This class represents a collection of HTTP headers - * that is used in both the HTTP request and response objects. - * It also enables header name case-insensitivity when - * getting or setting a header value. - * - * Each HTTP header can have multiple values. This class - * stores values into an array for each header name. When - * you request a header value, you receive an array of values - * for that header. - */ -class Headers extends Collection implements HeadersInterface -{ - /** - * Special HTTP headers that do not have the "HTTP_" prefix - * - * @var array - */ - protected static $special = [ - 'CONTENT_TYPE' => 1, - 'CONTENT_LENGTH' => 1, - 'PHP_AUTH_USER' => 1, - 'PHP_AUTH_PW' => 1, - 'PHP_AUTH_DIGEST' => 1, - 'AUTH_TYPE' => 1, - ]; - - /** - * Create new headers collection with data extracted from - * the application Environment object - * - * @param Environment $environment The Slim application Environment - * - * @return self - */ - public static function createFromEnvironment(Environment $environment) - { - $data = []; - $environment = self::determineAuthorization($environment); - foreach ($environment as $key => $value) { - $key = strtoupper($key); - if (isset(static::$special[$key]) || strpos($key, 'HTTP_') === 0) { - if ($key !== 'HTTP_CONTENT_LENGTH') { - $data[$key] = $value; - } - } - } - - return new static($data); - } - - /** - * If HTTP_AUTHORIZATION does not exist tries to get it from - * getallheaders() when available. - * - * @param Environment $environment The Slim application Environment - * - * @return Environment - */ - - public static function determineAuthorization(Environment $environment) - { - $authorization = $environment->get('HTTP_AUTHORIZATION'); - - if (null === $authorization && is_callable('getallheaders')) { - $headers = getallheaders(); - $headers = array_change_key_case($headers, CASE_LOWER); - if (isset($headers['authorization'])) { - $environment->set('HTTP_AUTHORIZATION', $headers['authorization']); - } - } - - return $environment; - } - - /** - * Return array of HTTP header names and values. - * This method returns the _original_ header name - * as specified by the end user. - * - * @return array - */ - public function all() - { - $all = parent::all(); - $out = []; - foreach ($all as $key => $props) { - $out[$props['originalKey']] = $props['value']; - } - - return $out; - } - - /** - * Set HTTP header value - * - * This method sets a header value. It replaces - * any values that may already exist for the header name. - * - * @param string $key The case-insensitive header name - * @param string $value The header value - */ - public function set($key, $value) - { - if (!is_array($value)) { - $value = [$value]; - } - parent::set($this->normalizeKey($key), [ - 'value' => $value, - 'originalKey' => $key - ]); - } - - /** - * Get HTTP header value - * - * @param string $key The case-insensitive header name - * @param mixed $default The default value if key does not exist - * - * @return string[] - */ - public function get($key, $default = null) - { - if ($this->has($key)) { - return parent::get($this->normalizeKey($key))['value']; - } - - return $default; - } - - /** - * Get HTTP header key as originally specified - * - * @param string $key The case-insensitive header name - * @param mixed $default The default value if key does not exist - * - * @return string - */ - public function getOriginalKey($key, $default = null) - { - if ($this->has($key)) { - return parent::get($this->normalizeKey($key))['originalKey']; - } - - return $default; - } - - /** - * Add HTTP header value - * - * This method appends a header value. Unlike the set() method, - * this method _appends_ this new value to any values - * that already exist for this header name. - * - * @param string $key The case-insensitive header name - * @param array|string $value The new header value(s) - */ - public function add($key, $value) - { - $oldValues = $this->get($key, []); - $newValues = is_array($value) ? $value : [$value]; - $this->set($key, array_merge($oldValues, array_values($newValues))); - } - - /** - * Does this collection have a given header? - * - * @param string $key The case-insensitive header name - * - * @return bool - */ - public function has($key) - { - return parent::has($this->normalizeKey($key)); - } - - /** - * Remove header from collection - * - * @param string $key The case-insensitive header name - */ - public function remove($key) - { - parent::remove($this->normalizeKey($key)); - } - - /** - * Normalize header name - * - * This method transforms header names into a - * normalized form. This is how we enable case-insensitive - * header names in the other methods in this class. - * - * @param string $key The case-insensitive header name - * - * @return string Normalized header name - */ - public function normalizeKey($key) - { - $key = strtr(strtolower($key), '_', '-'); - if (strpos($key, 'http-') === 0) { - $key = substr($key, 5); - } - - return $key; - } -} diff --git a/vendor/slim/slim/Slim/Http/Message.php b/vendor/slim/slim/Slim/Http/Message.php deleted file mode 100644 index 1596c8d..0000000 --- a/vendor/slim/slim/Slim/Http/Message.php +++ /dev/null @@ -1,304 +0,0 @@ -<?php -/** - * Slim Framework (http://slimframework.com) - * - * @link https://github.com/slimphp/Slim - * @copyright Copyright (c) 2011-2016 Josh Lockhart - * @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License) - */ -namespace Slim\Http; - -use InvalidArgumentException; -use Psr\Http\Message\MessageInterface; -use Psr\Http\Message\StreamInterface; - -/** - * Abstract message (base class for Request and Response) - * - * This class represents a general HTTP message. It provides common properties and methods for - * the HTTP request and response, as defined in the PSR-7 MessageInterface. - * - * @link https://github.com/php-fig/http-message/blob/master/src/MessageInterface.php - * @see Slim\Http\Request - * @see Slim\Http\Response - */ -abstract class Message implements MessageInterface -{ - /** - * Protocol version - * - * @var string - */ - protected $protocolVersion = '1.1'; - - /** - * A map of valid protocol versions - * - * @var array - */ - protected static $validProtocolVersions = [ - '1.0' => true, - '1.1' => true, - '2.0' => true, - ]; - - /** - * Headers - * - * @var \Slim\Interfaces\Http\HeadersInterface - */ - protected $headers; - - /** - * Body object - * - * @var \Psr\Http\Message\StreamInterface - */ - protected $body; - - - /** - * Disable magic setter to ensure immutability - */ - public function __set($name, $value) - { - // Do nothing - } - - /******************************************************************************* - * Protocol - ******************************************************************************/ - - /** - * Retrieves the HTTP protocol version as a string. - * - * The string MUST contain only the HTTP version number (e.g., "1.1", "1.0"). - * - * @return string HTTP protocol version. - */ - public function getProtocolVersion() - { - return $this->protocolVersion; - } - - /** - * Return an instance with the specified HTTP protocol version. - * - * The version string MUST contain only the HTTP version number (e.g., - * "1.1", "1.0"). - * - * This method MUST be implemented in such a way as to retain the - * immutability of the message, and MUST return an instance that has the - * new protocol version. - * - * @param string $version HTTP protocol version - * @return static - * @throws InvalidArgumentException if the http version is an invalid number - */ - public function withProtocolVersion($version) - { - if (!isset(self::$validProtocolVersions[$version])) { - throw new InvalidArgumentException( - 'Invalid HTTP version. Must be one of: ' - . implode(', ', array_keys(self::$validProtocolVersions)) - ); - } - $clone = clone $this; - $clone->protocolVersion = $version; - - return $clone; - } - - /******************************************************************************* - * Headers - ******************************************************************************/ - - /** - * Retrieves all message header values. - * - * The keys represent the header name as it will be sent over the wire, and - * each value is an array of strings associated with the header. - * - * // Represent the headers as a string - * foreach ($message->getHeaders() as $name => $values) { - * echo $name . ": " . implode(", ", $values); - * } - * - * // Emit headers iteratively: - * foreach ($message->getHeaders() as $name => $values) { - * foreach ($values as $value) { - * header(sprintf('%s: %s', $name, $value), false); - * } - * } - * - * While header names are not case-sensitive, getHeaders() will preserve the - * exact case in which headers were originally specified. - * - * @return array Returns an associative array of the message's headers. Each - * key MUST be a header name, and each value MUST be an array of strings - * for that header. - */ - public function getHeaders() - { - return $this->headers->all(); - } - - /** - * Checks if a header exists by the given case-insensitive name. - * - * @param string $name Case-insensitive header field name. - * @return bool Returns true if any header names match the given header - * name using a case-insensitive string comparison. Returns false if - * no matching header name is found in the message. - */ - public function hasHeader($name) - { - return $this->headers->has($name); - } - - /** - * Retrieves a message header value by the given case-insensitive name. - * - * This method returns an array of all the header values of the given - * case-insensitive header name. - * - * If the header does not appear in the message, this method MUST return an - * empty array. - * - * @param string $name Case-insensitive header field name. - * @return string[] An array of string values as provided for the given - * header. If the header does not appear in the message, this method MUST - * return an empty array. - */ - public function getHeader($name) - { - return $this->headers->get($name, []); - } - - /** - * Retrieves a comma-separated string of the values for a single header. - * - * This method returns all of the header values of the given - * case-insensitive header name as a string concatenated together using - * a comma. - * - * NOTE: Not all header values may be appropriately represented using - * comma concatenation. For such headers, use getHeader() instead - * and supply your own delimiter when concatenating. - * - * If the header does not appear in the message, this method MUST return - * an empty string. - * - * @param string $name Case-insensitive header field name. - * @return string A string of values as provided for the given header - * concatenated together using a comma. If the header does not appear in - * the message, this method MUST return an empty string. - */ - public function getHeaderLine($name) - { - return implode(',', $this->headers->get($name, [])); - } - - /** - * Return an instance with the provided value replacing the specified header. - * - * While header names are case-insensitive, the casing of the header will - * be preserved by this function, and returned from getHeaders(). - * - * This method MUST be implemented in such a way as to retain the - * immutability of the message, and MUST return an instance that has the - * new and/or updated header and value. - * - * @param string $name Case-insensitive header field name. - * @param string|string[] $value Header value(s). - * @return static - * @throws \InvalidArgumentException for invalid header names or values. - */ - public function withHeader($name, $value) - { - $clone = clone $this; - $clone->headers->set($name, $value); - - return $clone; - } - - /** - * Return an instance with the specified header appended with the given value. - * - * Existing values for the specified header will be maintained. The new - * value(s) will be appended to the existing list. If the header did not - * exist previously, it will be added. - * - * This method MUST be implemented in such a way as to retain the - * immutability of the message, and MUST return an instance that has the - * new header and/or value. - * - * @param string $name Case-insensitive header field name to add. - * @param string|string[] $value Header value(s). - * @return static - * @throws \InvalidArgumentException for invalid header names or values. - */ - public function withAddedHeader($name, $value) - { - $clone = clone $this; - $clone->headers->add($name, $value); - - return $clone; - } - - /** - * Return an instance without the specified header. - * - * Header resolution MUST be done without case-sensitivity. - * - * This method MUST be implemented in such a way as to retain the - * immutability of the message, and MUST return an instance that removes - * the named header. - * - * @param string $name Case-insensitive header field name to remove. - * @return static - */ - public function withoutHeader($name) - { - $clone = clone $this; - $clone->headers->remove($name); - - return $clone; - } - - /******************************************************************************* - * Body - ******************************************************************************/ - - /** - * Gets the body of the message. - * - * @return StreamInterface Returns the body as a stream. - */ - public function getBody() - { - return $this->body; - } - - /** - * Return an instance with the specified message body. - * - * The body MUST be a StreamInterface object. - * - * This method MUST be implemented in such a way as to retain the - * immutability of the message, and MUST return a new instance that has the - * new body stream. - * - * @param StreamInterface $body Body. - * @return static - * @throws \InvalidArgumentException When the body is not valid. - */ - public function withBody(StreamInterface $body) - { - // TODO: Test for invalid body? - $clone = clone $this; - $clone->body = $body; - - return $clone; - } -} diff --git a/vendor/slim/slim/Slim/Http/Request.php b/vendor/slim/slim/Slim/Http/Request.php deleted file mode 100644 index b040bf4..0000000 --- a/vendor/slim/slim/Slim/Http/Request.php +++ /dev/null @@ -1,1177 +0,0 @@ -<?php -/** - * Slim Framework (http://slimframework.com) - * - * @link https://github.com/slimphp/Slim - * @copyright Copyright (c) 2011-2016 Josh Lockhart - * @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License) - */ -namespace Slim\Http; - -use Closure; -use InvalidArgumentException; -use Psr\Http\Message\UploadedFileInterface; -use RuntimeException; -use Psr\Http\Message\ServerRequestInterface; -use Psr\Http\Message\UriInterface; -use Psr\Http\Message\StreamInterface; -use Slim\Collection; -use Slim\Interfaces\Http\HeadersInterface; - -/** - * Request - * - * This class represents an HTTP request. It manages - * the request method, URI, headers, cookies, and body - * according to the PSR-7 standard. - * - * @link https://github.com/php-fig/http-message/blob/master/src/MessageInterface.php - * @link https://github.com/php-fig/http-message/blob/master/src/RequestInterface.php - * @link https://github.com/php-fig/http-message/blob/master/src/ServerRequestInterface.php - */ -class Request extends Message implements ServerRequestInterface -{ - /** - * The request method - * - * @var string - */ - protected $method; - - /** - * The original request method (ignoring override) - * - * @var string - */ - protected $originalMethod; - - /** - * The request URI object - * - * @var \Psr\Http\Message\UriInterface - */ - protected $uri; - - /** - * The request URI target (path + query string) - * - * @var string - */ - protected $requestTarget; - - /** - * The request query string params - * - * @var array - */ - protected $queryParams; - - /** - * The request cookies - * - * @var array - */ - protected $cookies; - - /** - * The server environment variables at the time the request was created. - * - * @var array - */ - protected $serverParams; - - /** - * The request attributes (route segment names and values) - * - * @var \Slim\Collection - */ - protected $attributes; - - /** - * The request body parsed (if possible) into a PHP array or object - * - * @var null|array|object - */ - protected $bodyParsed = false; - - /** - * List of request body parsers (e.g., url-encoded, JSON, XML, multipart) - * - * @var callable[] - */ - protected $bodyParsers = []; - - /** - * List of uploaded files - * - * @var UploadedFileInterface[] - */ - protected $uploadedFiles; - - /** - * Valid request methods - * - * @var string[] - */ - protected $validMethods = [ - 'CONNECT' => 1, - 'DELETE' => 1, - 'GET' => 1, - 'HEAD' => 1, - 'OPTIONS' => 1, - 'PATCH' => 1, - 'POST' => 1, - 'PUT' => 1, - 'TRACE' => 1, - ]; - - /** - * Create new HTTP request with data extracted from the application - * Environment object - * - * @param Environment $environment The Slim application Environment - * - * @return self - */ - public static function createFromEnvironment(Environment $environment) - { - $method = $environment['REQUEST_METHOD']; - $uri = Uri::createFromEnvironment($environment); - $headers = Headers::createFromEnvironment($environment); - $cookies = Cookies::parseHeader($headers->get('Cookie', [])); - $serverParams = $environment->all(); - $body = new RequestBody(); - $uploadedFiles = UploadedFile::createFromEnvironment($environment); - - $request = new static($method, $uri, $headers, $cookies, $serverParams, $body, $uploadedFiles); - - if ($method === 'POST' && - in_array($request->getMediaType(), ['application/x-www-form-urlencoded', 'multipart/form-data']) - ) { - // parsed body must be $_POST - $request = $request->withParsedBody($_POST); - } - return $request; - } - - /** - * Create new HTTP request. - * - * Adds a host header when none was provided and a host is defined in uri. - * - * @param string $method The request method - * @param UriInterface $uri The request URI object - * @param HeadersInterface $headers The request headers collection - * @param array $cookies The request cookies collection - * @param array $serverParams The server environment variables - * @param StreamInterface $body The request body object - * @param array $uploadedFiles The request uploadedFiles collection - */ - public function __construct( - $method, - UriInterface $uri, - HeadersInterface $headers, - array $cookies, - array $serverParams, - StreamInterface $body, - array $uploadedFiles = [] - ) { - $this->originalMethod = $this->filterMethod($method); - $this->uri = $uri; - $this->headers = $headers; - $this->cookies = $cookies; - $this->serverParams = $serverParams; - $this->attributes = new Collection(); - $this->body = $body; - $this->uploadedFiles = $uploadedFiles; - - if (isset($serverParams['SERVER_PROTOCOL'])) { - $this->protocolVersion = str_replace('HTTP/', '', $serverParams['SERVER_PROTOCOL']); - } - - if (!$this->headers->has('Host') || $this->uri->getHost() !== '') { - $this->headers->set('Host', $this->uri->getHost()); - } - - $this->registerMediaTypeParser('application/json', function ($input) { - return json_decode($input, true); - }); - - $this->registerMediaTypeParser('application/xml', function ($input) { - $backup = libxml_disable_entity_loader(true); - $result = simplexml_load_string($input); - libxml_disable_entity_loader($backup); - return $result; - }); - - $this->registerMediaTypeParser('text/xml', function ($input) { - $backup = libxml_disable_entity_loader(true); - $result = simplexml_load_string($input); - libxml_disable_entity_loader($backup); - return $result; - }); - - $this->registerMediaTypeParser('application/x-www-form-urlencoded', function ($input) { - parse_str($input, $data); - return $data; - }); - } - - /** - * This method is applied to the cloned object - * after PHP performs an initial shallow-copy. This - * method completes a deep-copy by creating new objects - * for the cloned object's internal reference pointers. - */ - public function __clone() - { - $this->headers = clone $this->headers; - $this->attributes = clone $this->attributes; - $this->body = clone $this->body; - } - - /******************************************************************************* - * Method - ******************************************************************************/ - - /** - * Retrieves the HTTP method of the request. - * - * @return string Returns the request method. - */ - public function getMethod() - { - if ($this->method === null) { - $this->method = $this->originalMethod; - $customMethod = $this->getHeaderLine('X-Http-Method-Override'); - - if ($customMethod) { - $this->method = $this->filterMethod($customMethod); - } elseif ($this->originalMethod === 'POST') { - $body = $this->getParsedBody(); - - if (is_object($body) && property_exists($body, '_METHOD')) { - $this->method = $this->filterMethod((string)$body->_METHOD); - } elseif (is_array($body) && isset($body['_METHOD'])) { - $this->method = $this->filterMethod((string)$body['_METHOD']); - } - - if ($this->getBody()->eof()) { - $this->getBody()->rewind(); - } - } - } - - return $this->method; - } - - /** - * Get the original HTTP method (ignore override). - * - * Note: This method is not part of the PSR-7 standard. - * - * @return string - */ - public function getOriginalMethod() - { - return $this->originalMethod; - } - - /** - * Return an instance with the provided HTTP method. - * - * While HTTP method names are typically all uppercase characters, HTTP - * method names are case-sensitive and thus implementations SHOULD NOT - * modify the given string. - * - * This method MUST be implemented in such a way as to retain the - * immutability of the message, and MUST return an instance that has the - * changed request method. - * - * @param string $method Case-sensitive method. - * @return self - * @throws \InvalidArgumentException for invalid HTTP methods. - */ - public function withMethod($method) - { - $method = $this->filterMethod($method); - $clone = clone $this; - $clone->originalMethod = $method; - $clone->method = $method; - - return $clone; - } - - /** - * Validate the HTTP method - * - * @param null|string $method - * @return null|string - * @throws \InvalidArgumentException on invalid HTTP method. - */ - protected function filterMethod($method) - { - if ($method === null) { - return $method; - } - - if (!is_string($method)) { - throw new InvalidArgumentException(sprintf( - 'Unsupported HTTP method; must be a string, received %s', - (is_object($method) ? get_class($method) : gettype($method)) - )); - } - - $method = strtoupper($method); - if (!isset($this->validMethods[$method])) { - throw new InvalidArgumentException(sprintf( - 'Unsupported HTTP method "%s" provided', - $method - )); - } - - return $method; - } - - /** - * Does this request use a given method? - * - * Note: This method is not part of the PSR-7 standard. - * - * @param string $method HTTP method - * @return bool - */ - public function isMethod($method) - { - return $this->getMethod() === $method; - } - - /** - * Is this a GET request? - * - * Note: This method is not part of the PSR-7 standard. - * - * @return bool - */ - public function isGet() - { - return $this->isMethod('GET'); - } - - /** - * Is this a POST request? - * - * Note: This method is not part of the PSR-7 standard. - * - * @return bool - */ - public function isPost() - { - return $this->isMethod('POST'); - } - - /** - * Is this a PUT request? - * - * Note: This method is not part of the PSR-7 standard. - * - * @return bool - */ - public function isPut() - { - return $this->isMethod('PUT'); - } - - /** - * Is this a PATCH request? - * - * Note: This method is not part of the PSR-7 standard. - * - * @return bool - */ - public function isPatch() - { - return $this->isMethod('PATCH'); - } - - /** - * Is this a DELETE request? - * - * Note: This method is not part of the PSR-7 standard. - * - * @return bool - */ - public function isDelete() - { - return $this->isMethod('DELETE'); - } - - /** - * Is this a HEAD request? - * - * Note: This method is not part of the PSR-7 standard. - * - * @return bool - */ - public function isHead() - { - return $this->isMethod('HEAD'); - } - - /** - * Is this a OPTIONS request? - * - * Note: This method is not part of the PSR-7 standard. - * - * @return bool - */ - public function isOptions() - { - return $this->isMethod('OPTIONS'); - } - - /** - * Is this an XHR request? - * - * Note: This method is not part of the PSR-7 standard. - * - * @return bool - */ - public function isXhr() - { - return $this->getHeaderLine('X-Requested-With') === 'XMLHttpRequest'; - } - - /******************************************************************************* - * URI - ******************************************************************************/ - - /** - * Retrieves the message's request target. - * - * Retrieves the message's request-target either as it will appear (for - * clients), as it appeared at request (for servers), or as it was - * specified for the instance (see withRequestTarget()). - * - * In most cases, this will be the origin-form of the composed URI, - * unless a value was provided to the concrete implementation (see - * withRequestTarget() below). - * - * If no URI is available, and no request-target has been specifically - * provided, this method MUST return the string "/". - * - * @return string - */ - public function getRequestTarget() - { - if ($this->requestTarget) { - return $this->requestTarget; - } - - if ($this->uri === null) { - return '/'; - } - - $basePath = $this->uri->getBasePath(); - $path = $this->uri->getPath(); - $path = $basePath . '/' . ltrim($path, '/'); - - $query = $this->uri->getQuery(); - if ($query) { - $path .= '?' . $query; - } - $this->requestTarget = $path; - - return $this->requestTarget; - } - - /** - * Return an instance with the specific request-target. - * - * If the request needs a non-origin-form request-target — e.g., for - * specifying an absolute-form, authority-form, or asterisk-form — - * this method may be used to create an instance with the specified - * request-target, verbatim. - * - * This method MUST be implemented in such a way as to retain the - * immutability of the message, and MUST return an instance that has the - * changed request target. - * - * @link http://tools.ietf.org/html/rfc7230#section-2.7 (for the various - * request-target forms allowed in request messages) - * @param mixed $requestTarget - * @return self - * @throws InvalidArgumentException if the request target is invalid - */ - public function withRequestTarget($requestTarget) - { - if (preg_match('#\s#', $requestTarget)) { - throw new InvalidArgumentException( - 'Invalid request target provided; must be a string and cannot contain whitespace' - ); - } - $clone = clone $this; - $clone->requestTarget = $requestTarget; - - return $clone; - } - - /** - * Retrieves the URI instance. - * - * This method MUST return a UriInterface instance. - * - * @link http://tools.ietf.org/html/rfc3986#section-4.3 - * @return UriInterface Returns a UriInterface instance - * representing the URI of the request. - */ - public function getUri() - { - return $this->uri; - } - - /** - * Returns an instance with the provided URI. - * - * This method MUST update the Host header of the returned request by - * default if the URI contains a host component. If the URI does not - * contain a host component, any pre-existing Host header MUST be carried - * over to the returned request. - * - * You can opt-in to preserving the original state of the Host header by - * setting `$preserveHost` to `true`. When `$preserveHost` is set to - * `true`, this method interacts with the Host header in the following ways: - * - * - If the the Host header is missing or empty, and the new URI contains - * a host component, this method MUST update the Host header in the returned - * request. - * - If the Host header is missing or empty, and the new URI does not contain a - * host component, this method MUST NOT update the Host header in the returned - * request. - * - If a Host header is present and non-empty, this method MUST NOT update - * the Host header in the returned request. - * - * This method MUST be implemented in such a way as to retain the - * immutability of the message, and MUST return an instance that has the - * new UriInterface instance. - * - * @link http://tools.ietf.org/html/rfc3986#section-4.3 - * @param UriInterface $uri New request URI to use. - * @param bool $preserveHost Preserve the original state of the Host header. - * @return self - */ - public function withUri(UriInterface $uri, $preserveHost = false) - { - $clone = clone $this; - $clone->uri = $uri; - - if (!$preserveHost) { - if ($uri->getHost() !== '') { - $clone->headers->set('Host', $uri->getHost()); - } - } else { - if ($this->uri->getHost() !== '' && (!$this->hasHeader('Host') || $this->getHeader('Host') === null)) { - $clone->headers->set('Host', $uri->getHost()); - } - } - - return $clone; - } - - /** - * Get request content type. - * - * Note: This method is not part of the PSR-7 standard. - * - * @return string|null The request content type, if known - */ - public function getContentType() - { - $result = $this->getHeader('Content-Type'); - - return $result ? $result[0] : null; - } - - /** - * Get request media type, if known. - * - * Note: This method is not part of the PSR-7 standard. - * - * @return string|null The request media type, minus content-type params - */ - public function getMediaType() - { - $contentType = $this->getContentType(); - if ($contentType) { - $contentTypeParts = preg_split('/\s*[;,]\s*/', $contentType); - - return strtolower($contentTypeParts[0]); - } - - return null; - } - - /** - * Get request media type params, if known. - * - * Note: This method is not part of the PSR-7 standard. - * - * @return array - */ - public function getMediaTypeParams() - { - $contentType = $this->getContentType(); - $contentTypeParams = []; - if ($contentType) { - $contentTypeParts = preg_split('/\s*[;,]\s*/', $contentType); - $contentTypePartsLength = count($contentTypeParts); - for ($i = 1; $i < $contentTypePartsLength; $i++) { - $paramParts = explode('=', $contentTypeParts[$i]); - $contentTypeParams[strtolower($paramParts[0])] = $paramParts[1]; - } - } - - return $contentTypeParams; - } - - /** - * Get request content character set, if known. - * - * Note: This method is not part of the PSR-7 standard. - * - * @return string|null - */ - public function getContentCharset() - { - $mediaTypeParams = $this->getMediaTypeParams(); - if (isset($mediaTypeParams['charset'])) { - return $mediaTypeParams['charset']; - } - - return null; - } - - /** - * Get request content length, if known. - * - * Note: This method is not part of the PSR-7 standard. - * - * @return int|null - */ - public function getContentLength() - { - $result = $this->headers->get('Content-Length'); - - return $result ? (int)$result[0] : null; - } - - /******************************************************************************* - * Cookies - ******************************************************************************/ - - /** - * Retrieve cookies. - * - * Retrieves cookies sent by the client to the server. - * - * The data MUST be compatible with the structure of the $_COOKIE - * superglobal. - * - * @return array - */ - public function getCookieParams() - { - return $this->cookies; - } - - /** - * Fetch cookie value from cookies sent by the client to the server. - * - * Note: This method is not part of the PSR-7 standard. - * - * @param string $name The attribute name. - * @param mixed $default Default value to return if the attribute does not exist. - * - * @return mixed - */ - public function getCookieParam($key, $default = null) - { - $cookies = $this->getCookieParams(); - $result = $default; - if (isset($cookies[$key])) { - $result = $cookies[$key]; - } - - return $result; - } - - /** - * Return an instance with the specified cookies. - * - * The data IS NOT REQUIRED to come from the $_COOKIE superglobal, but MUST - * be compatible with the structure of $_COOKIE. Typically, this data will - * be injected at instantiation. - * - * This method MUST NOT update the related Cookie header of the request - * instance, nor related values in the server params. - * - * This method MUST be implemented in such a way as to retain the - * immutability of the message, and MUST return an instance that has the - * updated cookie values. - * - * @param array $cookies Array of key/value pairs representing cookies. - * @return self - */ - public function withCookieParams(array $cookies) - { - $clone = clone $this; - $clone->cookies = $cookies; - - return $clone; - } - - /******************************************************************************* - * Query Params - ******************************************************************************/ - - /** - * Retrieve query string arguments. - * - * Retrieves the deserialized query string arguments, if any. - * - * Note: the query params might not be in sync with the URI or server - * params. If you need to ensure you are only getting the original - * values, you may need to parse the query string from `getUri()->getQuery()` - * or from the `QUERY_STRING` server param. - * - * @return array - */ - public function getQueryParams() - { - if (is_array($this->queryParams)) { - return $this->queryParams; - } - - if ($this->uri === null) { - return []; - } - - parse_str($this->uri->getQuery(), $this->queryParams); // <-- URL decodes data - - return $this->queryParams; - } - - /** - * Return an instance with the specified query string arguments. - * - * These values SHOULD remain immutable over the course of the incoming - * request. They MAY be injected during instantiation, such as from PHP's - * $_GET superglobal, or MAY be derived from some other value such as the - * URI. In cases where the arguments are parsed from the URI, the data - * MUST be compatible with what PHP's parse_str() would return for - * purposes of how duplicate query parameters are handled, and how nested - * sets are handled. - * - * Setting query string arguments MUST NOT change the URI stored by the - * request, nor the values in the server params. - * - * This method MUST be implemented in such a way as to retain the - * immutability of the message, and MUST return an instance that has the - * updated query string arguments. - * - * @param array $query Array of query string arguments, typically from - * $_GET. - * @return self - */ - public function withQueryParams(array $query) - { - $clone = clone $this; - $clone->queryParams = $query; - - return $clone; - } - - /******************************************************************************* - * File Params - ******************************************************************************/ - - /** - * Retrieve normalized file upload data. - * - * This method returns upload metadata in a normalized tree, with each leaf - * an instance of Psr\Http\Message\UploadedFileInterface. - * - * These values MAY be prepared from $_FILES or the message body during - * instantiation, or MAY be injected via withUploadedFiles(). - * - * @return array An array tree of UploadedFileInterface instances; an empty - * array MUST be returned if no data is present. - */ - public function getUploadedFiles() - { - return $this->uploadedFiles; - } - - /** - * Create a new instance with the specified uploaded files. - * - * This method MUST be implemented in such a way as to retain the - * immutability of the message, and MUST return an instance that has the - * updated body parameters. - * - * @param array $uploadedFiles An array tree of UploadedFileInterface instances. - * @return self - * @throws \InvalidArgumentException if an invalid structure is provided. - */ - public function withUploadedFiles(array $uploadedFiles) - { - $clone = clone $this; - $clone->uploadedFiles = $uploadedFiles; - - return $clone; - } - - /******************************************************************************* - * Server Params - ******************************************************************************/ - - /** - * Retrieve server parameters. - * - * Retrieves data related to the incoming request environment, - * typically derived from PHP's $_SERVER superglobal. The data IS NOT - * REQUIRED to originate from $_SERVER. - * - * @return array - */ - public function getServerParams() - { - return $this->serverParams; - } - - /******************************************************************************* - * Attributes - ******************************************************************************/ - - /** - * Retrieve attributes derived from the request. - * - * The request "attributes" may be used to allow injection of any - * parameters derived from the request: e.g., the results of path - * match operations; the results of decrypting cookies; the results of - * deserializing non-form-encoded message bodies; etc. Attributes - * will be application and request specific, and CAN be mutable. - * - * @return array Attributes derived from the request. - */ - public function getAttributes() - { - return $this->attributes->all(); - } - - /** - * Retrieve a single derived request attribute. - * - * Retrieves a single derived request attribute as described in - * getAttributes(). If the attribute has not been previously set, returns - * the default value as provided. - * - * This method obviates the need for a hasAttribute() method, as it allows - * specifying a default value to return if the attribute is not found. - * - * @see getAttributes() - * @param string $name The attribute name. - * @param mixed $default Default value to return if the attribute does not exist. - * @return mixed - */ - public function getAttribute($name, $default = null) - { - return $this->attributes->get($name, $default); - } - - /** - * Return an instance with the specified derived request attribute. - * - * This method allows setting a single derived request attribute as - * described in getAttributes(). - * - * This method MUST be implemented in such a way as to retain the - * immutability of the message, and MUST return an instance that has the - * updated attribute. - * - * @see getAttributes() - * @param string $name The attribute name. - * @param mixed $value The value of the attribute. - * @return self - */ - public function withAttribute($name, $value) - { - $clone = clone $this; - $clone->attributes->set($name, $value); - - return $clone; - } - - /** - * Create a new instance with the specified derived request attributes. - * - * Note: This method is not part of the PSR-7 standard. - * - * This method allows setting all new derived request attributes as - * described in getAttributes(). - * - * This method MUST be implemented in such a way as to retain the - * immutability of the message, and MUST return a new instance that has the - * updated attributes. - * - * @param array $attributes New attributes - * @return self - */ - public function withAttributes(array $attributes) - { - $clone = clone $this; - $clone->attributes = new Collection($attributes); - - return $clone; - } - - /** - * Return an instance that removes the specified derived request attribute. - * - * This method allows removing a single derived request attribute as - * described in getAttributes(). - * - * This method MUST be implemented in such a way as to retain the - * immutability of the message, and MUST return an instance that removes - * the attribute. - * - * @see getAttributes() - * @param string $name The attribute name. - * @return self - */ - public function withoutAttribute($name) - { - $clone = clone $this; - $clone->attributes->remove($name); - - return $clone; - } - - /******************************************************************************* - * Body - ******************************************************************************/ - - /** - * Retrieve any parameters provided in the request body. - * - * If the request Content-Type is either application/x-www-form-urlencoded - * or multipart/form-data, and the request method is POST, this method MUST - * return the contents of $_POST. - * - * Otherwise, this method may return any results of deserializing - * the request body content; as parsing returns structured content, the - * potential types MUST be arrays or objects only. A null value indicates - * the absence of body content. - * - * @return null|array|object The deserialized body parameters, if any. - * These will typically be an array or object. - * @throws RuntimeException if the request body media type parser returns an invalid value - */ - public function getParsedBody() - { - if ($this->bodyParsed !== false) { - return $this->bodyParsed; - } - - if (!$this->body) { - return null; - } - - $mediaType = $this->getMediaType(); - - // look for a media type with a structured syntax suffix (RFC 6839) - $parts = explode('+', $mediaType); - if (count($parts) >= 2) { - $mediaType = 'application/' . $parts[count($parts)-1]; - } - - if (isset($this->bodyParsers[$mediaType]) === true) { - $body = (string)$this->getBody(); - $parsed = $this->bodyParsers[$mediaType]($body); - - if (!is_null($parsed) && !is_object($parsed) && !is_array($parsed)) { - throw new RuntimeException( - 'Request body media type parser return value must be an array, an object, or null' - ); - } - $this->bodyParsed = $parsed; - return $this->bodyParsed; - } - - return null; - } - - /** - * Return an instance with the specified body parameters. - * - * These MAY be injected during instantiation. - * - * If the request Content-Type is either application/x-www-form-urlencoded - * or multipart/form-data, and the request method is POST, use this method - * ONLY to inject the contents of $_POST. - * - * The data IS NOT REQUIRED to come from $_POST, but MUST be the results of - * deserializing the request body content. Deserialization/parsing returns - * structured data, and, as such, this method ONLY accepts arrays or objects, - * or a null value if nothing was available to parse. - * - * As an example, if content negotiation determines that the request data - * is a JSON payload, this method could be used to create a request - * instance with the deserialized parameters. - * - * This method MUST be implemented in such a way as to retain the - * immutability of the message, and MUST return an instance that has the - * updated body parameters. - * - * @param null|array|object $data The deserialized body data. This will - * typically be in an array or object. - * @return self - * @throws \InvalidArgumentException if an unsupported argument type is - * provided. - */ - public function withParsedBody($data) - { - if (!is_null($data) && !is_object($data) && !is_array($data)) { - throw new InvalidArgumentException('Parsed body value must be an array, an object, or null'); - } - - $clone = clone $this; - $clone->bodyParsed = $data; - - return $clone; - } - - /** - * Force Body to be parsed again. - * - * Note: This method is not part of the PSR-7 standard. - * - * @return self - */ - public function reparseBody() - { - $this->bodyParsed = false; - - return $this; - } - - /** - * Register media type parser. - * - * Note: This method is not part of the PSR-7 standard. - * - * @param string $mediaType A HTTP media type (excluding content-type - * params). - * @param callable $callable A callable that returns parsed contents for - * media type. - */ - public function registerMediaTypeParser($mediaType, callable $callable) - { - if ($callable instanceof Closure) { - $callable = $callable->bindTo($this); - } - $this->bodyParsers[(string)$mediaType] = $callable; - } - - /******************************************************************************* - * Parameters (e.g., POST and GET data) - ******************************************************************************/ - - /** - * Fetch request parameter value from body or query string (in that order). - * - * Note: This method is not part of the PSR-7 standard. - * - * @param string $key The parameter key. - * @param string $default The default value. - * - * @return mixed The parameter value. - */ - public function getParam($key, $default = null) - { - $postParams = $this->getParsedBody(); - $getParams = $this->getQueryParams(); - $result = $default; - if (is_array($postParams) && isset($postParams[$key])) { - $result = $postParams[$key]; - } elseif (is_object($postParams) && property_exists($postParams, $key)) { - $result = $postParams->$key; - } elseif (isset($getParams[$key])) { - $result = $getParams[$key]; - } - - return $result; - } - - /** - * Fetch parameter value from request body. - * - * Note: This method is not part of the PSR-7 standard. - * - * @param $key - * @param null $default - * - * @return null - */ - public function getParsedBodyParam($key, $default = null) - { - $postParams = $this->getParsedBody(); - $result = $default; - if (is_array($postParams) && isset($postParams[$key])) { - $result = $postParams[$key]; - } elseif (is_object($postParams) && property_exists($postParams, $key)) { - $result = $postParams->$key; - } - - return $result; - } - - /** - * Fetch parameter value from query string. - * - * Note: This method is not part of the PSR-7 standard. - * - * @param $key - * @param null $default - * - * @return null - */ - public function getQueryParam($key, $default = null) - { - $getParams = $this->getQueryParams(); - $result = $default; - if (isset($getParams[$key])) { - $result = $getParams[$key]; - } - - return $result; - } - - /** - * Fetch assocative array of body and query string parameters. - * - * Note: This method is not part of the PSR-7 standard. - * - * @return array - */ - public function getParams() - { - $params = $this->getQueryParams(); - $postParams = $this->getParsedBody(); - if ($postParams) { - $params = array_merge($params, (array)$postParams); - } - - return $params; - } -} diff --git a/vendor/slim/slim/Slim/Http/RequestBody.php b/vendor/slim/slim/Slim/Http/RequestBody.php deleted file mode 100644 index 2345fe4..0000000 --- a/vendor/slim/slim/Slim/Http/RequestBody.php +++ /dev/null @@ -1,27 +0,0 @@ -<?php -/** - * Slim Framework (http://slimframework.com) - * - * @link https://github.com/slimphp/Slim - * @copyright Copyright (c) 2011-2016 Josh Lockhart - * @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License) - */ -namespace Slim\Http; - -/** - * Provides a PSR-7 implementation of a reusable raw request body - */ -class RequestBody extends Body -{ - /** - * Create a new RequestBody. - */ - public function __construct() - { - $stream = fopen('php://temp', 'w+'); - stream_copy_to_stream(fopen('php://input', 'r'), $stream); - rewind($stream); - - parent::__construct($stream); - } -} diff --git a/vendor/slim/slim/Slim/Http/Response.php b/vendor/slim/slim/Slim/Http/Response.php deleted file mode 100644 index a70d35d..0000000 --- a/vendor/slim/slim/Slim/Http/Response.php +++ /dev/null @@ -1,470 +0,0 @@ -<?php -/** - * Slim Framework (http://slimframework.com) - * - * @link https://github.com/slimphp/Slim - * @copyright Copyright (c) 2011-2016 Josh Lockhart - * @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License) - */ -namespace Slim\Http; - -use InvalidArgumentException; -use Psr\Http\Message\ResponseInterface; -use Psr\Http\Message\StreamInterface; -use Psr\Http\Message\UriInterface; -use Slim\Interfaces\Http\HeadersInterface; - -/** - * Response - * - * This class represents an HTTP response. It manages - * the response status, headers, and body - * according to the PSR-7 standard. - * - * @link https://github.com/php-fig/http-message/blob/master/src/MessageInterface.php - * @link https://github.com/php-fig/http-message/blob/master/src/ResponseInterface.php - */ -class Response extends Message implements ResponseInterface -{ - /** - * Status code - * - * @var int - */ - protected $status = 200; - - /** - * Reason phrase - * - * @var string - */ - protected $reasonPhrase = ''; - - /** - * Status codes and reason phrases - * - * @var array - */ - protected static $messages = [ - //Informational 1xx - 100 => 'Continue', - 101 => 'Switching Protocols', - 102 => 'Processing', - //Successful 2xx - 200 => 'OK', - 201 => 'Created', - 202 => 'Accepted', - 203 => 'Non-Authoritative Information', - 204 => 'No Content', - 205 => 'Reset Content', - 206 => 'Partial Content', - 207 => 'Multi-Status', - 208 => 'Already Reported', - 226 => 'IM Used', - //Redirection 3xx - 300 => 'Multiple Choices', - 301 => 'Moved Permanently', - 302 => 'Found', - 303 => 'See Other', - 304 => 'Not Modified', - 305 => 'Use Proxy', - 306 => '(Unused)', - 307 => 'Temporary Redirect', - 308 => 'Permanent Redirect', - //Client Error 4xx - 400 => 'Bad Request', - 401 => 'Unauthorized', - 402 => 'Payment Required', - 403 => 'Forbidden', - 404 => 'Not Found', - 405 => 'Method Not Allowed', - 406 => 'Not Acceptable', - 407 => 'Proxy Authentication Required', - 408 => 'Request Timeout', - 409 => 'Conflict', - 410 => 'Gone', - 411 => 'Length Required', - 412 => 'Precondition Failed', - 413 => 'Request Entity Too Large', - 414 => 'Request-URI Too Long', - 415 => 'Unsupported Media Type', - 416 => 'Requested Range Not Satisfiable', - 417 => 'Expectation Failed', - 418 => 'I\'m a teapot', - 422 => 'Unprocessable Entity', - 423 => 'Locked', - 424 => 'Failed Dependency', - 426 => 'Upgrade Required', - 428 => 'Precondition Required', - 429 => 'Too Many Requests', - 431 => 'Request Header Fields Too Large', - 451 => 'Unavailable For Legal Reasons', - //Server Error 5xx - 500 => 'Internal Server Error', - 501 => 'Not Implemented', - 502 => 'Bad Gateway', - 503 => 'Service Unavailable', - 504 => 'Gateway Timeout', - 505 => 'HTTP Version Not Supported', - 506 => 'Variant Also Negotiates', - 507 => 'Insufficient Storage', - 508 => 'Loop Detected', - 510 => 'Not Extended', - 511 => 'Network Authentication Required', - ]; - - /** - * Create new HTTP response. - * - * @param int $status The response status code. - * @param HeadersInterface|null $headers The response headers. - * @param StreamInterface|null $body The response body. - */ - public function __construct($status = 200, HeadersInterface $headers = null, StreamInterface $body = null) - { - $this->status = $this->filterStatus($status); - $this->headers = $headers ? $headers : new Headers(); - $this->body = $body ? $body : new Body(fopen('php://temp', 'r+')); - } - - /** - * This method is applied to the cloned object - * after PHP performs an initial shallow-copy. This - * method completes a deep-copy by creating new objects - * for the cloned object's internal reference pointers. - */ - public function __clone() - { - $this->headers = clone $this->headers; - } - - /******************************************************************************* - * Status - ******************************************************************************/ - - /** - * Gets the response status code. - * - * The status code is a 3-digit integer result code of the server's attempt - * to understand and satisfy the request. - * - * @return int Status code. - */ - public function getStatusCode() - { - return $this->status; - } - - /** - * Return an instance with the specified status code and, optionally, reason phrase. - * - * If no reason phrase is specified, implementations MAY choose to default - * to the RFC 7231 or IANA recommended reason phrase for the response's - * status code. - * - * This method MUST be implemented in such a way as to retain the - * immutability of the message, and MUST return an instance that has the - * updated status and reason phrase. - * - * @link http://tools.ietf.org/html/rfc7231#section-6 - * @link http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml - * @param int $code The 3-digit integer result code to set. - * @param string $reasonPhrase The reason phrase to use with the - * provided status code; if none is provided, implementations MAY - * use the defaults as suggested in the HTTP specification. - * @return self - * @throws \InvalidArgumentException For invalid status code arguments. - */ - public function withStatus($code, $reasonPhrase = '') - { - $code = $this->filterStatus($code); - - if (!is_string($reasonPhrase) && !method_exists($reasonPhrase, '__toString')) { - throw new InvalidArgumentException('ReasonPhrase must be a string'); - } - - $clone = clone $this; - $clone->status = $code; - if ($reasonPhrase === '' && isset(static::$messages[$code])) { - $reasonPhrase = static::$messages[$code]; - } - - if ($reasonPhrase === '') { - throw new InvalidArgumentException('ReasonPhrase must be supplied for this code'); - } - - $clone->reasonPhrase = $reasonPhrase; - - return $clone; - } - - /** - * Filter HTTP status code. - * - * @param int $status HTTP status code. - * @return int - * @throws \InvalidArgumentException If an invalid HTTP status code is provided. - */ - protected function filterStatus($status) - { - if (!is_integer($status) || $status<100 || $status>599) { - throw new InvalidArgumentException('Invalid HTTP status code'); - } - - return $status; - } - - /** - * Gets the response reason phrase associated with the status code. - * - * Because a reason phrase is not a required element in a response - * status line, the reason phrase value MAY be null. Implementations MAY - * choose to return the default RFC 7231 recommended reason phrase (or those - * listed in the IANA HTTP Status Code Registry) for the response's - * status code. - * - * @link http://tools.ietf.org/html/rfc7231#section-6 - * @link http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml - * @return string Reason phrase; must return an empty string if none present. - */ - public function getReasonPhrase() - { - if ($this->reasonPhrase) { - return $this->reasonPhrase; - } - if (isset(static::$messages[$this->status])) { - return static::$messages[$this->status]; - } - return ''; - } - - /******************************************************************************* - * Body - ******************************************************************************/ - - /** - * Write data to the response body. - * - * Note: This method is not part of the PSR-7 standard. - * - * Proxies to the underlying stream and writes the provided data to it. - * - * @param string $data - * @return self - */ - public function write($data) - { - $this->getBody()->write($data); - - return $this; - } - - /******************************************************************************* - * Response Helpers - ******************************************************************************/ - - /** - * Redirect. - * - * Note: This method is not part of the PSR-7 standard. - * - * This method prepares the response object to return an HTTP Redirect - * response to the client. - * - * @param string|UriInterface $url The redirect destination. - * @param int|null $status The redirect HTTP status code. - * @return self - */ - public function withRedirect($url, $status = null) - { - $responseWithRedirect = $this->withHeader('Location', (string)$url); - - if (is_null($status) && $this->getStatusCode() === 200) { - $status = 302; - } - - if (!is_null($status)) { - return $responseWithRedirect->withStatus($status); - } - - return $responseWithRedirect; - } - - /** - * Json. - * - * Note: This method is not part of the PSR-7 standard. - * - * This method prepares the response object to return an HTTP Json - * response to the client. - * - * @param mixed $data The data - * @param int $status The HTTP status code. - * @param int $encodingOptions Json encoding options - * @throws \RuntimeException - * @return self - */ - public function withJson($data, $status = null, $encodingOptions = 0) - { - $body = $this->getBody(); - $body->rewind(); - $body->write($json = json_encode($data, $encodingOptions)); - - // Ensure that the json encoding passed successfully - if ($json === false) { - throw new \RuntimeException(json_last_error_msg(), json_last_error()); - } - - $responseWithJson = $this->withHeader('Content-Type', 'application/json;charset=utf-8'); - if (isset($status)) { - return $responseWithJson->withStatus($status); - } - return $responseWithJson; - } - - /** - * Is this response empty? - * - * Note: This method is not part of the PSR-7 standard. - * - * @return bool - */ - public function isEmpty() - { - return in_array($this->getStatusCode(), [204, 205, 304]); - } - - /** - * Is this response informational? - * - * Note: This method is not part of the PSR-7 standard. - * - * @return bool - */ - public function isInformational() - { - return $this->getStatusCode() >= 100 && $this->getStatusCode() < 200; - } - - /** - * Is this response OK? - * - * Note: This method is not part of the PSR-7 standard. - * - * @return bool - */ - public function isOk() - { - return $this->getStatusCode() === 200; - } - - /** - * Is this response successful? - * - * Note: This method is not part of the PSR-7 standard. - * - * @return bool - */ - public function isSuccessful() - { - return $this->getStatusCode() >= 200 && $this->getStatusCode() < 300; - } - - /** - * Is this response a redirect? - * - * Note: This method is not part of the PSR-7 standard. - * - * @return bool - */ - public function isRedirect() - { - return in_array($this->getStatusCode(), [301, 302, 303, 307]); - } - - /** - * Is this response a redirection? - * - * Note: This method is not part of the PSR-7 standard. - * - * @return bool - */ - public function isRedirection() - { - return $this->getStatusCode() >= 300 && $this->getStatusCode() < 400; - } - - /** - * Is this response forbidden? - * - * Note: This method is not part of the PSR-7 standard. - * - * @return bool - * @api - */ - public function isForbidden() - { - return $this->getStatusCode() === 403; - } - - /** - * Is this response not Found? - * - * Note: This method is not part of the PSR-7 standard. - * - * @return bool - */ - public function isNotFound() - { - return $this->getStatusCode() === 404; - } - - /** - * Is this response a client error? - * - * Note: This method is not part of the PSR-7 standard. - * - * @return bool - */ - public function isClientError() - { - return $this->getStatusCode() >= 400 && $this->getStatusCode() < 500; - } - - /** - * Is this response a server error? - * - * Note: This method is not part of the PSR-7 standard. - * - * @return bool - */ - public function isServerError() - { - return $this->getStatusCode() >= 500 && $this->getStatusCode() < 600; - } - - /** - * Convert response to string. - * - * Note: This method is not part of the PSR-7 standard. - * - * @return string - */ - public function __toString() - { - $output = sprintf( - 'HTTP/%s %s %s', - $this->getProtocolVersion(), - $this->getStatusCode(), - $this->getReasonPhrase() - ); - $output .= PHP_EOL; - foreach ($this->getHeaders() as $name => $values) { - $output .= sprintf('%s: %s', $name, $this->getHeaderLine($name)) . PHP_EOL; - } - $output .= PHP_EOL; - $output .= (string)$this->getBody(); - - return $output; - } -} diff --git a/vendor/slim/slim/Slim/Http/Stream.php b/vendor/slim/slim/Slim/Http/Stream.php deleted file mode 100644 index 62c9562..0000000 --- a/vendor/slim/slim/Slim/Http/Stream.php +++ /dev/null @@ -1,450 +0,0 @@ -<?php -/** - * Slim Framework (http://slimframework.com) - * - * @link https://github.com/slimphp/Slim - * @copyright Copyright (c) 2011-2016 Josh Lockhart - * @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License) - */ -namespace Slim\Http; - -use InvalidArgumentException; -use Psr\Http\Message\StreamInterface; -use RuntimeException; - -/** - * Represents a data stream as defined in PSR-7. - * - * @link https://github.com/php-fig/http-message/blob/master/src/StreamInterface.php - */ -class Stream implements StreamInterface -{ - /** - * Bit mask to determine if the stream is a pipe - * - * This is octal as per header stat.h - */ - const FSTAT_MODE_S_IFIFO = 0010000; - - /** - * Resource modes - * - * @var array - * @link http://php.net/manual/function.fopen.php - */ - protected static $modes = [ - 'readable' => ['r', 'r+', 'w+', 'a+', 'x+', 'c+'], - 'writable' => ['r+', 'w', 'w+', 'a', 'a+', 'x', 'x+', 'c', 'c+'], - ]; - - /** - * The underlying stream resource - * - * @var resource - */ - protected $stream; - - /** - * Stream metadata - * - * @var array - */ - protected $meta; - - /** - * Is this stream readable? - * - * @var bool - */ - protected $readable; - - /** - * Is this stream writable? - * - * @var bool - */ - protected $writable; - - /** - * Is this stream seekable? - * - * @var bool - */ - protected $seekable; - - /** - * The size of the stream if known - * - * @var null|int - */ - protected $size; - - /** - * Is this stream a pipe? - * - * @var bool - */ - protected $isPipe; - - /** - * Create a new Stream. - * - * @param resource $stream A PHP resource handle. - * - * @throws InvalidArgumentException If argument is not a resource. - */ - public function __construct($stream) - { - $this->attach($stream); - } - - /** - * Get stream metadata as an associative array or retrieve a specific key. - * - * The keys returned are identical to the keys returned from PHP's - * stream_get_meta_data() function. - * - * @link http://php.net/manual/en/function.stream-get-meta-data.php - * - * @param string $key Specific metadata to retrieve. - * - * @return array|mixed|null Returns an associative array if no key is - * provided. Returns a specific key value if a key is provided and the - * value is found, or null if the key is not found. - */ - public function getMetadata($key = null) - { - $this->meta = stream_get_meta_data($this->stream); - if (is_null($key) === true) { - return $this->meta; - } - - return isset($this->meta[$key]) ? $this->meta[$key] : null; - } - - /** - * Is a resource attached to this stream? - * - * Note: This method is not part of the PSR-7 standard. - * - * @return bool - */ - protected function isAttached() - { - return is_resource($this->stream); - } - - /** - * Attach new resource to this object. - * - * Note: This method is not part of the PSR-7 standard. - * - * @param resource $newStream A PHP resource handle. - * - * @throws InvalidArgumentException If argument is not a valid PHP resource. - */ - protected function attach($newStream) - { - if (is_resource($newStream) === false) { - throw new InvalidArgumentException(__METHOD__ . ' argument must be a valid PHP resource'); - } - - if ($this->isAttached() === true) { - $this->detach(); - } - - $this->stream = $newStream; - } - - /** - * Separates any underlying resources from the stream. - * - * After the stream has been detached, the stream is in an unusable state. - * - * @return resource|null Underlying PHP stream, if any - */ - public function detach() - { - $oldResource = $this->stream; - $this->stream = null; - $this->meta = null; - $this->readable = null; - $this->writable = null; - $this->seekable = null; - $this->size = null; - $this->isPipe = null; - - return $oldResource; - } - - /** - * Reads all data from the stream into a string, from the beginning to end. - * - * This method MUST attempt to seek to the beginning of the stream before - * reading data and read the stream until the end is reached. - * - * Warning: This could attempt to load a large amount of data into memory. - * - * This method MUST NOT raise an exception in order to conform with PHP's - * string casting operations. - * - * @see http://php.net/manual/en/language.oop5.magic.php#object.tostring - * @return string - */ - public function __toString() - { - if (!$this->isAttached()) { - return ''; - } - - try { - $this->rewind(); - return $this->getContents(); - } catch (RuntimeException $e) { - return ''; - } - } - - /** - * Closes the stream and any underlying resources. - */ - public function close() - { - if ($this->isAttached() === true) { - if ($this->isPipe()) { - pclose($this->stream); - } else { - fclose($this->stream); - } - } - - $this->detach(); - } - - /** - * Get the size of the stream if known. - * - * @return int|null Returns the size in bytes if known, or null if unknown. - */ - public function getSize() - { - if (!$this->size && $this->isAttached() === true) { - $stats = fstat($this->stream); - $this->size = isset($stats['size']) && !$this->isPipe() ? $stats['size'] : null; - } - - return $this->size; - } - - /** - * Returns the current position of the file read/write pointer - * - * @return int Position of the file pointer - * - * @throws RuntimeException on error. - */ - public function tell() - { - if (!$this->isAttached() || ($position = ftell($this->stream)) === false || $this->isPipe()) { - throw new RuntimeException('Could not get the position of the pointer in stream'); - } - - return $position; - } - - /** - * Returns true if the stream is at the end of the stream. - * - * @return bool - */ - public function eof() - { - return $this->isAttached() ? feof($this->stream) : true; - } - - /** - * Returns whether or not the stream is readable. - * - * @return bool - */ - public function isReadable() - { - if ($this->readable === null) { - if ($this->isPipe()) { - $this->readable = true; - } else { - $this->readable = false; - if ($this->isAttached()) { - $meta = $this->getMetadata(); - foreach (self::$modes['readable'] as $mode) { - if (strpos($meta['mode'], $mode) === 0) { - $this->readable = true; - break; - } - } - } - } - } - - return $this->readable; - } - - /** - * Returns whether or not the stream is writable. - * - * @return bool - */ - public function isWritable() - { - if ($this->writable === null) { - $this->writable = false; - if ($this->isAttached()) { - $meta = $this->getMetadata(); - foreach (self::$modes['writable'] as $mode) { - if (strpos($meta['mode'], $mode) === 0) { - $this->writable = true; - break; - } - } - } - } - - return $this->writable; - } - - /** - * Returns whether or not the stream is seekable. - * - * @return bool - */ - public function isSeekable() - { - if ($this->seekable === null) { - $this->seekable = false; - if ($this->isAttached()) { - $meta = $this->getMetadata(); - $this->seekable = !$this->isPipe() && $meta['seekable']; - } - } - - return $this->seekable; - } - - /** - * Seek to a position in the stream. - * - * @link http://www.php.net/manual/en/function.fseek.php - * - * @param int $offset Stream offset - * @param int $whence Specifies how the cursor position will be calculated - * based on the seek offset. Valid values are identical to the built-in - * PHP $whence values for `fseek()`. SEEK_SET: Set position equal to - * offset bytes SEEK_CUR: Set position to current location plus offset - * SEEK_END: Set position to end-of-stream plus offset. - * - * @throws RuntimeException on failure. - */ - public function seek($offset, $whence = SEEK_SET) - { - // Note that fseek returns 0 on success! - if (!$this->isSeekable() || fseek($this->stream, $offset, $whence) === -1) { - throw new RuntimeException('Could not seek in stream'); - } - } - - /** - * Seek to the beginning of the stream. - * - * If the stream is not seekable, this method will raise an exception; - * otherwise, it will perform a seek(0). - * - * @see seek() - * - * @link http://www.php.net/manual/en/function.fseek.php - * - * @throws RuntimeException on failure. - */ - public function rewind() - { - if (!$this->isSeekable() || rewind($this->stream) === false) { - throw new RuntimeException('Could not rewind stream'); - } - } - - /** - * Read data from the stream. - * - * @param int $length Read up to $length bytes from the object and return - * them. Fewer than $length bytes may be returned if underlying stream - * call returns fewer bytes. - * - * @return string Returns the data read from the stream, or an empty string - * if no bytes are available. - * - * @throws RuntimeException if an error occurs. - */ - public function read($length) - { - if (!$this->isReadable() || ($data = fread($this->stream, $length)) === false) { - throw new RuntimeException('Could not read from stream'); - } - - return $data; - } - - /** - * Write data to the stream. - * - * @param string $string The string that is to be written. - * - * @return int Returns the number of bytes written to the stream. - * - * @throws RuntimeException on failure. - */ - public function write($string) - { - if (!$this->isWritable() || ($written = fwrite($this->stream, $string)) === false) { - throw new RuntimeException('Could not write to stream'); - } - - // reset size so that it will be recalculated on next call to getSize() - $this->size = null; - - return $written; - } - - /** - * Returns the remaining contents in a string - * - * @return string - * - * @throws RuntimeException if unable to read or an error occurs while - * reading. - */ - public function getContents() - { - if (!$this->isReadable() || ($contents = stream_get_contents($this->stream)) === false) { - throw new RuntimeException('Could not get contents of stream'); - } - - return $contents; - } - - /** - * Returns whether or not the stream is a pipe. - * - * @return bool - */ - public function isPipe() - { - if ($this->isPipe === null) { - $this->isPipe = false; - if ($this->isAttached()) { - $mode = fstat($this->stream)['mode']; - $this->isPipe = ($mode & self::FSTAT_MODE_S_IFIFO) !== 0; - } - } - - return $this->isPipe; - } -} diff --git a/vendor/slim/slim/Slim/Http/UploadedFile.php b/vendor/slim/slim/Slim/Http/UploadedFile.php deleted file mode 100644 index 48ed3ff..0000000 --- a/vendor/slim/slim/Slim/Http/UploadedFile.php +++ /dev/null @@ -1,327 +0,0 @@ -<?php -/** - * Slim Framework (http://slimframework.com) - * - * @link https://github.com/slimphp/Slim - * @copyright Copyright (c) 2011-2016 Josh Lockhart - * @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License) - */ -namespace Slim\Http; - -use RuntimeException; -use InvalidArgumentException; -use Psr\Http\Message\StreamInterface; -use Psr\Http\Message\UploadedFileInterface; - -/** - * Represents Uploaded Files. - * - * It manages and normalizes uploaded files according to the PSR-7 standard. - * - * @link https://github.com/php-fig/http-message/blob/master/src/UploadedFileInterface.php - * @link https://github.com/php-fig/http-message/blob/master/src/StreamInterface.php - */ -class UploadedFile implements UploadedFileInterface -{ - /** - * The client-provided full path to the file - * - * @note this is public to maintain BC with 3.1.0 and earlier. - * - * @var string - */ - public $file; - /** - * The client-provided file name. - * - * @var string - */ - protected $name; - /** - * The client-provided media type of the file. - * - * @var string - */ - protected $type; - /** - * The size of the file in bytes. - * - * @var int - */ - protected $size; - /** - * A valid PHP UPLOAD_ERR_xxx code for the file upload. - * - * @var int - */ - protected $error = UPLOAD_ERR_OK; - /** - * Indicates if the upload is from a SAPI environment. - * - * @var bool - */ - protected $sapi = false; - /** - * An optional StreamInterface wrapping the file resource. - * - * @var StreamInterface - */ - protected $stream; - /** - * Indicates if the uploaded file has already been moved. - * - * @var bool - */ - protected $moved = false; - - /** - * Create a normalized tree of UploadedFile instances from the Environment. - * - * @param Environment $env The environment - * - * @return array|null A normalized tree of UploadedFile instances or null if none are provided. - */ - public static function createFromEnvironment(Environment $env) - { - if (is_array($env['slim.files']) && $env->has('slim.files')) { - return $env['slim.files']; - } elseif (isset($_FILES)) { - return static::parseUploadedFiles($_FILES); - } - - return []; - } - - /** - * Parse a non-normalized, i.e. $_FILES superglobal, tree of uploaded file data. - * - * @param array $uploadedFiles The non-normalized tree of uploaded file data. - * - * @return array A normalized tree of UploadedFile instances. - */ - private static function parseUploadedFiles(array $uploadedFiles) - { - $parsed = []; - foreach ($uploadedFiles as $field => $uploadedFile) { - if (!isset($uploadedFile['error'])) { - if (is_array($uploadedFile)) { - $parsed[$field] = static::parseUploadedFiles($uploadedFile); - } - continue; - } - - $parsed[$field] = []; - if (!is_array($uploadedFile['error'])) { - $parsed[$field] = new static( - $uploadedFile['tmp_name'], - isset($uploadedFile['name']) ? $uploadedFile['name'] : null, - isset($uploadedFile['type']) ? $uploadedFile['type'] : null, - isset($uploadedFile['size']) ? $uploadedFile['size'] : null, - $uploadedFile['error'], - true - ); - } else { - $subArray = []; - foreach ($uploadedFile['error'] as $fileIdx => $error) { - // normalise subarray and re-parse to move the input's keyname up a level - $subArray[$fileIdx]['name'] = $uploadedFile['name'][$fileIdx]; - $subArray[$fileIdx]['type'] = $uploadedFile['type'][$fileIdx]; - $subArray[$fileIdx]['tmp_name'] = $uploadedFile['tmp_name'][$fileIdx]; - $subArray[$fileIdx]['error'] = $uploadedFile['error'][$fileIdx]; - $subArray[$fileIdx]['size'] = $uploadedFile['size'][$fileIdx]; - - $parsed[$field] = static::parseUploadedFiles($subArray); - } - } - } - - return $parsed; - } - - /** - * Construct a new UploadedFile instance. - * - * @param string $file The full path to the uploaded file provided by the client. - * @param string|null $name The file name. - * @param string|null $type The file media type. - * @param int|null $size The file size in bytes. - * @param int $error The UPLOAD_ERR_XXX code representing the status of the upload. - * @param bool $sapi Indicates if the upload is in a SAPI environment. - */ - public function __construct($file, $name = null, $type = null, $size = null, $error = UPLOAD_ERR_OK, $sapi = false) - { - $this->file = $file; - $this->name = $name; - $this->type = $type; - $this->size = $size; - $this->error = $error; - $this->sapi = $sapi; - } - - /** - * Retrieve a stream representing the uploaded file. - * - * This method MUST return a StreamInterface instance, representing the - * uploaded file. The purpose of this method is to allow utilizing native PHP - * stream functionality to manipulate the file upload, such as - * stream_copy_to_stream() (though the result will need to be decorated in a - * native PHP stream wrapper to work with such functions). - * - * If the moveTo() method has been called previously, this method MUST raise - * an exception. - * - * @return StreamInterface Stream representation of the uploaded file. - * @throws \RuntimeException in cases when no stream is available or can be - * created. - */ - public function getStream() - { - if ($this->moved) { - throw new \RuntimeException(sprintf('Uploaded file %1s has already been moved', $this->name)); - } - if ($this->stream === null) { - $this->stream = new Stream(fopen($this->file, 'r')); - } - - return $this->stream; - } - - /** - * Move the uploaded file to a new location. - * - * Use this method as an alternative to move_uploaded_file(). This method is - * guaranteed to work in both SAPI and non-SAPI environments. - * Implementations must determine which environment they are in, and use the - * appropriate method (move_uploaded_file(), rename(), or a stream - * operation) to perform the operation. - * - * $targetPath may be an absolute path, or a relative path. If it is a - * relative path, resolution should be the same as used by PHP's rename() - * function. - * - * The original file or stream MUST be removed on completion. - * - * If this method is called more than once, any subsequent calls MUST raise - * an exception. - * - * When used in an SAPI environment where $_FILES is populated, when writing - * files via moveTo(), is_uploaded_file() and move_uploaded_file() SHOULD be - * used to ensure permissions and upload status are verified correctly. - * - * If you wish to move to a stream, use getStream(), as SAPI operations - * cannot guarantee writing to stream destinations. - * - * @see http://php.net/is_uploaded_file - * @see http://php.net/move_uploaded_file - * - * @param string $targetPath Path to which to move the uploaded file. - * - * @throws InvalidArgumentException if the $path specified is invalid. - * @throws RuntimeException on any error during the move operation, or on - * the second or subsequent call to the method. - */ - public function moveTo($targetPath) - { - if ($this->moved) { - throw new RuntimeException('Uploaded file already moved'); - } - - $targetIsStream = strpos($targetPath, '://') > 0; - if (!$targetIsStream && !is_writable(dirname($targetPath))) { - throw new InvalidArgumentException('Upload target path is not writable'); - } - - if ($targetIsStream) { - if (!copy($this->file, $targetPath)) { - throw new RuntimeException(sprintf('Error moving uploaded file %1s to %2s', $this->name, $targetPath)); - } - if (!unlink($this->file)) { - throw new RuntimeException(sprintf('Error removing uploaded file %1s', $this->name)); - } - } elseif ($this->sapi) { - if (!is_uploaded_file($this->file)) { - throw new RuntimeException(sprintf('%1s is not a valid uploaded file', $this->file)); - } - - if (!move_uploaded_file($this->file, $targetPath)) { - throw new RuntimeException(sprintf('Error moving uploaded file %1s to %2s', $this->name, $targetPath)); - } - } else { - if (!rename($this->file, $targetPath)) { - throw new RuntimeException(sprintf('Error moving uploaded file %1s to %2s', $this->name, $targetPath)); - } - } - - $this->moved = true; - } - - /** - * Retrieve the error associated with the uploaded file. - * - * The return value MUST be one of PHP's UPLOAD_ERR_XXX constants. - * - * If the file was uploaded successfully, this method MUST return - * UPLOAD_ERR_OK. - * - * Implementations SHOULD return the value stored in the "error" key of - * the file in the $_FILES array. - * - * @see http://php.net/manual/en/features.file-upload.errors.php - * - * @return int One of PHP's UPLOAD_ERR_XXX constants. - */ - public function getError() - { - return $this->error; - } - - /** - * Retrieve the filename sent by the client. - * - * Do not trust the value returned by this method. A client could send - * a malicious filename with the intention to corrupt or hack your - * application. - * - * Implementations SHOULD return the value stored in the "name" key of - * the file in the $_FILES array. - * - * @return string|null The filename sent by the client or null if none - * was provided. - */ - public function getClientFilename() - { - return $this->name; - } - - /** - * Retrieve the media type sent by the client. - * - * Do not trust the value returned by this method. A client could send - * a malicious media type with the intention to corrupt or hack your - * application. - * - * Implementations SHOULD return the value stored in the "type" key of - * the file in the $_FILES array. - * - * @return string|null The media type sent by the client or null if none - * was provided. - */ - public function getClientMediaType() - { - return $this->type; - } - - /** - * Retrieve the file size. - * - * Implementations SHOULD return the value stored in the "size" key of - * the file in the $_FILES array if available, as PHP calculates this based - * on the actual size transmitted. - * - * @return int|null The file size in bytes or null if unknown. - */ - public function getSize() - { - return $this->size; - } -} diff --git a/vendor/slim/slim/Slim/Http/Uri.php b/vendor/slim/slim/Slim/Http/Uri.php deleted file mode 100644 index 6b87747..0000000 --- a/vendor/slim/slim/Slim/Http/Uri.php +++ /dev/null @@ -1,824 +0,0 @@ -<?php -/** - * Slim Framework (http://slimframework.com) - * - * @link https://github.com/slimphp/Slim - * @copyright Copyright (c) 2011-2016 Josh Lockhart - * @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License) - */ -namespace Slim\Http; - -use InvalidArgumentException; -use \Psr\Http\Message\UriInterface; -use Slim\Http\Environment; - -/** - * Value object representing a URI. - * - * This interface is meant to represent URIs according to RFC 3986 and to - * provide methods for most common operations. Additional functionality for - * working with URIs can be provided on top of the interface or externally. - * Its primary use is for HTTP requests, but may also be used in other - * contexts. - * - * Instances of this interface are considered immutable; all methods that - * might change state MUST be implemented such that they retain the internal - * state of the current instance and return an instance that contains the - * changed state. - * - * Typically the Host header will be also be present in the request message. - * For server-side requests, the scheme will typically be discoverable in the - * server parameters. - * - * @link http://tools.ietf.org/html/rfc3986 (the URI specification) - */ -class Uri implements UriInterface -{ - /** - * Uri scheme (without "://" suffix) - * - * @var string - */ - protected $scheme = ''; - - /** - * Uri user - * - * @var string - */ - protected $user = ''; - - /** - * Uri password - * - * @var string - */ - protected $password = ''; - - /** - * Uri host - * - * @var string - */ - protected $host = ''; - - /** - * Uri port number - * - * @var null|int - */ - protected $port; - - /** - * Uri base path - * - * @var string - */ - protected $basePath = ''; - - /** - * Uri path - * - * @var string - */ - protected $path = ''; - - /** - * Uri query string (without "?" prefix) - * - * @var string - */ - protected $query = ''; - - /** - * Uri fragment string (without "#" prefix) - * - * @var string - */ - protected $fragment = ''; - - /** - * Create new Uri. - * - * @param string $scheme Uri scheme. - * @param string $host Uri host. - * @param int $port Uri port number. - * @param string $path Uri path. - * @param string $query Uri query string. - * @param string $fragment Uri fragment. - * @param string $user Uri user. - * @param string $password Uri password. - */ - public function __construct( - $scheme, - $host, - $port = null, - $path = '/', - $query = '', - $fragment = '', - $user = '', - $password = '' - ) { - $this->scheme = $this->filterScheme($scheme); - $this->host = $host; - $this->port = $this->filterPort($port); - $this->path = empty($path) ? '/' : $this->filterPath($path); - $this->query = $this->filterQuery($query); - $this->fragment = $this->filterQuery($fragment); - $this->user = $user; - $this->password = $password; - } - - /** - * Create new Uri from string. - * - * @param string $uri Complete Uri string - * (i.e., https://user:pass@host:443/path?query). - * - * @return self - */ - public static function createFromString($uri) - { - if (!is_string($uri) && !method_exists($uri, '__toString')) { - throw new InvalidArgumentException('Uri must be a string'); - } - - $parts = parse_url($uri); - $scheme = isset($parts['scheme']) ? $parts['scheme'] : ''; - $user = isset($parts['user']) ? $parts['user'] : ''; - $pass = isset($parts['pass']) ? $parts['pass'] : ''; - $host = isset($parts['host']) ? $parts['host'] : ''; - $port = isset($parts['port']) ? $parts['port'] : null; - $path = isset($parts['path']) ? $parts['path'] : ''; - $query = isset($parts['query']) ? $parts['query'] : ''; - $fragment = isset($parts['fragment']) ? $parts['fragment'] : ''; - - return new static($scheme, $host, $port, $path, $query, $fragment, $user, $pass); - } - - /** - * Create new Uri from environment. - * - * @param Environment $env - * - * @return self - */ - public static function createFromEnvironment(Environment $env) - { - // Scheme - $isSecure = $env->get('HTTPS'); - $scheme = (empty($isSecure) || $isSecure === 'off') ? 'http' : 'https'; - - // Authority: Username and password - $username = $env->get('PHP_AUTH_USER', ''); - $password = $env->get('PHP_AUTH_PW', ''); - - // Authority: Host - if ($env->has('HTTP_HOST')) { - $host = $env->get('HTTP_HOST'); - } else { - $host = $env->get('SERVER_NAME'); - } - - // Authority: Port - $port = (int)$env->get('SERVER_PORT', 80); - if (preg_match('/^(\[[a-fA-F0-9:.]+\])(:\d+)?\z/', $host, $matches)) { - $host = $matches[1]; - - if ($matches[2]) { - $port = (int) substr($matches[2], 1); - } - } else { - $pos = strpos($host, ':'); - if ($pos !== false) { - $port = (int) substr($host, $pos + 1); - $host = strstr($host, ':', true); - } - } - - // Path - $requestScriptName = parse_url($env->get('SCRIPT_NAME'), PHP_URL_PATH); - $requestScriptDir = dirname($requestScriptName); - - // parse_url() requires a full URL. As we don't extract the domain name or scheme, - // we use a stand-in. - $requestUri = parse_url('http://example.com' . $env->get('REQUEST_URI'), PHP_URL_PATH); - - $basePath = ''; - $virtualPath = $requestUri; - if (stripos($requestUri, $requestScriptName) === 0) { - $basePath = $requestScriptName; - } elseif ($requestScriptDir !== '/' && stripos($requestUri, $requestScriptDir) === 0) { - $basePath = $requestScriptDir; - } - - if ($basePath) { - $virtualPath = ltrim(substr($requestUri, strlen($basePath)), '/'); - } - - // Query string - $queryString = $env->get('QUERY_STRING', ''); - if ($queryString === '') { - $queryString = parse_url('http://example.com' . $env->get('REQUEST_URI'), PHP_URL_QUERY); - } - - // Fragment - $fragment = ''; - - // Build Uri - $uri = new static($scheme, $host, $port, $virtualPath, $queryString, $fragment, $username, $password); - if ($basePath) { - $uri = $uri->withBasePath($basePath); - } - - return $uri; - } - - /******************************************************************************** - * Scheme - *******************************************************************************/ - - /** - * Retrieve the scheme component of the URI. - * - * If no scheme is present, this method MUST return an empty string. - * - * The value returned MUST be normalized to lowercase, per RFC 3986 - * Section 3.1. - * - * The trailing ":" character is not part of the scheme and MUST NOT be - * added. - * - * @see https://tools.ietf.org/html/rfc3986#section-3.1 - * @return string The URI scheme. - */ - public function getScheme() - { - return $this->scheme; - } - - /** - * Return an instance with the specified scheme. - * - * This method MUST retain the state of the current instance, and return - * an instance that contains the specified scheme. - * - * Implementations MUST support the schemes "http" and "https" case - * insensitively, and MAY accommodate other schemes if required. - * - * An empty scheme is equivalent to removing the scheme. - * - * @param string $scheme The scheme to use with the new instance. - * @return self A new instance with the specified scheme. - * @throws \InvalidArgumentException for invalid or unsupported schemes. - */ - public function withScheme($scheme) - { - $scheme = $this->filterScheme($scheme); - $clone = clone $this; - $clone->scheme = $scheme; - - return $clone; - } - - /** - * Filter Uri scheme. - * - * @param string $scheme Raw Uri scheme. - * @return string - * - * @throws InvalidArgumentException If the Uri scheme is not a string. - * @throws InvalidArgumentException If Uri scheme is not "", "https", or "http". - */ - protected function filterScheme($scheme) - { - static $valid = [ - '' => true, - 'https' => true, - 'http' => true, - ]; - - if (!is_string($scheme) && !method_exists($scheme, '__toString')) { - throw new InvalidArgumentException('Uri scheme must be a string'); - } - - $scheme = str_replace('://', '', strtolower((string)$scheme)); - if (!isset($valid[$scheme])) { - throw new InvalidArgumentException('Uri scheme must be one of: "", "https", "http"'); - } - - return $scheme; - } - - /******************************************************************************** - * Authority - *******************************************************************************/ - - /** - * Retrieve the authority component of the URI. - * - * If no authority information is present, this method MUST return an empty - * string. - * - * The authority syntax of the URI is: - * - * <pre> - * [user-info@]host[:port] - * </pre> - * - * If the port component is not set or is the standard port for the current - * scheme, it SHOULD NOT be included. - * - * @see https://tools.ietf.org/html/rfc3986#section-3.2 - * @return string The URI authority, in "[user-info@]host[:port]" format. - */ - public function getAuthority() - { - $userInfo = $this->getUserInfo(); - $host = $this->getHost(); - $port = $this->getPort(); - - return ($userInfo ? $userInfo . '@' : '') . $host . ($port !== null ? ':' . $port : ''); - } - - /** - * Retrieve the user information component of the URI. - * - * If no user information is present, this method MUST return an empty - * string. - * - * If a user is present in the URI, this will return that value; - * additionally, if the password is also present, it will be appended to the - * user value, with a colon (":") separating the values. - * - * The trailing "@" character is not part of the user information and MUST - * NOT be added. - * - * @return string The URI user information, in "username[:password]" format. - */ - public function getUserInfo() - { - return $this->user . ($this->password ? ':' . $this->password : ''); - } - - /** - * Return an instance with the specified user information. - * - * This method MUST retain the state of the current instance, and return - * an instance that contains the specified user information. - * - * Password is optional, but the user information MUST include the - * user; an empty string for the user is equivalent to removing user - * information. - * - * @param string $user The user name to use for authority. - * @param null|string $password The password associated with $user. - * @return self A new instance with the specified user information. - */ - public function withUserInfo($user, $password = null) - { - $clone = clone $this; - $clone->user = $user; - $clone->password = $password ? $password : ''; - - return $clone; - } - - /** - * Retrieve the host component of the URI. - * - * If no host is present, this method MUST return an empty string. - * - * The value returned MUST be normalized to lowercase, per RFC 3986 - * Section 3.2.2. - * - * @see http://tools.ietf.org/html/rfc3986#section-3.2.2 - * @return string The URI host. - */ - public function getHost() - { - return $this->host; - } - - /** - * Return an instance with the specified host. - * - * This method MUST retain the state of the current instance, and return - * an instance that contains the specified host. - * - * An empty host value is equivalent to removing the host. - * - * @param string $host The hostname to use with the new instance. - * @return self A new instance with the specified host. - * @throws \InvalidArgumentException for invalid hostnames. - */ - public function withHost($host) - { - $clone = clone $this; - $clone->host = $host; - - return $clone; - } - - /** - * Retrieve the port component of the URI. - * - * If a port is present, and it is non-standard for the current scheme, - * this method MUST return it as an integer. If the port is the standard port - * used with the current scheme, this method SHOULD return null. - * - * If no port is present, and no scheme is present, this method MUST return - * a null value. - * - * If no port is present, but a scheme is present, this method MAY return - * the standard port for that scheme, but SHOULD return null. - * - * @return null|int The URI port. - */ - public function getPort() - { - return $this->port && !$this->hasStandardPort() ? $this->port : null; - } - - /** - * Return an instance with the specified port. - * - * This method MUST retain the state of the current instance, and return - * an instance that contains the specified port. - * - * Implementations MUST raise an exception for ports outside the - * established TCP and UDP port ranges. - * - * A null value provided for the port is equivalent to removing the port - * information. - * - * @param null|int $port The port to use with the new instance; a null value - * removes the port information. - * @return self A new instance with the specified port. - * @throws \InvalidArgumentException for invalid ports. - */ - public function withPort($port) - { - $port = $this->filterPort($port); - $clone = clone $this; - $clone->port = $port; - - return $clone; - } - - /** - * Does this Uri use a standard port? - * - * @return bool - */ - protected function hasStandardPort() - { - return ($this->scheme === 'http' && $this->port === 80) || ($this->scheme === 'https' && $this->port === 443); - } - - /** - * Filter Uri port. - * - * @param null|int $port The Uri port number. - * @return null|int - * - * @throws InvalidArgumentException If the port is invalid. - */ - protected function filterPort($port) - { - if (is_null($port) || (is_integer($port) && ($port >= 1 && $port <= 65535))) { - return $port; - } - - throw new InvalidArgumentException('Uri port must be null or an integer between 1 and 65535 (inclusive)'); - } - - /******************************************************************************** - * Path - *******************************************************************************/ - - /** - * Retrieve the path component of the URI. - * - * The path can either be empty or absolute (starting with a slash) or - * rootless (not starting with a slash). Implementations MUST support all - * three syntaxes. - * - * Normally, the empty path "" and absolute path "/" are considered equal as - * defined in RFC 7230 Section 2.7.3. But this method MUST NOT automatically - * do this normalization because in contexts with a trimmed base path, e.g. - * the front controller, this difference becomes significant. It's the task - * of the user to handle both "" and "/". - * - * The value returned MUST be percent-encoded, but MUST NOT double-encode - * any characters. To determine what characters to encode, please refer to - * RFC 3986, Sections 2 and 3.3. - * - * As an example, if the value should include a slash ("/") not intended as - * delimiter between path segments, that value MUST be passed in encoded - * form (e.g., "%2F") to the instance. - * - * @see https://tools.ietf.org/html/rfc3986#section-2 - * @see https://tools.ietf.org/html/rfc3986#section-3.3 - * @return string The URI path. - */ - public function getPath() - { - return $this->path; - } - - /** - * Return an instance with the specified path. - * - * This method MUST retain the state of the current instance, and return - * an instance that contains the specified path. - * - * The path can either be empty or absolute (starting with a slash) or - * rootless (not starting with a slash). Implementations MUST support all - * three syntaxes. - * - * If the path is intended to be domain-relative rather than path relative then - * it must begin with a slash ("/"). Paths not starting with a slash ("/") - * are assumed to be relative to some base path known to the application or - * consumer. - * - * Users can provide both encoded and decoded path characters. - * Implementations ensure the correct encoding as outlined in getPath(). - * - * @param string $path The path to use with the new instance. - * @return self A new instance with the specified path. - * @throws \InvalidArgumentException for invalid paths. - */ - public function withPath($path) - { - if (!is_string($path)) { - throw new InvalidArgumentException('Uri path must be a string'); - } - - $clone = clone $this; - $clone->path = $this->filterPath($path); - - // if the path is absolute, then clear basePath - if (substr($path, 0, 1) == '/') { - $clone->basePath = ''; - } - - return $clone; - } - - /** - * Retrieve the base path segment of the URI. - * - * Note: This method is not part of the PSR-7 standard. - * - * This method MUST return a string; if no path is present it MUST return - * an empty string. - * - * @return string The base path segment of the URI. - */ - public function getBasePath() - { - return $this->basePath; - } - - /** - * Set base path. - * - * Note: This method is not part of the PSR-7 standard. - * - * @param string $basePath - * @return self - */ - public function withBasePath($basePath) - { - if (!is_string($basePath)) { - throw new InvalidArgumentException('Uri path must be a string'); - } - if (!empty($basePath)) { - $basePath = '/' . trim($basePath, '/'); // <-- Trim on both sides - } - $clone = clone $this; - - if ($basePath !== '/') { - $clone->basePath = $this->filterPath($basePath); - } - - return $clone; - } - - /** - * Filter Uri path. - * - * This method percent-encodes all reserved - * characters in the provided path string. This method - * will NOT double-encode characters that are already - * percent-encoded. - * - * @param string $path The raw uri path. - * @return string The RFC 3986 percent-encoded uri path. - * @link http://www.faqs.org/rfcs/rfc3986.html - */ - protected function filterPath($path) - { - return preg_replace_callback( - '/(?:[^a-zA-Z0-9_\-\.~:@&=\+\$,\/;%]+|%(?![A-Fa-f0-9]{2}))/', - function ($match) { - return rawurlencode($match[0]); - }, - $path - ); - } - - /******************************************************************************** - * Query - *******************************************************************************/ - - /** - * Retrieve the query string of the URI. - * - * If no query string is present, this method MUST return an empty string. - * - * The leading "?" character is not part of the query and MUST NOT be - * added. - * - * The value returned MUST be percent-encoded, but MUST NOT double-encode - * any characters. To determine what characters to encode, please refer to - * RFC 3986, Sections 2 and 3.4. - * - * As an example, if a value in a key/value pair of the query string should - * include an ampersand ("&") not intended as a delimiter between values, - * that value MUST be passed in encoded form (e.g., "%26") to the instance. - * - * @see https://tools.ietf.org/html/rfc3986#section-2 - * @see https://tools.ietf.org/html/rfc3986#section-3.4 - * @return string The URI query string. - */ - public function getQuery() - { - return $this->query; - } - - /** - * Return an instance with the specified query string. - * - * This method MUST retain the state of the current instance, and return - * an instance that contains the specified query string. - * - * Users can provide both encoded and decoded query characters. - * Implementations ensure the correct encoding as outlined in getQuery(). - * - * An empty query string value is equivalent to removing the query string. - * - * @param string $query The query string to use with the new instance. - * @return self A new instance with the specified query string. - * @throws \InvalidArgumentException for invalid query strings. - */ - public function withQuery($query) - { - if (!is_string($query) && !method_exists($query, '__toString')) { - throw new InvalidArgumentException('Uri query must be a string'); - } - $query = ltrim((string)$query, '?'); - $clone = clone $this; - $clone->query = $this->filterQuery($query); - - return $clone; - } - - /** - * Filters the query string or fragment of a URI. - * - * @param string $query The raw uri query string. - * @return string The percent-encoded query string. - */ - protected function filterQuery($query) - { - return preg_replace_callback( - '/(?:[^a-zA-Z0-9_\-\.~!\$&\'\(\)\*\+,;=%:@\/\?]+|%(?![A-Fa-f0-9]{2}))/', - function ($match) { - return rawurlencode($match[0]); - }, - $query - ); - } - - /******************************************************************************** - * Fragment - *******************************************************************************/ - - /** - * Retrieve the fragment component of the URI. - * - * If no fragment is present, this method MUST return an empty string. - * - * The leading "#" character is not part of the fragment and MUST NOT be - * added. - * - * The value returned MUST be percent-encoded, but MUST NOT double-encode - * any characters. To determine what characters to encode, please refer to - * RFC 3986, Sections 2 and 3.5. - * - * @see https://tools.ietf.org/html/rfc3986#section-2 - * @see https://tools.ietf.org/html/rfc3986#section-3.5 - * @return string The URI fragment. - */ - public function getFragment() - { - return $this->fragment; - } - - /** - * Return an instance with the specified URI fragment. - * - * This method MUST retain the state of the current instance, and return - * an instance that contains the specified URI fragment. - * - * Users can provide both encoded and decoded fragment characters. - * Implementations ensure the correct encoding as outlined in getFragment(). - * - * An empty fragment value is equivalent to removing the fragment. - * - * @param string $fragment The fragment to use with the new instance. - * @return self A new instance with the specified fragment. - */ - public function withFragment($fragment) - { - if (!is_string($fragment) && !method_exists($fragment, '__toString')) { - throw new InvalidArgumentException('Uri fragment must be a string'); - } - $fragment = ltrim((string)$fragment, '#'); - $clone = clone $this; - $clone->fragment = $this->filterQuery($fragment); - - return $clone; - } - - /******************************************************************************** - * Helpers - *******************************************************************************/ - - /** - * Return the string representation as a URI reference. - * - * Depending on which components of the URI are present, the resulting - * string is either a full URI or relative reference according to RFC 3986, - * Section 4.1. The method concatenates the various components of the URI, - * using the appropriate delimiters: - * - * - If a scheme is present, it MUST be suffixed by ":". - * - If an authority is present, it MUST be prefixed by "//". - * - The path can be concatenated without delimiters. But there are two - * cases where the path has to be adjusted to make the URI reference - * valid as PHP does not allow to throw an exception in __toString(): - * - If the path is rootless and an authority is present, the path MUST - * be prefixed by "/". - * - If the path is starting with more than one "/" and no authority is - * present, the starting slashes MUST be reduced to one. - * - If a query is present, it MUST be prefixed by "?". - * - If a fragment is present, it MUST be prefixed by "#". - * - * @see http://tools.ietf.org/html/rfc3986#section-4.1 - * @return string - */ - public function __toString() - { - $scheme = $this->getScheme(); - $authority = $this->getAuthority(); - $basePath = $this->getBasePath(); - $path = $this->getPath(); - $query = $this->getQuery(); - $fragment = $this->getFragment(); - - $path = $basePath . '/' . ltrim($path, '/'); - - return ($scheme ? $scheme . ':' : '') - . ($authority ? '//' . $authority : '') - . $path - . ($query ? '?' . $query : '') - . ($fragment ? '#' . $fragment : ''); - } - - /** - * Return the fully qualified base URL. - * - * Note that this method never includes a trailing / - * - * This method is not part of PSR-7. - * - * @return string - */ - public function getBaseUrl() - { - $scheme = $this->getScheme(); - $authority = $this->getAuthority(); - $basePath = $this->getBasePath(); - - if ($authority && substr($basePath, 0, 1) !== '/') { - $basePath = $basePath . '/' . $basePath; - } - - return ($scheme ? $scheme . ':' : '') - . ($authority ? '//' . $authority : '') - . rtrim($basePath, '/'); - } -} diff --git a/vendor/slim/slim/Slim/Interfaces/CallableResolverInterface.php b/vendor/slim/slim/Slim/Interfaces/CallableResolverInterface.php deleted file mode 100644 index 9bde59a..0000000 --- a/vendor/slim/slim/Slim/Interfaces/CallableResolverInterface.php +++ /dev/null @@ -1,27 +0,0 @@ -<?php -/** - * Slim Framework (http://slimframework.com) - * - * @link https://github.com/slimphp/Slim - * @copyright Copyright (c) 2011-2016 Josh Lockhart - * @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License) - */ -namespace Slim\Interfaces; - -/** - * Resolves a callable. - * - * @package Slim - * @since 3.0.0 - */ -interface CallableResolverInterface -{ - /** - * Invoke the resolved callable. - * - * @param mixed $toResolve - * - * @return callable - */ - public function resolve($toResolve); -} diff --git a/vendor/slim/slim/Slim/Interfaces/CollectionInterface.php b/vendor/slim/slim/Slim/Interfaces/CollectionInterface.php deleted file mode 100644 index 876b061..0000000 --- a/vendor/slim/slim/Slim/Interfaces/CollectionInterface.php +++ /dev/null @@ -1,32 +0,0 @@ -<?php -/** - * Slim Framework (http://slimframework.com) - * - * @link https://github.com/slimphp/Slim - * @copyright Copyright (c) 2011-2016 Josh Lockhart - * @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License) - */ -namespace Slim\Interfaces; - -/** - * Collection Interface - * - * @package Slim - * @since 3.0.0 - */ -interface CollectionInterface extends \ArrayAccess, \Countable, \IteratorAggregate -{ - public function set($key, $value); - - public function get($key, $default = null); - - public function replace(array $items); - - public function all(); - - public function has($key); - - public function remove($key); - - public function clear(); -} diff --git a/vendor/slim/slim/Slim/Interfaces/Http/CookiesInterface.php b/vendor/slim/slim/Slim/Interfaces/Http/CookiesInterface.php deleted file mode 100644 index 44981ce..0000000 --- a/vendor/slim/slim/Slim/Interfaces/Http/CookiesInterface.php +++ /dev/null @@ -1,23 +0,0 @@ -<?php -/** - * Slim Framework (http://slimframework.com) - * - * @link https://github.com/slimphp/Slim - * @copyright Copyright (c) 2011-2016 Josh Lockhart - * @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License) - */ -namespace Slim\Interfaces\Http; - -/** - * Cookies Interface - * - * @package Slim - * @since 3.0.0 - */ -interface CookiesInterface -{ - public function get($name, $default = null); - public function set($name, $value); - public function toHeaders(); - public static function parseHeader($header); -} diff --git a/vendor/slim/slim/Slim/Interfaces/Http/EnvironmentInterface.php b/vendor/slim/slim/Slim/Interfaces/Http/EnvironmentInterface.php deleted file mode 100644 index a14ecbd..0000000 --- a/vendor/slim/slim/Slim/Interfaces/Http/EnvironmentInterface.php +++ /dev/null @@ -1,20 +0,0 @@ -<?php -/** - * Slim Framework (http://slimframework.com) - * - * @link https://github.com/slimphp/Slim - * @copyright Copyright (c) 2011-2016 Josh Lockhart - * @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License) - */ -namespace Slim\Interfaces\Http; - -/** - * Environment Interface - * - * @package Slim - * @since 3.0.0 - */ -interface EnvironmentInterface -{ - public static function mock(array $settings = []); -} diff --git a/vendor/slim/slim/Slim/Interfaces/Http/HeadersInterface.php b/vendor/slim/slim/Slim/Interfaces/Http/HeadersInterface.php deleted file mode 100644 index 08288fc..0000000 --- a/vendor/slim/slim/Slim/Interfaces/Http/HeadersInterface.php +++ /dev/null @@ -1,24 +0,0 @@ -<?php -/** - * Slim Framework (http://slimframework.com) - * - * @link https://github.com/slimphp/Slim - * @copyright Copyright (c) 2011-2016 Josh Lockhart - * @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License) - */ -namespace Slim\Interfaces\Http; - -use Slim\Interfaces\CollectionInterface; - -/** - * Headers Interface - * - * @package Slim - * @since 3.0.0 - */ -interface HeadersInterface extends CollectionInterface -{ - public function add($key, $value); - - public function normalizeKey($key); -} diff --git a/vendor/slim/slim/Slim/Interfaces/InvocationStrategyInterface.php b/vendor/slim/slim/Slim/Interfaces/InvocationStrategyInterface.php deleted file mode 100644 index 07b3314..0000000 --- a/vendor/slim/slim/Slim/Interfaces/InvocationStrategyInterface.php +++ /dev/null @@ -1,35 +0,0 @@ -<?php -/** - * Slim Framework (http://slimframework.com) - * - * @link https://github.com/slimphp/Slim - * @copyright Copyright (c) 2011-2016 Josh Lockhart - * @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License) - */ -namespace Slim\Interfaces; - -use Psr\Http\Message\ResponseInterface; -use Psr\Http\Message\ServerRequestInterface; - -/** - * Defines a contract for invoking a route callable. - */ -interface InvocationStrategyInterface -{ - /** - * Invoke a route callable. - * - * @param callable $callable The callable to invoke using the strategy. - * @param ServerRequestInterface $request The request object. - * @param ResponseInterface $response The response object. - * @param array $routeArguments The route's placholder arguments - * - * @return ResponseInterface|string The response from the callable. - */ - public function __invoke( - callable $callable, - ServerRequestInterface $request, - ResponseInterface $response, - array $routeArguments - ); -} diff --git a/vendor/slim/slim/Slim/Interfaces/RouteGroupInterface.php b/vendor/slim/slim/Slim/Interfaces/RouteGroupInterface.php deleted file mode 100644 index 319a67e..0000000 --- a/vendor/slim/slim/Slim/Interfaces/RouteGroupInterface.php +++ /dev/null @@ -1,46 +0,0 @@ -<?php -/** - * Slim Framework (http://slimframework.com) - * - * @link https://github.com/slimphp/Slim - * @copyright Copyright (c) 2011-2016 Josh Lockhart - * @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License) - */ -namespace Slim\Interfaces; - -use Slim\App; - -/** - * RouteGroup Interface - * - * @package Slim - * @since 3.0.0 - */ -interface RouteGroupInterface -{ - /** - * Get route pattern - * - * @return string - */ - public function getPattern(); - - /** - * Prepend middleware to the group middleware collection - * - * @param callable|string $callable The callback routine - * - * @return RouteGroupInterface - */ - public function add($callable); - - /** - * Execute route group callable in the context of the Slim App - * - * This method invokes the route group object's callable, collecting - * nested route objects - * - * @param App $app - */ - public function __invoke(App $app); -} diff --git a/vendor/slim/slim/Slim/Interfaces/RouteInterface.php b/vendor/slim/slim/Slim/Interfaces/RouteInterface.php deleted file mode 100644 index 32d4bae..0000000 --- a/vendor/slim/slim/Slim/Interfaces/RouteInterface.php +++ /dev/null @@ -1,129 +0,0 @@ -<?php -/** - * Slim Framework (http://slimframework.com) - * - * @link https://github.com/slimphp/Slim - * @copyright Copyright (c) 2011-2016 Josh Lockhart - * @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License) - */ -namespace Slim\Interfaces; - -use InvalidArgumentException; -use Psr\Http\Message\ServerRequestInterface; -use Psr\Http\Message\ResponseInterface; - -/** - * Route Interface - * - * @package Slim - * @since 3.0.0 - */ -interface RouteInterface -{ - - /** - * Retrieve a specific route argument - * - * @param string $name - * @param mixed $default - * - * @return mixed - */ - public function getArgument($name, $default = null); - - /** - * Get route arguments - * - * @return array - */ - public function getArguments(); - - /** - * Get route name - * - * @return null|string - */ - public function getName(); - - /** - * Get route pattern - * - * @return string - */ - public function getPattern(); - - /** - * Set a route argument - * - * @param string $name - * @param string $value - * - * @return static - */ - public function setArgument($name, $value); - - /** - * Replace route arguments - * - * @param array $arguments - * - * @return static - */ - public function setArguments(array $arguments); - - /** - * Set route name - * - * @param string $name - * - * @return static - * @throws InvalidArgumentException if the route name is not a string - */ - public function setName($name); - - /** - * Add middleware - * - * This method prepends new middleware to the route's middleware stack. - * - * @param callable|string $callable The callback routine - * - * @return RouteInterface - */ - public function add($callable); - - /** - * Prepare the route for use - * - * @param ServerRequestInterface $request - * @param array $arguments - */ - public function prepare(ServerRequestInterface $request, array $arguments); - - /** - * Run route - * - * This method traverses the middleware stack, including the route's callable - * and captures the resultant HTTP response object. It then sends the response - * back to the Application. - * - * @param ServerRequestInterface $request - * @param ResponseInterface $response - * @return ResponseInterface - */ - public function run(ServerRequestInterface $request, ResponseInterface $response); - - /** - * Dispatch route callable against current Request and Response objects - * - * This method invokes the route object's callable. If middleware is - * registered for the route, each callable middleware is invoked in - * the order specified. - * - * @param ServerRequestInterface $request The current Request object - * @param ResponseInterface $response The current Response object - * - * @return ResponseInterface - */ - public function __invoke(ServerRequestInterface $request, ResponseInterface $response); -} diff --git a/vendor/slim/slim/Slim/Interfaces/RouterInterface.php b/vendor/slim/slim/Slim/Interfaces/RouterInterface.php deleted file mode 100644 index 3d32dcd..0000000 --- a/vendor/slim/slim/Slim/Interfaces/RouterInterface.php +++ /dev/null @@ -1,107 +0,0 @@ -<?php -/** - * Slim Framework (http://slimframework.com) - * - * @link https://github.com/slimphp/Slim - * @copyright Copyright (c) 2011-2016 Josh Lockhart - * @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License) - */ -namespace Slim\Interfaces; - -use RuntimeException; -use InvalidArgumentException; -use Psr\Http\Message\ServerRequestInterface; - -/** - * Router Interface - * - * @package Slim - * @since 3.0.0 - */ -interface RouterInterface -{ - /** - * Add route - * - * @param string[] $methods Array of HTTP methods - * @param string $pattern The route pattern - * @param callable $handler The route callable - * - * @return RouteInterface - */ - public function map($methods, $pattern, $handler); - - /** - * Dispatch router for HTTP request - * - * @param ServerRequestInterface $request The current HTTP request object - * - * @return array - * - * @link https://github.com/nikic/FastRoute/blob/master/src/Dispatcher.php - */ - public function dispatch(ServerRequestInterface $request); - - /** - * Add a route group to the array - * - * @param string $pattern The group pattern - * @param callable $callable A group callable - * - * @return RouteGroupInterface - */ - public function pushGroup($pattern, $callable); - - /** - * Removes the last route group from the array - * - * @return bool True if successful, else False - */ - public function popGroup(); - - /** - * Get named route object - * - * @param string $name Route name - * - * @return \Slim\Interfaces\RouteInterface - * - * @throws RuntimeException If named route does not exist - */ - public function getNamedRoute($name); - - /** - * @param $identifier - * - * @return \Slim\Interfaces\RouteInterface - */ - public function lookupRoute($identifier); - - /** - * Build the path for a named route excluding the base path - * - * @param string $name Route name - * @param array $data Named argument replacement data - * @param array $queryParams Optional query string parameters - * - * @return string - * - * @throws RuntimeException If named route does not exist - * @throws InvalidArgumentException If required data not provided - */ - public function relativePathFor($name, array $data = [], array $queryParams = []); - - /** - * Build the path for a named route including the base path - * - * @param string $name Route name - * @param array $data Named argument replacement data - * @param array $queryParams Optional query string parameters - * - * @return string - * - * @throws RuntimeException If named route does not exist - * @throws InvalidArgumentException If required data not provided - */ - public function pathFor($name, array $data = [], array $queryParams = []); -} diff --git a/vendor/slim/slim/Slim/MiddlewareAwareTrait.php b/vendor/slim/slim/Slim/MiddlewareAwareTrait.php deleted file mode 100644 index 84bc6bb..0000000 --- a/vendor/slim/slim/Slim/MiddlewareAwareTrait.php +++ /dev/null @@ -1,120 +0,0 @@ -<?php -/** - * Slim Framework (http://slimframework.com) - * - * @link https://github.com/slimphp/Slim - * @copyright Copyright (c) 2011-2016 Josh Lockhart - * @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License) - */ -namespace Slim; - -use RuntimeException; -use SplStack; -use SplDoublyLinkedList; -use Psr\Http\Message\ServerRequestInterface; -use Psr\Http\Message\ResponseInterface; -use UnexpectedValueException; - -/** - * Middleware - * - * This is an internal class that enables concentric middleware layers. This - * class is an implementation detail and is used only inside of the Slim - * application; it is not visible to—and should not be used by—end users. - */ -trait MiddlewareAwareTrait -{ - /** - * Middleware call stack - * - * @var \SplStack - * @link http://php.net/manual/class.splstack.php - */ - protected $stack; - - /** - * Middleware stack lock - * - * @var bool - */ - protected $middlewareLock = false; - - /** - * Add middleware - * - * This method prepends new middleware to the application middleware stack. - * - * @param callable $callable Any callable that accepts three arguments: - * 1. A Request object - * 2. A Response object - * 3. A "next" middleware callable - * @return static - * - * @throws RuntimeException If middleware is added while the stack is dequeuing - * @throws UnexpectedValueException If the middleware doesn't return a Psr\Http\Message\ResponseInterface - */ - protected function addMiddleware(callable $callable) - { - if ($this->middlewareLock) { - throw new RuntimeException('Middleware can’t be added once the stack is dequeuing'); - } - - if (is_null($this->stack)) { - $this->seedMiddlewareStack(); - } - $next = $this->stack->top(); - $this->stack[] = function (ServerRequestInterface $req, ResponseInterface $res) use ($callable, $next) { - $result = call_user_func($callable, $req, $res, $next); - if ($result instanceof ResponseInterface === false) { - throw new UnexpectedValueException( - 'Middleware must return instance of \Psr\Http\Message\ResponseInterface' - ); - } - - return $result; - }; - - return $this; - } - - /** - * Seed middleware stack with first callable - * - * @param callable $kernel The last item to run as middleware - * - * @throws RuntimeException if the stack is seeded more than once - */ - protected function seedMiddlewareStack(callable $kernel = null) - { - if (!is_null($this->stack)) { - throw new RuntimeException('MiddlewareStack can only be seeded once.'); - } - if ($kernel === null) { - $kernel = $this; - } - $this->stack = new SplStack; - $this->stack->setIteratorMode(SplDoublyLinkedList::IT_MODE_LIFO | SplDoublyLinkedList::IT_MODE_KEEP); - $this->stack[] = $kernel; - } - - /** - * Call middleware stack - * - * @param ServerRequestInterface $req A request object - * @param ResponseInterface $res A response object - * - * @return ResponseInterface - */ - public function callMiddlewareStack(ServerRequestInterface $req, ResponseInterface $res) - { - if (is_null($this->stack)) { - $this->seedMiddlewareStack(); - } - /** @var callable $start */ - $start = $this->stack->top(); - $this->middlewareLock = true; - $resp = $start($req, $res); - $this->middlewareLock = false; - return $resp; - } -} diff --git a/vendor/slim/slim/Slim/Routable.php b/vendor/slim/slim/Slim/Routable.php deleted file mode 100644 index 4a6759f..0000000 --- a/vendor/slim/slim/Slim/Routable.php +++ /dev/null @@ -1,106 +0,0 @@ -<?php -/** - * Slim Framework (http://slimframework.com) - * - * @link https://github.com/slimphp/Slim - * @copyright Copyright (c) 2011-2016 Josh Lockhart - * @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License) - */ -namespace Slim; - -use Interop\Container\ContainerInterface; - -/** - * A routable, middleware-aware object - * - * @package Slim - * @since 3.0.0 - */ -abstract class Routable -{ - use CallableResolverAwareTrait; - - /** - * Route callable - * - * @var callable - */ - protected $callable; - - /** - * Container - * - * @var ContainerInterface - */ - protected $container; - - /** - * Route middleware - * - * @var callable[] - */ - protected $middleware = []; - - /** - * Route pattern - * - * @var string - */ - protected $pattern; - - /** - * Get the middleware registered for the group - * - * @return callable[] - */ - public function getMiddleware() - { - return $this->middleware; - } - - /** - * Get the route pattern - * - * @return string - */ - public function getPattern() - { - return $this->pattern; - } - - /** - * Set container for use with resolveCallable - * - * @param ContainerInterface $container - * - * @return self - */ - public function setContainer(ContainerInterface $container) - { - $this->container = $container; - return $this; - } - - /** - * Prepend middleware to the middleware collection - * - * @param callable|string $callable The callback routine - * - * @return static - */ - public function add($callable) - { - $this->middleware[] = new DeferredCallable($callable, $this->container); - return $this; - } - - /** - * Set the route pattern - * - * @set string - */ - public function setPattern($newPattern) - { - $this->pattern = $newPattern; - } -} diff --git a/vendor/slim/slim/Slim/Route.php b/vendor/slim/slim/Slim/Route.php deleted file mode 100644 index 4572441..0000000 --- a/vendor/slim/slim/Slim/Route.php +++ /dev/null @@ -1,357 +0,0 @@ -<?php -/** - * Slim Framework (http://slimframework.com) - * - * @link https://github.com/slimphp/Slim - * @copyright Copyright (c) 2011-2016 Josh Lockhart - * @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License) - */ -namespace Slim; - -use Exception; -use InvalidArgumentException; -use Psr\Http\Message\ServerRequestInterface; -use Psr\Http\Message\ResponseInterface; -use Slim\Handlers\Strategies\RequestResponse; -use Slim\Interfaces\InvocationStrategyInterface; -use Slim\Interfaces\RouteInterface; - -/** - * Route - */ -class Route extends Routable implements RouteInterface -{ - use MiddlewareAwareTrait; - - /** - * HTTP methods supported by this route - * - * @var string[] - */ - protected $methods = []; - - /** - * Route identifier - * - * @var string - */ - protected $identifier; - - /** - * Route name - * - * @var null|string - */ - protected $name; - - /** - * Parent route groups - * - * @var RouteGroup[] - */ - protected $groups; - - private $finalized = false; - - /** - * Output buffering mode - * - * One of: false, 'prepend' or 'append' - * - * @var boolean|string - */ - protected $outputBuffering = 'append'; - - /** - * Route parameters - * - * @var array - */ - protected $arguments = []; - - /** - * Create new route - * - * @param string|string[] $methods The route HTTP methods - * @param string $pattern The route pattern - * @param callable $callable The route callable - * @param RouteGroup[] $groups The parent route groups - * @param int $identifier The route identifier - */ - public function __construct($methods, $pattern, $callable, $groups = [], $identifier = 0) - { - $this->methods = is_string($methods) ? [$methods] : $methods; - $this->pattern = $pattern; - $this->callable = $callable; - $this->groups = $groups; - $this->identifier = 'route' . $identifier; - } - - /** - * Finalize the route in preparation for dispatching - */ - public function finalize() - { - if ($this->finalized) { - return; - } - - $groupMiddleware = []; - foreach ($this->getGroups() as $group) { - $groupMiddleware = array_merge($group->getMiddleware(), $groupMiddleware); - } - - $this->middleware = array_merge($this->middleware, $groupMiddleware); - - foreach ($this->getMiddleware() as $middleware) { - $this->addMiddleware($middleware); - } - - $this->finalized = true; - } - - /** - * Get route callable - * - * @return callable - */ - public function getCallable() - { - return $this->callable; - } - - /** - * Get route methods - * - * @return string[] - */ - public function getMethods() - { - return $this->methods; - } - - /** - * Get parent route groups - * - * @return RouteGroup[] - */ - public function getGroups() - { - return $this->groups; - } - - /** - * Get route name - * - * @return null|string - */ - public function getName() - { - return $this->name; - } - - /** - * Get route identifier - * - * @return string - */ - public function getIdentifier() - { - return $this->identifier; - } - - /** - * Get output buffering mode - * - * @return boolean|string - */ - public function getOutputBuffering() - { - return $this->outputBuffering; - } - - /** - * Set output buffering mode - * - * One of: false, 'prepend' or 'append' - * - * @param boolean|string $mode - * - * @throws InvalidArgumentException If an unknown buffering mode is specified - */ - public function setOutputBuffering($mode) - { - if (!in_array($mode, [false, 'prepend', 'append'], true)) { - throw new InvalidArgumentException('Unknown output buffering mode'); - } - $this->outputBuffering = $mode; - } - - /** - * Set route name - * - * @param string $name - * - * @return self - * - * @throws InvalidArgumentException if the route name is not a string - */ - public function setName($name) - { - if (!is_string($name)) { - throw new InvalidArgumentException('Route name must be a string'); - } - $this->name = $name; - return $this; - } - - /** - * Set a route argument - * - * @param string $name - * @param string $value - * - * @return self - */ - public function setArgument($name, $value) - { - $this->arguments[$name] = $value; - return $this; - } - - /** - * Replace route arguments - * - * @param array $arguments - * - * @return self - */ - public function setArguments(array $arguments) - { - $this->arguments = $arguments; - return $this; - } - - /** - * Retrieve route arguments - * - * @return array - */ - public function getArguments() - { - return $this->arguments; - } - - /** - * Retrieve a specific route argument - * - * @param string $name - * @param mixed $default - * - * @return mixed - */ - public function getArgument($name, $default = null) - { - if (array_key_exists($name, $this->arguments)) { - return $this->arguments[$name]; - } - return $default; - } - - /******************************************************************************** - * Route Runner - *******************************************************************************/ - - /** - * Prepare the route for use - * - * @param ServerRequestInterface $request - * @param array $arguments - */ - public function prepare(ServerRequestInterface $request, array $arguments) - { - // Add the arguments - foreach ($arguments as $k => $v) { - $this->setArgument($k, $v); - } - } - - /** - * Run route - * - * This method traverses the middleware stack, including the route's callable - * and captures the resultant HTTP response object. It then sends the response - * back to the Application. - * - * @param ServerRequestInterface $request - * @param ResponseInterface $response - * - * @return ResponseInterface - */ - public function run(ServerRequestInterface $request, ResponseInterface $response) - { - // Finalise route now that we are about to run it - $this->finalize(); - - // Traverse middleware stack and fetch updated response - return $this->callMiddlewareStack($request, $response); - } - - /** - * Dispatch route callable against current Request and Response objects - * - * This method invokes the route object's callable. If middleware is - * registered for the route, each callable middleware is invoked in - * the order specified. - * - * @param ServerRequestInterface $request The current Request object - * @param ResponseInterface $response The current Response object - * @return \Psr\Http\Message\ResponseInterface - * @throws \Exception if the route callable throws an exception - */ - public function __invoke(ServerRequestInterface $request, ResponseInterface $response) - { - $this->callable = $this->resolveCallable($this->callable); - - /** @var InvocationStrategyInterface $handler */ - $handler = isset($this->container) ? $this->container->get('foundHandler') : new RequestResponse(); - - // invoke route callable - if ($this->outputBuffering === false) { - $newResponse = $handler($this->callable, $request, $response, $this->arguments); - } else { - try { - ob_start(); - $newResponse = $handler($this->callable, $request, $response, $this->arguments); - $output = ob_get_clean(); - } catch (Exception $e) { - ob_end_clean(); - throw $e; - } - } - - if ($newResponse instanceof ResponseInterface) { - // if route callback returns a ResponseInterface, then use it - $response = $newResponse; - } elseif (is_string($newResponse)) { - // if route callback returns a string, then append it to the response - if ($response->getBody()->isWritable()) { - $response->getBody()->write($newResponse); - } - } - - if (!empty($output) && $response->getBody()->isWritable()) { - if ($this->outputBuffering === 'prepend') { - // prepend output buffer content - $body = new Http\Body(fopen('php://temp', 'r+')); - $body->write($output . $response->getBody()); - $response = $response->withBody($body); - } elseif ($this->outputBuffering === 'append') { - // append output buffer content - $response->getBody()->write($output); - } - } - - return $response; - } -} diff --git a/vendor/slim/slim/Slim/RouteGroup.php b/vendor/slim/slim/Slim/RouteGroup.php deleted file mode 100644 index a0cdf4d..0000000 --- a/vendor/slim/slim/Slim/RouteGroup.php +++ /dev/null @@ -1,47 +0,0 @@ -<?php -/** - * Slim Framework (http://slimframework.com) - * - * @link https://github.com/slimphp/Slim - * @copyright Copyright (c) 2011-2016 Josh Lockhart - * @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License) - */ -namespace Slim; - -use Closure; -use Slim\Interfaces\RouteGroupInterface; - -/** - * A collector for Routable objects with a common middleware stack - * - * @package Slim - */ -class RouteGroup extends Routable implements RouteGroupInterface -{ - /** - * Create a new RouteGroup - * - * @param string $pattern The pattern prefix for the group - * @param callable $callable The group callable - */ - public function __construct($pattern, $callable) - { - $this->pattern = $pattern; - $this->callable = $callable; - } - - /** - * Invoke the group to register any Routable objects within it. - * - * @param App $app The App to bind the callable to. - */ - public function __invoke(App $app = null) - { - $callable = $this->resolveCallable($this->callable); - if ($callable instanceof Closure && $app !== null) { - $callable = $callable->bindTo($app); - } - - $callable(); - } -} diff --git a/vendor/slim/slim/Slim/Router.php b/vendor/slim/slim/Slim/Router.php deleted file mode 100644 index 5d14fc9..0000000 --- a/vendor/slim/slim/Slim/Router.php +++ /dev/null @@ -1,434 +0,0 @@ -<?php -/** - * Slim Framework (http://slimframework.com) - * - * @link https://github.com/slimphp/Slim - * @copyright Copyright (c) 2011-2016 Josh Lockhart - * @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License) - */ -namespace Slim; - -use FastRoute\Dispatcher; -use InvalidArgumentException; -use RuntimeException; -use Psr\Http\Message\ServerRequestInterface; -use FastRoute\RouteCollector; -use FastRoute\RouteParser; -use FastRoute\RouteParser\Std as StdParser; -use Slim\Interfaces\RouteGroupInterface; -use Slim\Interfaces\RouterInterface; -use Slim\Interfaces\RouteInterface; - -/** - * Router - * - * This class organizes Slim application route objects. It is responsible - * for registering route objects, assigning names to route objects, - * finding routes that match the current HTTP request, and creating - * URLs for a named route. - */ -class Router implements RouterInterface -{ - /** - * Parser - * - * @var \FastRoute\RouteParser - */ - protected $routeParser; - - /** - * Base path used in pathFor() - * - * @var string - */ - protected $basePath = ''; - - /** - * Path to fast route cache file. Set to false to disable route caching - * - * @var string|False - */ - protected $cacheFile = false; - - /** - * Routes - * - * @var Route[] - */ - protected $routes = []; - - /** - * Route counter incrementer - * @var int - */ - protected $routeCounter = 0; - - /** - * Route groups - * - * @var RouteGroup[] - */ - protected $routeGroups = []; - - /** - * @var \FastRoute\Dispatcher - */ - protected $dispatcher; - - /** - * Create new router - * - * @param RouteParser $parser - */ - public function __construct(RouteParser $parser = null) - { - $this->routeParser = $parser ?: new StdParser; - } - - /** - * Set the base path used in pathFor() - * - * @param string $basePath - * - * @return self - */ - public function setBasePath($basePath) - { - if (!is_string($basePath)) { - throw new InvalidArgumentException('Router basePath must be a string'); - } - - $this->basePath = $basePath; - - return $this; - } - - /** - * Set path to fast route cache file. If this is false then route caching is disabled. - * - * @param string|false $cacheFile - * - * @return self - */ - public function setCacheFile($cacheFile) - { - if (!is_string($cacheFile) && $cacheFile !== false) { - throw new InvalidArgumentException('Router cacheFile must be a string or false'); - } - - $this->cacheFile = $cacheFile; - - if ($cacheFile !== false && !is_writable(dirname($cacheFile))) { - throw new RuntimeException('Router cacheFile directory must be writable'); - } - - - return $this; - } - - /** - * Add route - * - * @param string[] $methods Array of HTTP methods - * @param string $pattern The route pattern - * @param callable $handler The route callable - * - * @return RouteInterface - * - * @throws InvalidArgumentException if the route pattern isn't a string - */ - public function map($methods, $pattern, $handler) - { - if (!is_string($pattern)) { - throw new InvalidArgumentException('Route pattern must be a string'); - } - - // Prepend parent group pattern(s) - if ($this->routeGroups) { - $pattern = $this->processGroups() . $pattern; - } - - // According to RFC methods are defined in uppercase (See RFC 7231) - $methods = array_map("strtoupper", $methods); - - // Add route - $route = $this->createRoute($methods, $pattern, $handler); - $this->routes[$route->getIdentifier()] = $route; - $this->routeCounter++; - - return $route; - } - - /** - * Dispatch router for HTTP request - * - * @param ServerRequestInterface $request The current HTTP request object - * - * @return array - * - * @link https://github.com/nikic/FastRoute/blob/master/src/Dispatcher.php - */ - public function dispatch(ServerRequestInterface $request) - { - $uri = '/' . ltrim($request->getUri()->getPath(), '/'); - - return $this->createDispatcher()->dispatch( - $request->getMethod(), - $uri - ); - } - - /** - * Create a new Route object - * - * @param string[] $methods Array of HTTP methods - * @param string $pattern The route pattern - * @param callable $handler The route callable - * - * @return Slim\Interfaces\RouteInterface - */ - protected function createRoute($methods, $pattern, $callable) - { - return new Route($methods, $pattern, $callable, $this->routeGroups, $this->routeCounter); - } - - /** - * @return \FastRoute\Dispatcher - */ - protected function createDispatcher() - { - if ($this->dispatcher) { - return $this->dispatcher; - } - - $routeDefinitionCallback = function (RouteCollector $r) { - foreach ($this->getRoutes() as $route) { - $r->addRoute($route->getMethods(), $route->getPattern(), $route->getIdentifier()); - } - }; - - if ($this->cacheFile) { - $this->dispatcher = \FastRoute\cachedDispatcher($routeDefinitionCallback, [ - 'routeParser' => $this->routeParser, - 'cacheFile' => $this->cacheFile, - ]); - } else { - $this->dispatcher = \FastRoute\simpleDispatcher($routeDefinitionCallback, [ - 'routeParser' => $this->routeParser, - ]); - } - - return $this->dispatcher; - } - - /** - * @param \FastRoute\Dispatcher $dispatcher - */ - public function setDispatcher(Dispatcher $dispatcher) - { - $this->dispatcher = $dispatcher; - } - - /** - * Get route objects - * - * @return Route[] - */ - public function getRoutes() - { - return $this->routes; - } - - /** - * Get named route object - * - * @param string $name Route name - * - * @return Route - * - * @throws RuntimeException If named route does not exist - */ - public function getNamedRoute($name) - { - foreach ($this->routes as $route) { - if ($name == $route->getName()) { - return $route; - } - } - throw new RuntimeException('Named route does not exist for name: ' . $name); - } - - /** - * Remove named route - * - * @param string $name Route name - * - * @throws RuntimeException If named route does not exist - */ - public function removeNamedRoute($name) - { - $route = $this->getNamedRoute($name); - - // no exception, route exists, now remove by id - unset($this->routes[$route->getIdentifier()]); - } - - /** - * Process route groups - * - * @return string A group pattern to prefix routes with - */ - protected function processGroups() - { - $pattern = ""; - foreach ($this->routeGroups as $group) { - $pattern .= $group->getPattern(); - } - return $pattern; - } - - /** - * Add a route group to the array - * - * @param string $pattern - * @param callable $callable - * - * @return RouteGroupInterface - */ - public function pushGroup($pattern, $callable) - { - $group = new RouteGroup($pattern, $callable); - array_push($this->routeGroups, $group); - return $group; - } - - /** - * Removes the last route group from the array - * - * @return RouteGroup|bool The RouteGroup if successful, else False - */ - public function popGroup() - { - $group = array_pop($this->routeGroups); - return $group instanceof RouteGroup ? $group : false; - } - - /** - * @param $identifier - * @return \Slim\Interfaces\RouteInterface - */ - public function lookupRoute($identifier) - { - if (!isset($this->routes[$identifier])) { - throw new RuntimeException('Route not found, looks like your route cache is stale.'); - } - return $this->routes[$identifier]; - } - - /** - * Build the path for a named route excluding the base path - * - * @param string $name Route name - * @param array $data Named argument replacement data - * @param array $queryParams Optional query string parameters - * - * @return string - * - * @throws RuntimeException If named route does not exist - * @throws InvalidArgumentException If required data not provided - */ - public function relativePathFor($name, array $data = [], array $queryParams = []) - { - $route = $this->getNamedRoute($name); - $pattern = $route->getPattern(); - - $routeDatas = $this->routeParser->parse($pattern); - // $routeDatas is an array of all possible routes that can be made. There is - // one routedata for each optional parameter plus one for no optional parameters. - // - // The most specific is last, so we look for that first. - $routeDatas = array_reverse($routeDatas); - - $segments = []; - foreach ($routeDatas as $routeData) { - foreach ($routeData as $item) { - if (is_string($item)) { - // this segment is a static string - $segments[] = $item; - continue; - } - - // This segment has a parameter: first element is the name - if (!array_key_exists($item[0], $data)) { - // we don't have a data element for this segment: cancel - // testing this routeData item, so that we can try a less - // specific routeData item. - $segments = []; - $segmentName = $item[0]; - break; - } - $segments[] = $data[$item[0]]; - } - if (!empty($segments)) { - // we found all the parameters for this route data, no need to check - // less specific ones - break; - } - } - - if (empty($segments)) { - throw new InvalidArgumentException('Missing data for URL segment: ' . $segmentName); - } - $url = implode('', $segments); - - if ($queryParams) { - $url .= '?' . http_build_query($queryParams); - } - - return $url; - } - - - /** - * Build the path for a named route including the base path - * - * @param string $name Route name - * @param array $data Named argument replacement data - * @param array $queryParams Optional query string parameters - * - * @return string - * - * @throws RuntimeException If named route does not exist - * @throws InvalidArgumentException If required data not provided - */ - public function pathFor($name, array $data = [], array $queryParams = []) - { - $url = $this->relativePathFor($name, $data, $queryParams); - - if ($this->basePath) { - $url = $this->basePath . $url; - } - - return $url; - } - - /** - * Build the path for a named route. - * - * This method is deprecated. Use pathFor() from now on. - * - * @param string $name Route name - * @param array $data Named argument replacement data - * @param array $queryParams Optional query string parameters - * - * @return string - * - * @throws RuntimeException If named route does not exist - * @throws InvalidArgumentException If required data not provided - */ - public function urlFor($name, array $data = [], array $queryParams = []) - { - trigger_error('urlFor() is deprecated. Use pathFor() instead.', E_USER_DEPRECATED); - return $this->pathFor($name, $data, $queryParams); - } -} diff --git a/vendor/slim/slim/composer.json b/vendor/slim/slim/composer.json deleted file mode 100644 index 808eb9d..0000000 --- a/vendor/slim/slim/composer.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "name": "slim/slim", - "type": "library", - "description": "Slim is a PHP micro framework that helps you quickly write simple yet powerful web applications and APIs", - "keywords": ["framework","micro","api","router"], - "homepage": "http://slimframework.com", - "license": "MIT", - "authors": [ - { - "name": "Josh Lockhart", - "email": "hello@joshlockhart.com", - "homepage": "https://joshlockhart.com" - }, - { - "name": "Andrew Smith", - "email": "a.smith@silentworks.co.uk", - "homepage": "http://silentworks.co.uk" - }, - { - "name": "Rob Allen", - "email": "rob@akrabat.com", - "homepage": "http://akrabat.com" - }, - { - "name": "Gabriel Manricks", - "email": "gmanricks@me.com", - "homepage": "http://gabrielmanricks.com" - } - ], - "require": { - "php": ">=5.5.0", - "pimple/pimple": "^3.0", - "psr/http-message": "^1.0", - "nikic/fast-route": "^1.0", - "container-interop/container-interop": "^1.1" - }, - "require-dev": { - "squizlabs/php_codesniffer": "^2.5", - "phpunit/phpunit": "^4.0" - }, - "provide": { - "psr/http-message-implementation": "1.0" - }, - "autoload": { - "psr-4": { - "Slim\\": "Slim" - } - }, - "scripts": { - "test": [ - "@phpunit", - "@phpcs" - ], - "phpunit": "php vendor/bin/phpunit", - "phpcs": "php vendor/bin/phpcs" - } -} diff --git a/vendor/slim/slim/example/.htaccess b/vendor/slim/slim/example/.htaccess deleted file mode 100644 index 0784bd2..0000000 --- a/vendor/slim/slim/example/.htaccess +++ /dev/null @@ -1,12 +0,0 @@ -# Note: see https://httpd.apache.org/docs/current/howto/htaccess.html: -# -# "You should avoid using .htaccess files completely if you have access to -# httpd main server config file. Using .htaccess files slows down your Apache -# http server. Any directive that you can include in a .htaccess file is -# better set in a Directory block, as it will have the same effect with -# better performance." - -RewriteEngine On -RewriteCond %{REQUEST_FILENAME} !-f -RewriteCond %{REQUEST_FILENAME} !-d -RewriteRule ^ index.php [QSA,L] diff --git a/vendor/slim/slim/example/README.md b/vendor/slim/slim/example/README.md deleted file mode 100644 index e4fb359..0000000 --- a/vendor/slim/slim/example/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# Slim example - -1. Install composer - - ```text - $ cd Slim - $ composer install - ``` - -2. Run php server - - ```text - $ cd Slim - $ php -S localhost:8888 -t example example/index.php - ``` - -3. Open browser - - Open http://localhost:8888 in your browser and you will see 'Welcome to Slim!' diff --git a/vendor/slim/slim/example/index.php b/vendor/slim/slim/example/index.php deleted file mode 100644 index ef895f8..0000000 --- a/vendor/slim/slim/example/index.php +++ /dev/null @@ -1,45 +0,0 @@ -<?php - -/** - * Step 1: Require the Slim Framework using Composer's autoloader - * - * If you are not using Composer, you need to load Slim Framework with your own - * PSR-4 autoloader. - */ -require 'vendor/autoload.php'; - -/** - * Step 2: Instantiate a Slim application - * - * This example instantiates a Slim application using - * its default settings. However, you will usually configure - * your Slim application now by passing an associative array - * of setting names and values into the application constructor. - */ -$app = new Slim\App(); - -/** - * Step 3: Define the Slim application routes - * - * Here we define several Slim application routes that respond - * to appropriate HTTP request methods. In this example, the second - * argument for `Slim::get`, `Slim::post`, `Slim::put`, `Slim::patch`, and `Slim::delete` - * is an anonymous function. - */ -$app->get('/', function ($request, $response, $args) { - $response->write("Welcome to Slim!"); - return $response; -}); - -$app->get('/hello[/{name}]', function ($request, $response, $args) { - $response->write("Hello, " . $args['name']); - return $response; -})->setArgument('name', 'World!'); - -/** - * Step 4: Run the Slim application - * - * This method should be called last. This executes the Slim application - * and returns the HTTP response to the HTTP client. - */ -$app->run(); -- GitLab