From 12416c5b35b1999fdeefb7991d938198c5a476ec Mon Sep 17 00:00:00 2001 From: Yuriy Belenko Date: Wed, 20 Jun 2018 00:00:20 +0500 Subject: [PATCH 01/11] [Slim] Shell script points to petstore-with-fake-endpoints-models-for-testing.yaml. Slim init and new models has been generated. --- bin/php-slim-petstore-server.sh | 2 +- bin/windows/php-slim-petstore-server.bat | 2 +- samples/server/petstore/php-slim/index.php | 198 +++++++++++++++++- .../lib/Models/$Special[modelName].php | 13 ++ .../php-slim/lib/Models/200Response.php | 15 ++ .../lib/Models/AdditionalPropertiesClass.php | 15 ++ .../petstore/php-slim/lib/Models/Animal.php | 15 ++ .../php-slim/lib/Models/AnimalFarm.php | 11 + .../lib/Models/ArrayOfArrayOfNumberOnly.php | 13 ++ .../php-slim/lib/Models/ArrayOfNumberOnly.php | 13 ++ .../php-slim/lib/Models/ArrayTest.php | 17 ++ .../php-slim/lib/Models/Capitalization.php | 23 ++ .../petstore/php-slim/lib/Models/Cat.php | 17 ++ .../php-slim/lib/Models/ClassModel.php | 13 ++ .../petstore/php-slim/lib/Models/Client.php | 13 ++ .../petstore/php-slim/lib/Models/Dog.php | 17 ++ .../php-slim/lib/Models/EnumArrays.php | 15 ++ .../php-slim/lib/Models/EnumClass.php | 11 + .../petstore/php-slim/lib/Models/EnumTest.php | 21 ++ .../php-slim/lib/Models/FormatTest.php | 37 ++++ .../php-slim/lib/Models/HasOnlyReadOnly.php | 15 ++ .../petstore/php-slim/lib/Models/List.php | 13 ++ .../petstore/php-slim/lib/Models/MapTest.php | 15 ++ ...PropertiesAndAdditionalPropertiesClass.php | 17 ++ .../petstore/php-slim/lib/Models/Name.php | 19 ++ .../php-slim/lib/Models/NumberOnly.php | 13 ++ .../php-slim/lib/Models/OuterComposite.php | 17 ++ .../php-slim/lib/Models/OuterEnum.php | 11 + .../php-slim/lib/Models/ReadOnlyFirst.php | 15 ++ .../petstore/php-slim/lib/Models/Return.php | 13 ++ 30 files changed, 625 insertions(+), 4 deletions(-) create mode 100644 samples/server/petstore/php-slim/lib/Models/$Special[modelName].php create mode 100644 samples/server/petstore/php-slim/lib/Models/200Response.php create mode 100644 samples/server/petstore/php-slim/lib/Models/AdditionalPropertiesClass.php create mode 100644 samples/server/petstore/php-slim/lib/Models/Animal.php create mode 100644 samples/server/petstore/php-slim/lib/Models/AnimalFarm.php create mode 100644 samples/server/petstore/php-slim/lib/Models/ArrayOfArrayOfNumberOnly.php create mode 100644 samples/server/petstore/php-slim/lib/Models/ArrayOfNumberOnly.php create mode 100644 samples/server/petstore/php-slim/lib/Models/ArrayTest.php create mode 100644 samples/server/petstore/php-slim/lib/Models/Capitalization.php create mode 100644 samples/server/petstore/php-slim/lib/Models/Cat.php create mode 100644 samples/server/petstore/php-slim/lib/Models/ClassModel.php create mode 100644 samples/server/petstore/php-slim/lib/Models/Client.php create mode 100644 samples/server/petstore/php-slim/lib/Models/Dog.php create mode 100644 samples/server/petstore/php-slim/lib/Models/EnumArrays.php create mode 100644 samples/server/petstore/php-slim/lib/Models/EnumClass.php create mode 100644 samples/server/petstore/php-slim/lib/Models/EnumTest.php create mode 100644 samples/server/petstore/php-slim/lib/Models/FormatTest.php create mode 100644 samples/server/petstore/php-slim/lib/Models/HasOnlyReadOnly.php create mode 100644 samples/server/petstore/php-slim/lib/Models/List.php create mode 100644 samples/server/petstore/php-slim/lib/Models/MapTest.php create mode 100644 samples/server/petstore/php-slim/lib/Models/MixedPropertiesAndAdditionalPropertiesClass.php create mode 100644 samples/server/petstore/php-slim/lib/Models/Name.php create mode 100644 samples/server/petstore/php-slim/lib/Models/NumberOnly.php create mode 100644 samples/server/petstore/php-slim/lib/Models/OuterComposite.php create mode 100644 samples/server/petstore/php-slim/lib/Models/OuterEnum.php create mode 100644 samples/server/petstore/php-slim/lib/Models/ReadOnlyFirst.php create mode 100644 samples/server/petstore/php-slim/lib/Models/Return.php diff --git a/bin/php-slim-petstore-server.sh b/bin/php-slim-petstore-server.sh index f3939b45fe2a..54624118c3b4 100755 --- a/bin/php-slim-petstore-server.sh +++ b/bin/php-slim-petstore-server.sh @@ -27,6 +27,6 @@ fi # if you've executed sbt assembly previously it will use that instead. export JAVA_OPTS="${JAVA_OPTS} -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties" -ags="generate -t modules/openapi-generator/src/main/resources/slim -i modules/openapi-generator/src/test/resources/2_0/petstore.yaml -g php-slim -o samples/server/petstore/php-slim $@" +ags="generate -t modules/openapi-generator/src/main/resources/slim -i modules/openapi-generator/src/test/resources/2_0/petstore-with-fake-endpoints-models-for-testing.yaml -g php-slim -o samples/server/petstore/php-slim $@" java $JAVA_OPTS -jar $executable $ags diff --git a/bin/windows/php-slim-petstore-server.bat b/bin/windows/php-slim-petstore-server.bat index aadb01fe836a..395804560b31 100644 --- a/bin/windows/php-slim-petstore-server.bat +++ b/bin/windows/php-slim-petstore-server.bat @@ -5,6 +5,6 @@ If Not Exist %executable% ( ) REM set JAVA_OPTS=%JAVA_OPTS% -Xmx1024M -set ags=generate -i modules\openapi-generator\src\test\resources\2_0\petstore.yaml -g php-slim -o samples\server\petstore\php-slim +set ags=generate -i modules\openapi-generator\src\test\resources\2_0\petstore-with-fake-endpoints-models-for-testing.yaml -g php-slim -o samples\server\petstore\php-slim java %JAVA_OPTS% -jar %executable% %ags% diff --git a/samples/server/petstore/php-slim/index.php b/samples/server/petstore/php-slim/index.php index 4c7486501056..8bc45649c853 100644 --- a/samples/server/petstore/php-slim/index.php +++ b/samples/server/petstore/php-slim/index.php @@ -9,6 +9,200 @@ $app = new Slim\App(); +/** + * PATCH testSpecialTags + * Summary: To test special tags + * Notes: To test special tags + * Output-Formats: [application/json] + */ +$app->PATCH('/v2/another-fake/dummy', function($request, $response, $args) { + + + + $body = $request->getParsedBody(); + $response->write('How about implementing testSpecialTags as a PATCH method ?'); + return $response; + }); + + +/** + * POST fakeOuterBooleanSerialize + * Summary: + * Notes: Test serialization of outer boolean types + * Output-Formats: [*/*] + */ +$app->POST('/v2/fake/outer/boolean', function($request, $response, $args) { + + + + $body = $request->getParsedBody(); + $response->write('How about implementing fakeOuterBooleanSerialize as a POST method ?'); + return $response; + }); + + +/** + * POST fakeOuterCompositeSerialize + * Summary: + * Notes: Test serialization of object with outer number type + * Output-Formats: [*/*] + */ +$app->POST('/v2/fake/outer/composite', function($request, $response, $args) { + + + + $body = $request->getParsedBody(); + $response->write('How about implementing fakeOuterCompositeSerialize as a POST method ?'); + return $response; + }); + + +/** + * POST fakeOuterNumberSerialize + * Summary: + * Notes: Test serialization of outer number types + * Output-Formats: [*/*] + */ +$app->POST('/v2/fake/outer/number', function($request, $response, $args) { + + + + $body = $request->getParsedBody(); + $response->write('How about implementing fakeOuterNumberSerialize as a POST method ?'); + return $response; + }); + + +/** + * POST fakeOuterStringSerialize + * Summary: + * Notes: Test serialization of outer string types + * Output-Formats: [*/*] + */ +$app->POST('/v2/fake/outer/string', function($request, $response, $args) { + + + + $body = $request->getParsedBody(); + $response->write('How about implementing fakeOuterStringSerialize as a POST method ?'); + return $response; + }); + + +/** + * PUT testBodyWithQueryParams + * Summary: + * Notes: + + */ +$app->PUT('/v2/fake/body-with-query-params', function($request, $response, $args) { + + $queryParams = $request->getQueryParams(); + $query = $queryParams['query']; + + $body = $request->getParsedBody(); + $response->write('How about implementing testBodyWithQueryParams as a PUT method ?'); + return $response; + }); + + +/** + * PATCH testClientModel + * Summary: To test \"client\" model + * Notes: To test \"client\" model + * Output-Formats: [application/json] + */ +$app->PATCH('/v2/fake', function($request, $response, $args) { + + + + $body = $request->getParsedBody(); + $response->write('How about implementing testClientModel as a PATCH method ?'); + return $response; + }); + + +/** + * POST testEndpointParameters + * Summary: Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트 + * Notes: Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트 + + */ +$app->POST('/v2/fake', function($request, $response, $args) { + + + $integer = $args['integer']; $int32 = $args['int32']; $int64 = $args['int64']; $number = $args['number']; $float = $args['float']; $double = $args['double']; $string = $args['string']; $patternWithoutDelimiter = $args['patternWithoutDelimiter']; $byte = $args['byte']; $binary = $args['binary']; $date = $args['date']; $dateTime = $args['dateTime']; $password = $args['password']; $callback = $args['callback']; + + $response->write('How about implementing testEndpointParameters as a POST method ?'); + return $response; + }); + + +/** + * GET testEnumParameters + * Summary: To test enum parameters + * Notes: To test enum parameters + + */ +$app->GET('/v2/fake', function($request, $response, $args) { + $headers = $request->getHeaders(); + $queryParams = $request->getQueryParams(); + $enumQueryStringArray = $queryParams['enumQueryStringArray']; $enumQueryString = $queryParams['enumQueryString']; $enumQueryInteger = $queryParams['enumQueryInteger']; $enumQueryDouble = $queryParams['enumQueryDouble']; + $enumFormStringArray = $args['enumFormStringArray']; $enumFormString = $args['enumFormString']; + + $response->write('How about implementing testEnumParameters as a GET method ?'); + return $response; + }); + + +/** + * POST testInlineAdditionalProperties + * Summary: test inline additionalProperties + * Notes: + + */ +$app->POST('/v2/fake/inline-additionalProperties', function($request, $response, $args) { + + + + $body = $request->getParsedBody(); + $response->write('How about implementing testInlineAdditionalProperties as a POST method ?'); + return $response; + }); + + +/** + * GET testJsonFormData + * Summary: test json serialization of form data + * Notes: + + */ +$app->GET('/v2/fake/jsonFormData', function($request, $response, $args) { + + + $param = $args['param']; $param2 = $args['param2']; + + $response->write('How about implementing testJsonFormData as a GET method ?'); + return $response; + }); + + +/** + * PATCH testClassname + * Summary: To test class name in snake case + * Notes: To test class name in snake case + * Output-Formats: [application/json] + */ +$app->PATCH('/v2/fake_classname_test', function($request, $response, $args) { + + + + $body = $request->getParsedBody(); + $response->write('How about implementing testClassname as a PATCH method ?'); + return $response; + }); + + /** * POST addPet * Summary: Add a new pet to the store @@ -145,7 +339,7 @@ * Notes: For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors */ -$app->DELETE('/v2/store/order/{orderId}', function($request, $response, $args) { +$app->DELETE('/v2/store/order/{order_id}', function($request, $response, $args) { @@ -177,7 +371,7 @@ * Notes: For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions * Output-Formats: [application/xml, application/json] */ -$app->GET('/v2/store/order/{orderId}', function($request, $response, $args) { +$app->GET('/v2/store/order/{order_id}', function($request, $response, $args) { diff --git a/samples/server/petstore/php-slim/lib/Models/$Special[modelName].php b/samples/server/petstore/php-slim/lib/Models/$Special[modelName].php new file mode 100644 index 000000000000..3a1a686dd112 --- /dev/null +++ b/samples/server/petstore/php-slim/lib/Models/$Special[modelName].php @@ -0,0 +1,13 @@ + Date: Wed, 20 Jun 2018 00:23:03 +0500 Subject: [PATCH 02/11] [Slim] Bugfix. Special value */* in opperation produces escaped to avoid PHP syntax errors. --- .../languages/PhpSlimServerCodegen.java | 21 +++++++++++++++++++ samples/server/petstore/php-slim/index.php | 8 +++---- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpSlimServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpSlimServerCodegen.java index a94d7b9dca33..657e98c397ff 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpSlimServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpSlimServerCodegen.java @@ -18,6 +18,7 @@ package org.openapitools.codegen.languages; import org.apache.commons.lang3.StringUtils; +import org.openapitools.codegen.CodegenOperation; import org.openapitools.codegen.CodegenConfig; import org.openapitools.codegen.CodegenConstants; import org.openapitools.codegen.CodegenType; @@ -29,6 +30,8 @@ import java.io.File; import java.util.Arrays; +import java.util.Map; +import java.util.List; import java.util.HashMap; import java.util.HashSet; import java.util.regex.Matcher; @@ -292,4 +295,22 @@ public String escapeUnsafeCharacters(String input) { return input.replace("*/", ""); } + @Override + public Map postProcessOperations(Map objs) { + Map operations = (Map) objs.get("operations"); + List operationList = (List) operations.get("operation"); + for (CodegenOperation op : operationList) { + if (op.hasProduces) { + // need to escape */* values because they breakes current mustaches + List> c = op.produces; + for (Map mediaType : c) { + if ("*/*".equals(mediaType.get("mediaType"))) { + mediaType.put("mediaType", "*_/_*"); + } + } + } + } + return objs; + } + } diff --git a/samples/server/petstore/php-slim/index.php b/samples/server/petstore/php-slim/index.php index 8bc45649c853..a32053a78469 100644 --- a/samples/server/petstore/php-slim/index.php +++ b/samples/server/petstore/php-slim/index.php @@ -29,7 +29,7 @@ * POST fakeOuterBooleanSerialize * Summary: * Notes: Test serialization of outer boolean types - * Output-Formats: [*/*] + * Output-Formats: [*_/_*] */ $app->POST('/v2/fake/outer/boolean', function($request, $response, $args) { @@ -45,7 +45,7 @@ * POST fakeOuterCompositeSerialize * Summary: * Notes: Test serialization of object with outer number type - * Output-Formats: [*/*] + * Output-Formats: [*_/_*] */ $app->POST('/v2/fake/outer/composite', function($request, $response, $args) { @@ -61,7 +61,7 @@ * POST fakeOuterNumberSerialize * Summary: * Notes: Test serialization of outer number types - * Output-Formats: [*/*] + * Output-Formats: [*_/_*] */ $app->POST('/v2/fake/outer/number', function($request, $response, $args) { @@ -77,7 +77,7 @@ * POST fakeOuterStringSerialize * Summary: * Notes: Test serialization of outer string types - * Output-Formats: [*/*] + * Output-Formats: [*_/_*] */ $app->POST('/v2/fake/outer/string', function($request, $response, $args) { From 20d15104dd02bb650ae79a0a09f2f27e05d93400 Mon Sep 17 00:00:00 2001 From: Yuriy Belenko Date: Wed, 20 Jun 2018 00:41:32 +0500 Subject: [PATCH 03/11] [Slim] Add own private static final LOGGER --- .../openapitools/codegen/languages/PhpSlimServerCodegen.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpSlimServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpSlimServerCodegen.java index 657e98c397ff..0043bc7c3327 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpSlimServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpSlimServerCodegen.java @@ -25,6 +25,8 @@ import org.openapitools.codegen.DefaultCodegen; import org.openapitools.codegen.SupportingFile; import org.openapitools.codegen.utils.ModelUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import io.swagger.v3.oas.models.media.*; @@ -37,6 +39,8 @@ import java.util.regex.Matcher; public class PhpSlimServerCodegen extends DefaultCodegen implements CodegenConfig { + private static final Logger LOGGER = LoggerFactory.getLogger(PhpSlimServerCodegen.class); + protected String invokerPackage; protected String srcBasePath = "lib"; protected String groupId = "org.openapitools"; From 00840e20a5a781bc35b8666ff463ce03f2f1b59f Mon Sep 17 00:00:00 2001 From: Yuriy Belenko Date: Wed, 20 Jun 2018 00:46:20 +0500 Subject: [PATCH 04/11] [Slim] Bugfix. toModelName method copied from PHPClient codegen which handles Fake Petstore spec much better. --- .../languages/PhpSlimServerCodegen.java | 29 ++++++++++++++++++- .../php-slim/lib/Models/Model200Response.php | 15 ++++++++++ .../php-slim/lib/Models/ModelList.php | 13 +++++++++ .../php-slim/lib/Models/ModelReturn.php | 13 +++++++++ .../php-slim/lib/Models/SpecialModelName.php | 13 +++++++++ 5 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 samples/server/petstore/php-slim/lib/Models/Model200Response.php create mode 100644 samples/server/petstore/php-slim/lib/Models/ModelList.php create mode 100644 samples/server/petstore/php-slim/lib/Models/ModelReturn.php create mode 100644 samples/server/petstore/php-slim/lib/Models/SpecialModelName.php diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpSlimServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpSlimServerCodegen.java index 0043bc7c3327..79e71e3ade01 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpSlimServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpSlimServerCodegen.java @@ -239,9 +239,36 @@ public String toParamName(String name) { @Override public String toModelName(String name) { + // remove [ + name = name.replaceAll("\\]", ""); + + // Note: backslash ("\\") is allowed for e.g. "\\DateTime" + name = name.replaceAll("[^\\w\\\\]+", "_"); // FIXME: a parameter should not be assigned. Also declare the methods parameters as 'final'. + + // remove dollar sign + name = name.replaceAll("$", ""); + // model name cannot use reserved keyword if (isReservedWord(name)) { - escapeReservedWord(name); // e.g. return => _return + LOGGER.warn(name + " (reserved word) cannot be used as model name. Renamed to " + camelize("model_" + name)); + name = "model_" + name; // e.g. return => ModelReturn (after camelize) + } + + // model name starts with number + if (name.matches("^\\d.*")) { + LOGGER.warn(name + " (model name starts with number) cannot be used as model name. Renamed to " + camelize("model_" + name)); + name = "model_" + name; // e.g. 200Response => Model200Response (after camelize) + } + + // add prefix and/or suffic only if name does not start wth \ (e.g. \DateTime) + if (!name.matches("^\\\\.*")) { + if (!StringUtils.isEmpty(modelNamePrefix)) { + name = modelNamePrefix + "_" + name; + } + + if (!StringUtils.isEmpty(modelNameSuffix)) { + name = name + "_" + modelNameSuffix; + } } // camelize the model name diff --git a/samples/server/petstore/php-slim/lib/Models/Model200Response.php b/samples/server/petstore/php-slim/lib/Models/Model200Response.php new file mode 100644 index 000000000000..83c654b05854 --- /dev/null +++ b/samples/server/petstore/php-slim/lib/Models/Model200Response.php @@ -0,0 +1,15 @@ + Date: Wed, 20 Jun 2018 00:58:42 +0500 Subject: [PATCH 05/11] [Slim] Sort operations in supporting files data to avoid shadowing static routes. --- .../languages/PhpSlimServerCodegen.java | 24 +++ .../slim/.openapi-generator/VERSION | 2 +- .../petstore-security-test/slim/index.php | 11 +- .../slim/lib/Models/ModelReturn.php | 13 ++ samples/server/petstore/php-slim/index.php | 156 +++++++++--------- 5 files changed, 120 insertions(+), 86 deletions(-) create mode 100644 samples/server/petstore-security-test/slim/lib/Models/ModelReturn.php diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpSlimServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpSlimServerCodegen.java index 79e71e3ade01..52124d859991 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpSlimServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpSlimServerCodegen.java @@ -37,6 +37,8 @@ import java.util.HashMap; import java.util.HashSet; import java.util.regex.Matcher; +import java.util.Comparator; +import java.util.Collections; public class PhpSlimServerCodegen extends DefaultCodegen implements CodegenConfig { private static final Logger LOGGER = LoggerFactory.getLogger(PhpSlimServerCodegen.class); @@ -344,4 +346,26 @@ public Map postProcessOperations(Map objs) { return objs; } + @Override + public Map postProcessSupportingFileData(Map objs) { + Map apiInfo = (Map) objs.get("apiInfo"); + List> apiList = (List>) apiInfo.get("apis"); + for (HashMap api : apiList) { + HashMap operations = (HashMap) api.get("operations"); + List operationList = (List) operations.get("operation"); + + // Sort operations to avoid static routes shadowing + // ref: https://github.com/nikic/FastRoute/blob/master/src/DataGenerator/RegexBasedAbstract.php#L92-L101 + Collections.sort(operationList, new Comparator() { + @Override + public int compare(CodegenOperation one, CodegenOperation another) { + if (one.getHasPathParams() && !another.getHasPathParams()) return 1; + if (!one.getHasPathParams() && another.getHasPathParams()) return -1; + return 0; + } + }); + } + return objs; + } + } diff --git a/samples/server/petstore-security-test/slim/.openapi-generator/VERSION b/samples/server/petstore-security-test/slim/.openapi-generator/VERSION index 096bf47efe31..82602aa4190d 100644 --- a/samples/server/petstore-security-test/slim/.openapi-generator/VERSION +++ b/samples/server/petstore-security-test/slim/.openapi-generator/VERSION @@ -1 +1 @@ -3.0.0-SNAPSHOT \ No newline at end of file +3.0.3-SNAPSHOT \ No newline at end of file diff --git a/samples/server/petstore-security-test/slim/index.php b/samples/server/petstore-security-test/slim/index.php index 88915437d5be..b0de9115c04b 100644 --- a/samples/server/petstore-security-test/slim/index.php +++ b/samples/server/petstore-security-test/slim/index.php @@ -16,13 +16,10 @@ */ $app->PUT('/fake', function($request, $response, $args) { - - - - $body = $request->getParsedBody(); - $response->write('How about implementing testCodeInject */ ' " =end \r\n \n \r as a PUT method ?'); - return $response; - }); + $body = $request->getParsedBody(); + $response->write('How about implementing testCodeInject */ ' " =end \r\n \n \r as a PUT method ?'); + return $response; +}); diff --git a/samples/server/petstore-security-test/slim/lib/Models/ModelReturn.php b/samples/server/petstore-security-test/slim/lib/Models/ModelReturn.php new file mode 100644 index 000000000000..9d3ed859a8d3 --- /dev/null +++ b/samples/server/petstore-security-test/slim/lib/Models/ModelReturn.php @@ -0,0 +1,13 @@ +DELETE('/v2/pet/{petId}', function($request, $response, $args) { - $headers = $request->getHeaders(); - - - - $response->write('How about implementing deletePet as a DELETE method ?'); - return $response; - }); - - /** * GET findPetsByStatus * Summary: Finds Pets by status @@ -270,33 +254,49 @@ /** - * GET getPetById - * Summary: Find pet by ID - * Notes: Returns a single pet - * Output-Formats: [application/xml, application/json] + * PUT updatePet + * Summary: Update an existing pet + * Notes: + */ -$app->GET('/v2/pet/{petId}', function($request, $response, $args) { - +$app->PUT('/v2/pet', function($request, $response, $args) { - $response->write('How about implementing getPetById as a GET method ?'); + $body = $request->getParsedBody(); + $response->write('How about implementing updatePet as a PUT method ?'); return $response; }); /** - * PUT updatePet - * Summary: Update an existing pet + * DELETE deletePet + * Summary: Deletes a pet * Notes: */ -$app->PUT('/v2/pet', function($request, $response, $args) { +$app->DELETE('/v2/pet/{petId}', function($request, $response, $args) { + $headers = $request->getHeaders(); - $body = $request->getParsedBody(); - $response->write('How about implementing updatePet as a PUT method ?'); + $response->write('How about implementing deletePet as a DELETE method ?'); + return $response; + }); + + +/** + * GET getPetById + * Summary: Find pet by ID + * Notes: Returns a single pet + * Output-Formats: [application/xml, application/json] + */ +$app->GET('/v2/pet/{petId}', function($request, $response, $args) { + + + + + $response->write('How about implementing getPetById as a GET method ?'); return $response; }); @@ -334,65 +334,65 @@ /** - * DELETE deleteOrder - * Summary: Delete purchase order by ID - * Notes: For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors - + * GET getInventory + * Summary: Returns pet inventories by status + * Notes: Returns a map of status codes to quantities + * Output-Formats: [application/json] */ -$app->DELETE('/v2/store/order/{order_id}', function($request, $response, $args) { +$app->GET('/v2/store/inventory', function($request, $response, $args) { - $response->write('How about implementing deleteOrder as a DELETE method ?'); + $response->write('How about implementing getInventory as a GET method ?'); return $response; }); /** - * GET getInventory - * Summary: Returns pet inventories by status - * Notes: Returns a map of status codes to quantities - * Output-Formats: [application/json] + * POST placeOrder + * Summary: Place an order for a pet + * Notes: + * Output-Formats: [application/xml, application/json] */ -$app->GET('/v2/store/inventory', function($request, $response, $args) { - +$app->POST('/v2/store/order', function($request, $response, $args) { - $response->write('How about implementing getInventory as a GET method ?'); + $body = $request->getParsedBody(); + $response->write('How about implementing placeOrder as a POST method ?'); return $response; }); /** - * GET getOrderById - * Summary: Find purchase order by ID - * Notes: For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions - * Output-Formats: [application/xml, application/json] + * DELETE deleteOrder + * Summary: Delete purchase order by ID + * Notes: For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + */ -$app->GET('/v2/store/order/{order_id}', function($request, $response, $args) { +$app->DELETE('/v2/store/order/{order_id}', function($request, $response, $args) { - $response->write('How about implementing getOrderById as a GET method ?'); + $response->write('How about implementing deleteOrder as a DELETE method ?'); return $response; }); /** - * POST placeOrder - * Summary: Place an order for a pet - * Notes: + * GET getOrderById + * Summary: Find purchase order by ID + * Notes: For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions * Output-Formats: [application/xml, application/json] */ -$app->POST('/v2/store/order', function($request, $response, $args) { +$app->GET('/v2/store/order/{order_id}', function($request, $response, $args) { - $body = $request->getParsedBody(); - $response->write('How about implementing placeOrder as a POST method ?'); + + $response->write('How about implementing getOrderById as a GET method ?'); return $response; }); @@ -446,66 +446,66 @@ /** - * DELETE deleteUser - * Summary: Delete user - * Notes: This can only be done by the logged in user. - + * GET loginUser + * Summary: Logs user into the system + * Notes: + * Output-Formats: [application/xml, application/json] */ -$app->DELETE('/v2/user/{username}', function($request, $response, $args) { - +$app->GET('/v2/user/login', function($request, $response, $args) { + $queryParams = $request->getQueryParams(); + $username = $queryParams['username']; $password = $queryParams['password']; - $response->write('How about implementing deleteUser as a DELETE method ?'); + $response->write('How about implementing loginUser as a GET method ?'); return $response; }); /** - * GET getUserByName - * Summary: Get user by user name + * GET logoutUser + * Summary: Logs out current logged in user session * Notes: - * Output-Formats: [application/xml, application/json] + */ -$app->GET('/v2/user/{username}', function($request, $response, $args) { +$app->GET('/v2/user/logout', function($request, $response, $args) { - $response->write('How about implementing getUserByName as a GET method ?'); + $response->write('How about implementing logoutUser as a GET method ?'); return $response; }); /** - * GET loginUser - * Summary: Logs user into the system - * Notes: - * Output-Formats: [application/xml, application/json] + * DELETE deleteUser + * Summary: Delete user + * Notes: This can only be done by the logged in user. + */ -$app->GET('/v2/user/login', function($request, $response, $args) { +$app->DELETE('/v2/user/{username}', function($request, $response, $args) { - $queryParams = $request->getQueryParams(); - $username = $queryParams['username']; $password = $queryParams['password']; - $response->write('How about implementing loginUser as a GET method ?'); + + $response->write('How about implementing deleteUser as a DELETE method ?'); return $response; }); /** - * GET logoutUser - * Summary: Logs out current logged in user session + * GET getUserByName + * Summary: Get user by user name * Notes: - + * Output-Formats: [application/xml, application/json] */ -$app->GET('/v2/user/logout', function($request, $response, $args) { +$app->GET('/v2/user/{username}', function($request, $response, $args) { - $response->write('How about implementing logoutUser as a GET method ?'); + $response->write('How about implementing getUserByName as a GET method ?'); return $response; }); From 8de6893a375c423be5a242d97fa8e55fb54b563c Mon Sep 17 00:00:00 2001 From: Yuriy Belenko Date: Wed, 20 Jun 2018 01:10:29 +0500 Subject: [PATCH 06/11] [Slim] Mustache index.php update. Params parsing enhanced. --- .../src/main/resources/slim/index.mustache | 41 +- samples/server/petstore/php-slim/index.php | 371 +++++++----------- 2 files changed, 175 insertions(+), 237 deletions(-) diff --git a/modules/openapi-generator/src/main/resources/slim/index.mustache b/modules/openapi-generator/src/main/resources/slim/index.mustache index d6c40200b0d6..2b499649b9ff 100644 --- a/modules/openapi-generator/src/main/resources/slim/index.mustache +++ b/modules/openapi-generator/src/main/resources/slim/index.mustache @@ -16,14 +16,39 @@ $app = new Slim\App(); {{#hasProduces}} * Output-Formats: [{{#produces}}{{{mediaType}}}{{#hasMore}}, {{/hasMore}}{{/produces}}]{{/hasProduces}} */ $app->{{httpMethod}}('{{{basePathWithoutHost}}}{{{path}}}', function($request, $response, $args) { - {{#hasHeaderParams}}$headers = $request->getHeaders();{{/hasHeaderParams}} - {{#hasQueryParams}}$queryParams = $request->getQueryParams(); - {{#queryParams}}${{paramName}} = $queryParams['{{paramName}}'];{{newline}} {{/queryParams}}{{/hasQueryParams}} - {{#hasFormParams}}{{#formParams}}${{paramName}} = $args['{{paramName}}'];{{newline}} {{/formParams}}{{/hasFormParams}} - {{#hasBodyParam}}$body = $request->getParsedBody();{{/hasBodyParam}} - $response->write('How about implementing {{nickname}} as a {{httpMethod}} method ?'); - return $response; - }); + {{#hasHeaderParams}} + $headers = $request->getHeaders(); + {{#headerParams}} + ${{paramName}} = $request->hasHeader('{{baseName}}') ? $headers['{{baseName}}'] : null; + {{/headerParams}} + {{/hasHeaderParams}} + {{#hasPathParams}} + {{#pathParams}} + ${{paramName}} = $args['{{baseName}}']; + {{/pathParams}} + {{/hasPathParams}} + {{#hasQueryParams}} + $queryParams = $request->getQueryParams(); + {{#queryParams}} + ${{paramName}} = $request->getQueryParam('{{baseName}}'); + {{/queryParams}} + {{/hasQueryParams}} + {{#hasFormParams}} + {{#formParams}} + {{#notFile}} + ${{paramName}} = $request->getParsedBodyParam('{{baseName}}'); + {{/notFile}} + {{#isFile}} + ${{paramName}} = $request->getUploadedFiles()['{{baseName}}']; + {{/isFile}} + {{/formParams}} + {{/hasFormParams}} + {{#hasBodyParam}} + $body = $request->getParsedBody(); + {{/hasBodyParam}} + $response->write('How about implementing {{nickname}} as a {{httpMethod}} method ?'); + return $response; +}); {{/operation}}{{/operations}}{{/apis}}{{/apiInfo}} diff --git a/samples/server/petstore/php-slim/index.php b/samples/server/petstore/php-slim/index.php index e0aa9c50b61c..9bb716761314 100644 --- a/samples/server/petstore/php-slim/index.php +++ b/samples/server/petstore/php-slim/index.php @@ -16,13 +16,10 @@ * Output-Formats: [application/json] */ $app->PATCH('/v2/another-fake/dummy', function($request, $response, $args) { - - - - $body = $request->getParsedBody(); - $response->write('How about implementing testSpecialTags as a PATCH method ?'); - return $response; - }); + $body = $request->getParsedBody(); + $response->write('How about implementing testSpecialTags as a PATCH method ?'); + return $response; +}); /** @@ -32,13 +29,10 @@ * Output-Formats: [*_/_*] */ $app->POST('/v2/fake/outer/boolean', function($request, $response, $args) { - - - - $body = $request->getParsedBody(); - $response->write('How about implementing fakeOuterBooleanSerialize as a POST method ?'); - return $response; - }); + $body = $request->getParsedBody(); + $response->write('How about implementing fakeOuterBooleanSerialize as a POST method ?'); + return $response; +}); /** @@ -48,13 +42,10 @@ * Output-Formats: [*_/_*] */ $app->POST('/v2/fake/outer/composite', function($request, $response, $args) { - - - - $body = $request->getParsedBody(); - $response->write('How about implementing fakeOuterCompositeSerialize as a POST method ?'); - return $response; - }); + $body = $request->getParsedBody(); + $response->write('How about implementing fakeOuterCompositeSerialize as a POST method ?'); + return $response; +}); /** @@ -64,13 +55,10 @@ * Output-Formats: [*_/_*] */ $app->POST('/v2/fake/outer/number', function($request, $response, $args) { - - - - $body = $request->getParsedBody(); - $response->write('How about implementing fakeOuterNumberSerialize as a POST method ?'); - return $response; - }); + $body = $request->getParsedBody(); + $response->write('How about implementing fakeOuterNumberSerialize as a POST method ?'); + return $response; +}); /** @@ -80,13 +68,10 @@ * Output-Formats: [*_/_*] */ $app->POST('/v2/fake/outer/string', function($request, $response, $args) { - - - - $body = $request->getParsedBody(); - $response->write('How about implementing fakeOuterStringSerialize as a POST method ?'); - return $response; - }); + $body = $request->getParsedBody(); + $response->write('How about implementing fakeOuterStringSerialize as a POST method ?'); + return $response; +}); /** @@ -96,14 +81,12 @@ */ $app->PUT('/v2/fake/body-with-query-params', function($request, $response, $args) { - - $queryParams = $request->getQueryParams(); - $query = $queryParams['query']; - - $body = $request->getParsedBody(); - $response->write('How about implementing testBodyWithQueryParams as a PUT method ?'); - return $response; - }); + $queryParams = $request->getQueryParams(); + $query = $request->getQueryParam('query'); + $body = $request->getParsedBody(); + $response->write('How about implementing testBodyWithQueryParams as a PUT method ?'); + return $response; +}); /** @@ -113,13 +96,10 @@ * Output-Formats: [application/json] */ $app->PATCH('/v2/fake', function($request, $response, $args) { - - - - $body = $request->getParsedBody(); - $response->write('How about implementing testClientModel as a PATCH method ?'); - return $response; - }); + $body = $request->getParsedBody(); + $response->write('How about implementing testClientModel as a PATCH method ?'); + return $response; +}); /** @@ -129,13 +109,10 @@ */ $app->POST('/v2/fake', function($request, $response, $args) { - - - $integer = $args['integer']; $int32 = $args['int32']; $int64 = $args['int64']; $number = $args['number']; $float = $args['float']; $double = $args['double']; $string = $args['string']; $patternWithoutDelimiter = $args['patternWithoutDelimiter']; $byte = $args['byte']; $binary = $args['binary']; $date = $args['date']; $dateTime = $args['dateTime']; $password = $args['password']; $callback = $args['callback']; - - $response->write('How about implementing testEndpointParameters as a POST method ?'); - return $response; - }); + $binary = $request->getUploadedFiles()['binary']; + $response->write('How about implementing testEndpointParameters as a POST method ?'); + return $response; +}); /** @@ -145,14 +122,17 @@ */ $app->GET('/v2/fake', function($request, $response, $args) { - $headers = $request->getHeaders(); - $queryParams = $request->getQueryParams(); - $enumQueryStringArray = $queryParams['enumQueryStringArray']; $enumQueryString = $queryParams['enumQueryString']; $enumQueryInteger = $queryParams['enumQueryInteger']; $enumQueryDouble = $queryParams['enumQueryDouble']; - $enumFormStringArray = $args['enumFormStringArray']; $enumFormString = $args['enumFormString']; - - $response->write('How about implementing testEnumParameters as a GET method ?'); - return $response; - }); + $headers = $request->getHeaders(); + $enumHeaderStringArray = $request->hasHeader('enum_header_string_array') ? $headers['enum_header_string_array'] : null; + $enumHeaderString = $request->hasHeader('enum_header_string') ? $headers['enum_header_string'] : null; + $queryParams = $request->getQueryParams(); + $enumQueryStringArray = $request->getQueryParam('enum_query_string_array'); + $enumQueryString = $request->getQueryParam('enum_query_string'); + $enumQueryInteger = $request->getQueryParam('enum_query_integer'); + $enumQueryDouble = $request->getQueryParam('enum_query_double'); + $response->write('How about implementing testEnumParameters as a GET method ?'); + return $response; +}); /** @@ -162,13 +142,10 @@ */ $app->POST('/v2/fake/inline-additionalProperties', function($request, $response, $args) { - - - - $body = $request->getParsedBody(); - $response->write('How about implementing testInlineAdditionalProperties as a POST method ?'); - return $response; - }); + $body = $request->getParsedBody(); + $response->write('How about implementing testInlineAdditionalProperties as a POST method ?'); + return $response; +}); /** @@ -178,13 +155,9 @@ */ $app->GET('/v2/fake/jsonFormData', function($request, $response, $args) { - - - $param = $args['param']; $param2 = $args['param2']; - - $response->write('How about implementing testJsonFormData as a GET method ?'); - return $response; - }); + $response->write('How about implementing testJsonFormData as a GET method ?'); + return $response; +}); /** @@ -194,13 +167,10 @@ * Output-Formats: [application/json] */ $app->PATCH('/v2/fake_classname_test', function($request, $response, $args) { - - - - $body = $request->getParsedBody(); - $response->write('How about implementing testClassname as a PATCH method ?'); - return $response; - }); + $body = $request->getParsedBody(); + $response->write('How about implementing testClassname as a PATCH method ?'); + return $response; +}); /** @@ -210,13 +180,10 @@ */ $app->POST('/v2/pet', function($request, $response, $args) { - - - - $body = $request->getParsedBody(); - $response->write('How about implementing addPet as a POST method ?'); - return $response; - }); + $body = $request->getParsedBody(); + $response->write('How about implementing addPet as a POST method ?'); + return $response; +}); /** @@ -226,14 +193,11 @@ * Output-Formats: [application/xml, application/json] */ $app->GET('/v2/pet/findByStatus', function($request, $response, $args) { - - $queryParams = $request->getQueryParams(); - $status = $queryParams['status']; - - - $response->write('How about implementing findPetsByStatus as a GET method ?'); - return $response; - }); + $queryParams = $request->getQueryParams(); + $status = $request->getQueryParam('status'); + $response->write('How about implementing findPetsByStatus as a GET method ?'); + return $response; +}); /** @@ -243,14 +207,11 @@ * Output-Formats: [application/xml, application/json] */ $app->GET('/v2/pet/findByTags', function($request, $response, $args) { - - $queryParams = $request->getQueryParams(); - $tags = $queryParams['tags']; - - - $response->write('How about implementing findPetsByTags as a GET method ?'); - return $response; - }); + $queryParams = $request->getQueryParams(); + $tags = $request->getQueryParam('tags'); + $response->write('How about implementing findPetsByTags as a GET method ?'); + return $response; +}); /** @@ -260,13 +221,10 @@ */ $app->PUT('/v2/pet', function($request, $response, $args) { - - - - $body = $request->getParsedBody(); - $response->write('How about implementing updatePet as a PUT method ?'); - return $response; - }); + $body = $request->getParsedBody(); + $response->write('How about implementing updatePet as a PUT method ?'); + return $response; +}); /** @@ -276,13 +234,12 @@ */ $app->DELETE('/v2/pet/{petId}', function($request, $response, $args) { - $headers = $request->getHeaders(); - - - - $response->write('How about implementing deletePet as a DELETE method ?'); - return $response; - }); + $headers = $request->getHeaders(); + $apiKey = $request->hasHeader('api_key') ? $headers['api_key'] : null; + $petId = $args['petId']; + $response->write('How about implementing deletePet as a DELETE method ?'); + return $response; +}); /** @@ -292,13 +249,10 @@ * Output-Formats: [application/xml, application/json] */ $app->GET('/v2/pet/{petId}', function($request, $response, $args) { - - - - - $response->write('How about implementing getPetById as a GET method ?'); - return $response; - }); + $petId = $args['petId']; + $response->write('How about implementing getPetById as a GET method ?'); + return $response; +}); /** @@ -308,13 +262,10 @@ */ $app->POST('/v2/pet/{petId}', function($request, $response, $args) { - - - $name = $args['name']; $status = $args['status']; - - $response->write('How about implementing updatePetWithForm as a POST method ?'); - return $response; - }); + $petId = $args['petId']; + $response->write('How about implementing updatePetWithForm as a POST method ?'); + return $response; +}); /** @@ -324,13 +275,11 @@ * Output-Formats: [application/json] */ $app->POST('/v2/pet/{petId}/uploadImage', function($request, $response, $args) { - - - $additionalMetadata = $args['additionalMetadata']; $file = $args['file']; - - $response->write('How about implementing uploadFile as a POST method ?'); - return $response; - }); + $petId = $args['petId']; + $file = $request->getUploadedFiles()['file']; + $response->write('How about implementing uploadFile as a POST method ?'); + return $response; +}); /** @@ -340,13 +289,9 @@ * Output-Formats: [application/json] */ $app->GET('/v2/store/inventory', function($request, $response, $args) { - - - - - $response->write('How about implementing getInventory as a GET method ?'); - return $response; - }); + $response->write('How about implementing getInventory as a GET method ?'); + return $response; +}); /** @@ -356,13 +301,10 @@ * Output-Formats: [application/xml, application/json] */ $app->POST('/v2/store/order', function($request, $response, $args) { - - - - $body = $request->getParsedBody(); - $response->write('How about implementing placeOrder as a POST method ?'); - return $response; - }); + $body = $request->getParsedBody(); + $response->write('How about implementing placeOrder as a POST method ?'); + return $response; +}); /** @@ -372,13 +314,10 @@ */ $app->DELETE('/v2/store/order/{order_id}', function($request, $response, $args) { - - - - - $response->write('How about implementing deleteOrder as a DELETE method ?'); - return $response; - }); + $orderId = $args['order_id']; + $response->write('How about implementing deleteOrder as a DELETE method ?'); + return $response; +}); /** @@ -388,13 +327,10 @@ * Output-Formats: [application/xml, application/json] */ $app->GET('/v2/store/order/{order_id}', function($request, $response, $args) { - - - - - $response->write('How about implementing getOrderById as a GET method ?'); - return $response; - }); + $orderId = $args['order_id']; + $response->write('How about implementing getOrderById as a GET method ?'); + return $response; +}); /** @@ -404,13 +340,10 @@ */ $app->POST('/v2/user', function($request, $response, $args) { - - - - $body = $request->getParsedBody(); - $response->write('How about implementing createUser as a POST method ?'); - return $response; - }); + $body = $request->getParsedBody(); + $response->write('How about implementing createUser as a POST method ?'); + return $response; +}); /** @@ -420,13 +353,10 @@ */ $app->POST('/v2/user/createWithArray', function($request, $response, $args) { - - - - $body = $request->getParsedBody(); - $response->write('How about implementing createUsersWithArrayInput as a POST method ?'); - return $response; - }); + $body = $request->getParsedBody(); + $response->write('How about implementing createUsersWithArrayInput as a POST method ?'); + return $response; +}); /** @@ -436,13 +366,10 @@ */ $app->POST('/v2/user/createWithList', function($request, $response, $args) { - - - - $body = $request->getParsedBody(); - $response->write('How about implementing createUsersWithListInput as a POST method ?'); - return $response; - }); + $body = $request->getParsedBody(); + $response->write('How about implementing createUsersWithListInput as a POST method ?'); + return $response; +}); /** @@ -452,14 +379,12 @@ * Output-Formats: [application/xml, application/json] */ $app->GET('/v2/user/login', function($request, $response, $args) { - - $queryParams = $request->getQueryParams(); - $username = $queryParams['username']; $password = $queryParams['password']; - - - $response->write('How about implementing loginUser as a GET method ?'); - return $response; - }); + $queryParams = $request->getQueryParams(); + $username = $request->getQueryParam('username'); + $password = $request->getQueryParam('password'); + $response->write('How about implementing loginUser as a GET method ?'); + return $response; +}); /** @@ -469,13 +394,9 @@ */ $app->GET('/v2/user/logout', function($request, $response, $args) { - - - - - $response->write('How about implementing logoutUser as a GET method ?'); - return $response; - }); + $response->write('How about implementing logoutUser as a GET method ?'); + return $response; +}); /** @@ -485,13 +406,10 @@ */ $app->DELETE('/v2/user/{username}', function($request, $response, $args) { - - - - - $response->write('How about implementing deleteUser as a DELETE method ?'); - return $response; - }); + $username = $args['username']; + $response->write('How about implementing deleteUser as a DELETE method ?'); + return $response; +}); /** @@ -501,13 +419,10 @@ * Output-Formats: [application/xml, application/json] */ $app->GET('/v2/user/{username}', function($request, $response, $args) { - - - - - $response->write('How about implementing getUserByName as a GET method ?'); - return $response; - }); + $username = $args['username']; + $response->write('How about implementing getUserByName as a GET method ?'); + return $response; +}); /** @@ -517,13 +432,11 @@ */ $app->PUT('/v2/user/{username}', function($request, $response, $args) { - - - - $body = $request->getParsedBody(); - $response->write('How about implementing updateUser as a PUT method ?'); - return $response; - }); + $username = $args['username']; + $body = $request->getParsedBody(); + $response->write('How about implementing updateUser as a PUT method ?'); + return $response; +}); From e471e44a434c5bd5883e86ff562ab8c423eb72b6 Mon Sep 17 00:00:00 2001 From: Yuriy Belenko Date: Wed, 20 Jun 2018 23:25:27 +0500 Subject: [PATCH 07/11] [Slim] Tiny cleanup. Unnecessary empty space removed. --- .../src/main/resources/slim/index.mustache | 4 +++- .../server/petstore-security-test/slim/index.php | 1 - .../slim/lib/Models/Return.php | 13 ------------- samples/server/petstore/php-slim/index.php | 16 ---------------- 4 files changed, 3 insertions(+), 31 deletions(-) delete mode 100644 samples/server/petstore-security-test/slim/lib/Models/Return.php diff --git a/modules/openapi-generator/src/main/resources/slim/index.mustache b/modules/openapi-generator/src/main/resources/slim/index.mustache index 2b499649b9ff..956b016e42e2 100644 --- a/modules/openapi-generator/src/main/resources/slim/index.mustache +++ b/modules/openapi-generator/src/main/resources/slim/index.mustache @@ -13,7 +13,9 @@ $app = new Slim\App(); * {{httpMethod}} {{nickname}} * Summary: {{summary}} * Notes: {{notes}} -{{#hasProduces}} * Output-Formats: [{{#produces}}{{{mediaType}}}{{#hasMore}}, {{/hasMore}}{{/produces}}]{{/hasProduces}} + {{#hasProduces}} + * Output-Formats: [{{#produces}}{{{mediaType}}}{{#hasMore}}, {{/hasMore}}{{/produces}}] + {{/hasProduces}} */ $app->{{httpMethod}}('{{{basePathWithoutHost}}}{{{path}}}', function($request, $response, $args) { {{#hasHeaderParams}} diff --git a/samples/server/petstore-security-test/slim/index.php b/samples/server/petstore-security-test/slim/index.php index b0de9115c04b..49021e42668b 100644 --- a/samples/server/petstore-security-test/slim/index.php +++ b/samples/server/petstore-security-test/slim/index.php @@ -13,7 +13,6 @@ * PUT testCodeInject */ ' " =end \r\n \n \r * Summary: To test code injection ' \" =end -- \\r\\n \\n \\r * Notes: - */ $app->PUT('/fake', function($request, $response, $args) { $body = $request->getParsedBody(); diff --git a/samples/server/petstore-security-test/slim/lib/Models/Return.php b/samples/server/petstore-security-test/slim/lib/Models/Return.php deleted file mode 100644 index 4ec708b34ba5..000000000000 --- a/samples/server/petstore-security-test/slim/lib/Models/Return.php +++ /dev/null @@ -1,13 +0,0 @@ -PUT('/v2/fake/body-with-query-params', function($request, $response, $args) { $queryParams = $request->getQueryParams(); @@ -106,7 +105,6 @@ * POST testEndpointParameters * Summary: Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트 * Notes: Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트 - */ $app->POST('/v2/fake', function($request, $response, $args) { $binary = $request->getUploadedFiles()['binary']; @@ -119,7 +117,6 @@ * GET testEnumParameters * Summary: To test enum parameters * Notes: To test enum parameters - */ $app->GET('/v2/fake', function($request, $response, $args) { $headers = $request->getHeaders(); @@ -139,7 +136,6 @@ * POST testInlineAdditionalProperties * Summary: test inline additionalProperties * Notes: - */ $app->POST('/v2/fake/inline-additionalProperties', function($request, $response, $args) { $body = $request->getParsedBody(); @@ -152,7 +148,6 @@ * GET testJsonFormData * Summary: test json serialization of form data * Notes: - */ $app->GET('/v2/fake/jsonFormData', function($request, $response, $args) { $response->write('How about implementing testJsonFormData as a GET method ?'); @@ -177,7 +172,6 @@ * POST addPet * Summary: Add a new pet to the store * Notes: - */ $app->POST('/v2/pet', function($request, $response, $args) { $body = $request->getParsedBody(); @@ -218,7 +212,6 @@ * PUT updatePet * Summary: Update an existing pet * Notes: - */ $app->PUT('/v2/pet', function($request, $response, $args) { $body = $request->getParsedBody(); @@ -231,7 +224,6 @@ * DELETE deletePet * Summary: Deletes a pet * Notes: - */ $app->DELETE('/v2/pet/{petId}', function($request, $response, $args) { $headers = $request->getHeaders(); @@ -259,7 +251,6 @@ * POST updatePetWithForm * Summary: Updates a pet in the store with form data * Notes: - */ $app->POST('/v2/pet/{petId}', function($request, $response, $args) { $petId = $args['petId']; @@ -311,7 +302,6 @@ * DELETE deleteOrder * Summary: Delete purchase order by ID * Notes: For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors - */ $app->DELETE('/v2/store/order/{order_id}', function($request, $response, $args) { $orderId = $args['order_id']; @@ -337,7 +327,6 @@ * POST createUser * Summary: Create user * Notes: This can only be done by the logged in user. - */ $app->POST('/v2/user', function($request, $response, $args) { $body = $request->getParsedBody(); @@ -350,7 +339,6 @@ * POST createUsersWithArrayInput * Summary: Creates list of users with given input array * Notes: - */ $app->POST('/v2/user/createWithArray', function($request, $response, $args) { $body = $request->getParsedBody(); @@ -363,7 +351,6 @@ * POST createUsersWithListInput * Summary: Creates list of users with given input array * Notes: - */ $app->POST('/v2/user/createWithList', function($request, $response, $args) { $body = $request->getParsedBody(); @@ -391,7 +378,6 @@ * GET logoutUser * Summary: Logs out current logged in user session * Notes: - */ $app->GET('/v2/user/logout', function($request, $response, $args) { $response->write('How about implementing logoutUser as a GET method ?'); @@ -403,7 +389,6 @@ * DELETE deleteUser * Summary: Delete user * Notes: This can only be done by the logged in user. - */ $app->DELETE('/v2/user/{username}', function($request, $response, $args) { $username = $args['username']; @@ -429,7 +414,6 @@ * PUT updateUser * Summary: Updated user * Notes: This can only be done by the logged in user. - */ $app->PUT('/v2/user/{username}', function($request, $response, $args) { $username = $args['username']; From db9b6f4ee8de448791fadc3de38656d8ef789285 Mon Sep 17 00:00:00 2001 From: Yuriy Belenko Date: Wed, 20 Jun 2018 23:37:02 +0500 Subject: [PATCH 08/11] [Slim] Security fix. toOperationId method copied from PhpClientCodegen. --- .../codegen/languages/PhpSlimServerCodegen.java | 16 ++++++++++++++++ .../server/petstore-security-test/slim/index.php | 4 ++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpSlimServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpSlimServerCodegen.java index 52124d859991..584e3760e0c9 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpSlimServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpSlimServerCodegen.java @@ -284,6 +284,22 @@ public String toModelFilename(String name) { return toModelName(name); } + @Override + public String toOperationId(String operationId) { + // throw exception if method name is empty + if (StringUtils.isEmpty(operationId)) { + throw new RuntimeException("Empty method name (operationId) not allowed"); + } + + // method name cannot use reserved keyword, e.g. return + if (isReservedWord(operationId)) { + LOGGER.warn(operationId + " (reserved word) cannot be used as method name. Renamed to " + camelize(sanitizeName("call_" + operationId), true)); + operationId = "call_" + operationId; + } + + return camelize(sanitizeName(operationId), true); + } + public String toPackagePath(String packageName, String basePath) { packageName = packageName.replace(invokerPackage, ""); // FIXME: a parameter should not be assigned. Also declare the methods parameters as 'final'. if (basePath != null && basePath.length() > 0) { diff --git a/samples/server/petstore-security-test/slim/index.php b/samples/server/petstore-security-test/slim/index.php index 49021e42668b..9fc3246ad894 100644 --- a/samples/server/petstore-security-test/slim/index.php +++ b/samples/server/petstore-security-test/slim/index.php @@ -10,13 +10,13 @@ /** - * PUT testCodeInject */ ' " =end \r\n \n \r + * PUT testCodeInjectEndRnNR * Summary: To test code injection ' \" =end -- \\r\\n \\n \\r * Notes: */ $app->PUT('/fake', function($request, $response, $args) { $body = $request->getParsedBody(); - $response->write('How about implementing testCodeInject */ ' " =end \r\n \n \r as a PUT method ?'); + $response->write('How about implementing testCodeInjectEndRnNR as a PUT method ?'); return $response; }); From 9c251ddcce15dffac91cd9637e21403b4aaeff01 Mon Sep 17 00:00:00 2001 From: Yuriy Belenko Date: Wed, 20 Jun 2018 23:56:15 +0500 Subject: [PATCH 09/11] [Slim] Bugfix. formData params parsing restored. --- .../src/main/resources/slim/index.mustache | 6 ++--- samples/server/petstore/php-slim/index.php | 24 +++++++++++++++++-- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/modules/openapi-generator/src/main/resources/slim/index.mustache b/modules/openapi-generator/src/main/resources/slim/index.mustache index 956b016e42e2..74784585848e 100644 --- a/modules/openapi-generator/src/main/resources/slim/index.mustache +++ b/modules/openapi-generator/src/main/resources/slim/index.mustache @@ -37,11 +37,11 @@ $app->{{httpMethod}}('{{{basePathWithoutHost}}}{{{path}}}', function($request, $ {{/hasQueryParams}} {{#hasFormParams}} {{#formParams}} - {{#notFile}} + {{^isFile}} ${{paramName}} = $request->getParsedBodyParam('{{baseName}}'); - {{/notFile}} + {{/isFile}} {{#isFile}} - ${{paramName}} = $request->getUploadedFiles()['{{baseName}}']; + ${{paramName}} = (key_exists('{{baseName}}', $request->getUploadedFiles())) ? $request->getUploadedFiles()['{{baseName}}'] : null; {{/isFile}} {{/formParams}} {{/hasFormParams}} diff --git a/samples/server/petstore/php-slim/index.php b/samples/server/petstore/php-slim/index.php index 0ae592278bda..0800a1087742 100644 --- a/samples/server/petstore/php-slim/index.php +++ b/samples/server/petstore/php-slim/index.php @@ -107,7 +107,20 @@ * Notes: Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트 */ $app->POST('/v2/fake', function($request, $response, $args) { - $binary = $request->getUploadedFiles()['binary']; + $integer = $request->getParsedBodyParam('integer'); + $int32 = $request->getParsedBodyParam('int32'); + $int64 = $request->getParsedBodyParam('int64'); + $number = $request->getParsedBodyParam('number'); + $float = $request->getParsedBodyParam('float'); + $double = $request->getParsedBodyParam('double'); + $string = $request->getParsedBodyParam('string'); + $patternWithoutDelimiter = $request->getParsedBodyParam('pattern_without_delimiter'); + $byte = $request->getParsedBodyParam('byte'); + $binary = (key_exists('binary', $request->getUploadedFiles())) ? $request->getUploadedFiles()['binary'] : null; + $date = $request->getParsedBodyParam('date'); + $dateTime = $request->getParsedBodyParam('dateTime'); + $password = $request->getParsedBodyParam('password'); + $callback = $request->getParsedBodyParam('callback'); $response->write('How about implementing testEndpointParameters as a POST method ?'); return $response; }); @@ -127,6 +140,8 @@ $enumQueryString = $request->getQueryParam('enum_query_string'); $enumQueryInteger = $request->getQueryParam('enum_query_integer'); $enumQueryDouble = $request->getQueryParam('enum_query_double'); + $enumFormStringArray = $request->getParsedBodyParam('enum_form_string_array'); + $enumFormString = $request->getParsedBodyParam('enum_form_string'); $response->write('How about implementing testEnumParameters as a GET method ?'); return $response; }); @@ -150,6 +165,8 @@ * Notes: */ $app->GET('/v2/fake/jsonFormData', function($request, $response, $args) { + $param = $request->getParsedBodyParam('param'); + $param2 = $request->getParsedBodyParam('param2'); $response->write('How about implementing testJsonFormData as a GET method ?'); return $response; }); @@ -254,6 +271,8 @@ */ $app->POST('/v2/pet/{petId}', function($request, $response, $args) { $petId = $args['petId']; + $name = $request->getParsedBodyParam('name'); + $status = $request->getParsedBodyParam('status'); $response->write('How about implementing updatePetWithForm as a POST method ?'); return $response; }); @@ -267,7 +286,8 @@ */ $app->POST('/v2/pet/{petId}/uploadImage', function($request, $response, $args) { $petId = $args['petId']; - $file = $request->getUploadedFiles()['file']; + $additionalMetadata = $request->getParsedBodyParam('additionalMetadata'); + $file = (key_exists('file', $request->getUploadedFiles())) ? $request->getUploadedFiles()['file'] : null; $response->write('How about implementing uploadFile as a POST method ?'); return $response; }); From ff913d7fb4fb4e4cd7aec3463498d3bc1a663496 Mon Sep 17 00:00:00 2001 From: Yuriy Belenko Date: Thu, 21 Jun 2018 22:58:23 +0500 Subject: [PATCH 10/11] [Slim] Slim dependency update to 3.10.0. Few test fake endpoints fixed by this upgrade. --- .../petstore-security-test/slim/composer.lock | 121 +++++++--- .../slim/vendor/autoload.php | 2 +- .../slim/vendor/composer/ClassLoader.php | 60 +++-- .../slim/vendor/composer/LICENSE | 2 +- .../slim/vendor/composer/autoload_psr4.php | 1 + .../slim/vendor/composer/autoload_real.php | 35 ++- .../slim/vendor/composer/installed.json | 170 ++++++++----- .../container-interop/README.md | 83 ++++++- .../container-interop/composer.json | 4 + .../docs/ContainerInterface-meta.md | 2 +- .../docs/ContainerInterface.md | 31 ++- .../docs/Delegate-lookup-meta.md | 14 +- .../container-interop/docs/Delegate-lookup.md | 12 +- .../docs/images/interoperating_containers.png | Bin 36121 -> 25738 bytes .../docs/images/priority.png | Bin 23031 -> 16252 bytes .../docs/images/side_by_side_containers.png | Bin 22624 -> 16265 bytes .../Interop/Container/ContainerInterface.php | 26 +- .../Exception/ContainerException.php | 4 +- .../Container/Exception/NotFoundException.php | 4 +- .../slim/vendor/nikic/fast-route/.travis.yml | 14 +- .../vendor/nikic/fast-route/FastRoute.hhi | 20 +- .../slim/vendor/nikic/fast-route/README.md | 40 ++++ .../vendor/nikic/fast-route/composer.json | 9 +- .../fast-route/src/BadRouteException.php | 3 +- .../nikic/fast-route/src/DataGenerator.php | 3 +- .../src/DataGenerator/CharCountBased.php | 9 +- .../src/DataGenerator/GroupCountBased.php | 10 +- .../src/DataGenerator/GroupPosBased.php | 10 +- .../src/DataGenerator/MarkBased.php | 10 +- .../src/DataGenerator/RegexBasedAbstract.php | 74 ++++-- .../nikic/fast-route/src/Dispatcher.php | 3 +- .../src/Dispatcher/CharCountBased.php | 9 +- .../src/Dispatcher/GroupCountBased.php | 9 +- .../src/Dispatcher/GroupPosBased.php | 9 +- .../fast-route/src/Dispatcher/MarkBased.php | 9 +- .../src/Dispatcher/RegexBasedAbstract.php | 22 +- .../vendor/nikic/fast-route/src/Route.php | 17 +- .../nikic/fast-route/src/RouteCollector.php | 118 ++++++++- .../nikic/fast-route/src/RouteParser.php | 5 +- .../nikic/fast-route/src/RouteParser/Std.php | 18 +- .../vendor/nikic/fast-route/src/bootstrap.php | 2 +- .../vendor/nikic/fast-route/src/functions.php | 16 +- .../test/Dispatcher/CharCountBasedTest.php | 9 +- .../test/Dispatcher/DispatcherTest.php | 142 ++++++----- .../test/Dispatcher/GroupCountBasedTest.php | 9 +- .../test/Dispatcher/GroupPosBasedTest.php | 9 +- .../test/Dispatcher/MarkBasedTest.php | 12 +- .../HackTypechecker/HackTypecheckerTest.php | 17 +- .../fast-route/test/RouteParser/StdTest.php | 25 +- .../nikic/fast-route/test/bootstrap.php | 2 +- .../slim/vendor/pimple/pimple/.travis.yml | 16 +- .../slim/vendor/pimple/pimple/CHANGELOG | 24 ++ .../slim/vendor/pimple/pimple/LICENSE | 2 +- .../slim/vendor/pimple/pimple/README.rst | 151 +++++++++++- .../slim/vendor/pimple/pimple/composer.json | 8 +- .../vendor/pimple/pimple/ext/pimple/config.m4 | 2 +- .../pimple/pimple/ext/pimple/php_pimple.h | 18 +- .../vendor/pimple/pimple/ext/pimple/pimple.c | 224 ++++++++++++++++-- .../pimple/pimple/src/Pimple/Container.php | 66 ++++-- .../pimple/src/Pimple/Tests/PimpleTest.php | 163 ++++++++++++- .../vendor/psr/http-message/composer.json | 1 + .../psr/http-message/src/MessageInterface.php | 12 +- .../psr/http-message/src/RequestInterface.php | 10 +- .../http-message/src/ResponseInterface.php | 2 +- .../src/ServerRequestInterface.php | 14 +- .../src/UploadedFileInterface.php | 2 +- .../psr/http-message/src/UriInterface.php | 14 +- .../slim/vendor/slim/slim/CONTRIBUTING.md | 20 -- .../slim/vendor/slim/slim/LICENSE.md | 2 +- .../slim/vendor/slim/slim/README.md | 84 ------- .../slim/vendor/slim/slim/Slim/App.php | 120 ++++++++-- .../slim/slim/Slim/CallableResolver.php | 93 +++++--- .../slim/Slim/CallableResolverAwareTrait.php | 6 +- .../slim/vendor/slim/slim/Slim/Collection.php | 10 +- .../slim/vendor/slim/slim/Slim/Container.php | 12 +- .../slim/Slim/DefaultServicesProvider.php | 19 +- .../slim/slim/Slim/DeferredCallable.php | 10 +- .../Slim/Exception/ContainerException.php | 8 +- .../ContainerValueNotFoundException.php | 8 +- .../Exception/MethodNotAllowedException.php | 8 +- .../slim/Slim/Exception/NotFoundException.php | 8 +- .../slim/Slim/Exception/SlimException.php | 4 +- .../slim/slim/Slim/Handlers/AbstractError.php | 4 +- .../slim/Slim/Handlers/AbstractHandler.php | 4 +- .../vendor/slim/slim/Slim/Handlers/Error.php | 26 +- .../slim/slim/Slim/Handlers/NotAllowed.php | 10 +- .../slim/slim/Slim/Handlers/NotFound.php | 49 ++-- .../slim/slim/Slim/Handlers/PhpError.php | 4 +- .../Handlers/Strategies/RequestResponse.php | 4 +- .../Strategies/RequestResponseArgs.php | 4 +- .../slim/vendor/slim/slim/Slim/Http/Body.php | 4 +- .../vendor/slim/slim/Slim/Http/Cookies.php | 16 +- .../slim/slim/Slim/Http/Environment.php | 17 +- .../vendor/slim/slim/Slim/Http/Headers.php | 6 +- .../vendor/slim/slim/Slim/Http/Message.php | 28 ++- .../vendor/slim/slim/Slim/Http/Request.php | 151 +++++++++--- .../slim/slim/Slim/Http/RequestBody.php | 4 +- .../vendor/slim/slim/Slim/Http/Response.php | 64 ++++- .../vendor/slim/slim/Slim/Http/Stream.php | 67 +++++- .../slim/slim/Slim/Http/UploadedFile.php | 8 +- .../slim/vendor/slim/slim/Slim/Http/Uri.php | 34 ++- .../Interfaces/CallableResolverInterface.php | 4 +- .../Slim/Interfaces/CollectionInterface.php | 4 +- .../Slim/Interfaces/Http/CookiesInterface.php | 4 +- .../Interfaces/Http/EnvironmentInterface.php | 4 +- .../Slim/Interfaces/Http/HeadersInterface.php | 4 +- .../InvocationStrategyInterface.php | 4 +- .../Slim/Interfaces/RouteGroupInterface.php | 4 +- .../slim/Slim/Interfaces/RouteInterface.php | 27 ++- .../slim/Slim/Interfaces/RouterInterface.php | 8 +- .../slim/slim/Slim/MiddlewareAwareTrait.php | 47 ++-- .../slim/vendor/slim/slim/Slim/Routable.php | 12 +- .../slim/vendor/slim/slim/Slim/Route.php | 62 +++-- .../slim/vendor/slim/slim/Slim/RouteGroup.php | 8 +- .../slim/vendor/slim/slim/Slim/Router.php | 44 +++- .../slim/vendor/slim/slim/composer.json | 5 +- .../slim/vendor/slim/slim/example/.htaccess | 12 - .../slim/vendor/slim/slim/example/README.md | 19 -- .../slim/vendor/slim/slim/example/index.php | 45 ---- .../server/petstore/php-slim/composer.lock | 121 +++++++--- .../petstore/php-slim/vendor/autoload.php | 2 +- .../php-slim/vendor/composer/ClassLoader.php | 60 +++-- .../vendor/composer/autoload_psr4.php | 1 + .../vendor/composer/autoload_real.php | 35 ++- .../php-slim/vendor/composer/installed.json | 170 ++++++++----- .../container-interop/README.md | 83 ++++++- .../container-interop/composer.json | 4 + .../docs/ContainerInterface-meta.md | 2 +- .../docs/ContainerInterface.md | 31 ++- .../docs/Delegate-lookup-meta.md | 14 +- .../container-interop/docs/Delegate-lookup.md | 12 +- .../docs/images/interoperating_containers.png | Bin 36121 -> 25738 bytes .../docs/images/priority.png | Bin 23031 -> 16252 bytes .../docs/images/side_by_side_containers.png | Bin 22624 -> 16265 bytes .../Interop/Container/ContainerInterface.php | 26 +- .../Exception/ContainerException.php | 4 +- .../Container/Exception/NotFoundException.php | 4 +- .../vendor/nikic/fast-route/.travis.yml | 14 +- .../vendor/nikic/fast-route/FastRoute.hhi | 20 +- .../vendor/nikic/fast-route/README.md | 40 ++++ .../vendor/nikic/fast-route/composer.json | 9 +- .../fast-route/src/BadRouteException.php | 3 +- .../nikic/fast-route/src/DataGenerator.php | 3 +- .../src/DataGenerator/CharCountBased.php | 9 +- .../src/DataGenerator/GroupCountBased.php | 10 +- .../src/DataGenerator/GroupPosBased.php | 10 +- .../src/DataGenerator/MarkBased.php | 10 +- .../src/DataGenerator/RegexBasedAbstract.php | 74 ++++-- .../nikic/fast-route/src/Dispatcher.php | 3 +- .../src/Dispatcher/CharCountBased.php | 9 +- .../src/Dispatcher/GroupCountBased.php | 9 +- .../src/Dispatcher/GroupPosBased.php | 9 +- .../fast-route/src/Dispatcher/MarkBased.php | 9 +- .../src/Dispatcher/RegexBasedAbstract.php | 22 +- .../vendor/nikic/fast-route/src/Route.php | 17 +- .../nikic/fast-route/src/RouteCollector.php | 118 ++++++++- .../nikic/fast-route/src/RouteParser.php | 5 +- .../nikic/fast-route/src/RouteParser/Std.php | 18 +- .../vendor/nikic/fast-route/src/bootstrap.php | 2 +- .../vendor/nikic/fast-route/src/functions.php | 16 +- .../test/Dispatcher/CharCountBasedTest.php | 9 +- .../test/Dispatcher/DispatcherTest.php | 142 ++++++----- .../test/Dispatcher/GroupCountBasedTest.php | 9 +- .../test/Dispatcher/GroupPosBasedTest.php | 9 +- .../test/Dispatcher/MarkBasedTest.php | 12 +- .../HackTypechecker/HackTypecheckerTest.php | 17 +- .../fast-route/test/RouteParser/StdTest.php | 25 +- .../nikic/fast-route/test/bootstrap.php | 2 +- .../php-slim/vendor/pimple/pimple/.travis.yml | 16 +- .../php-slim/vendor/pimple/pimple/CHANGELOG | 24 ++ .../php-slim/vendor/pimple/pimple/README.rst | 151 +++++++++++- .../vendor/pimple/pimple/composer.json | 8 +- .../vendor/pimple/pimple/ext/pimple/config.m4 | 2 +- .../pimple/pimple/ext/pimple/php_pimple.h | 18 +- .../vendor/pimple/pimple/ext/pimple/pimple.c | 224 ++++++++++++++++-- .../pimple/pimple/src/Pimple/Container.php | 66 ++++-- .../pimple/src/Pimple/Tests/PimpleTest.php | 163 ++++++++++++- .../vendor/psr/http-message/composer.json | 1 + .../psr/http-message/src/MessageInterface.php | 12 +- .../psr/http-message/src/RequestInterface.php | 10 +- .../http-message/src/ResponseInterface.php | 2 +- .../src/ServerRequestInterface.php | 14 +- .../src/UploadedFileInterface.php | 2 +- .../psr/http-message/src/UriInterface.php | 14 +- .../php-slim/vendor/slim/slim/CONTRIBUTING.md | 20 -- .../php-slim/vendor/slim/slim/LICENSE.md | 2 +- .../php-slim/vendor/slim/slim/README.md | 84 ------- .../php-slim/vendor/slim/slim/Slim/App.php | 120 ++++++++-- .../slim/slim/Slim/CallableResolver.php | 93 +++++--- .../slim/Slim/CallableResolverAwareTrait.php | 6 +- .../vendor/slim/slim/Slim/Collection.php | 10 +- .../vendor/slim/slim/Slim/Container.php | 12 +- .../slim/Slim/DefaultServicesProvider.php | 19 +- .../slim/slim/Slim/DeferredCallable.php | 10 +- .../Slim/Exception/ContainerException.php | 8 +- .../ContainerValueNotFoundException.php | 8 +- .../Exception/MethodNotAllowedException.php | 8 +- .../slim/Slim/Exception/NotFoundException.php | 8 +- .../slim/Slim/Exception/SlimException.php | 4 +- .../slim/slim/Slim/Handlers/AbstractError.php | 4 +- .../slim/Slim/Handlers/AbstractHandler.php | 4 +- .../vendor/slim/slim/Slim/Handlers/Error.php | 26 +- .../slim/slim/Slim/Handlers/NotAllowed.php | 10 +- .../slim/slim/Slim/Handlers/NotFound.php | 49 ++-- .../slim/slim/Slim/Handlers/PhpError.php | 4 +- .../Handlers/Strategies/RequestResponse.php | 4 +- .../Strategies/RequestResponseArgs.php | 4 +- .../vendor/slim/slim/Slim/Http/Body.php | 4 +- .../vendor/slim/slim/Slim/Http/Cookies.php | 16 +- .../slim/slim/Slim/Http/Environment.php | 17 +- .../vendor/slim/slim/Slim/Http/Headers.php | 6 +- .../vendor/slim/slim/Slim/Http/Message.php | 28 ++- .../vendor/slim/slim/Slim/Http/Request.php | 151 +++++++++--- .../slim/slim/Slim/Http/RequestBody.php | 4 +- .../vendor/slim/slim/Slim/Http/Response.php | 64 ++++- .../vendor/slim/slim/Slim/Http/Stream.php | 67 +++++- .../slim/slim/Slim/Http/UploadedFile.php | 8 +- .../vendor/slim/slim/Slim/Http/Uri.php | 34 ++- .../Interfaces/CallableResolverInterface.php | 4 +- .../Slim/Interfaces/CollectionInterface.php | 4 +- .../Slim/Interfaces/Http/CookiesInterface.php | 4 +- .../Interfaces/Http/EnvironmentInterface.php | 4 +- .../Slim/Interfaces/Http/HeadersInterface.php | 4 +- .../InvocationStrategyInterface.php | 4 +- .../Slim/Interfaces/RouteGroupInterface.php | 4 +- .../slim/Slim/Interfaces/RouteInterface.php | 27 ++- .../slim/Slim/Interfaces/RouterInterface.php | 8 +- .../slim/slim/Slim/MiddlewareAwareTrait.php | 47 ++-- .../vendor/slim/slim/Slim/Routable.php | 12 +- .../php-slim/vendor/slim/slim/Slim/Route.php | 62 +++-- .../vendor/slim/slim/Slim/RouteGroup.php | 8 +- .../php-slim/vendor/slim/slim/Slim/Router.php | 44 +++- .../php-slim/vendor/slim/slim/composer.json | 5 +- .../vendor/slim/slim/example/.htaccess | 12 - .../vendor/slim/slim/example/README.md | 19 -- .../vendor/slim/slim/example/index.php | 45 ---- 236 files changed, 4450 insertions(+), 1940 deletions(-) delete mode 100644 samples/server/petstore-security-test/slim/vendor/slim/slim/CONTRIBUTING.md delete mode 100644 samples/server/petstore-security-test/slim/vendor/slim/slim/README.md delete mode 100644 samples/server/petstore-security-test/slim/vendor/slim/slim/example/.htaccess delete mode 100644 samples/server/petstore-security-test/slim/vendor/slim/slim/example/README.md delete mode 100644 samples/server/petstore-security-test/slim/vendor/slim/slim/example/index.php delete mode 100644 samples/server/petstore/php-slim/vendor/slim/slim/CONTRIBUTING.md delete mode 100644 samples/server/petstore/php-slim/vendor/slim/slim/README.md delete mode 100644 samples/server/petstore/php-slim/vendor/slim/slim/example/.htaccess delete mode 100644 samples/server/petstore/php-slim/vendor/slim/slim/example/README.md delete mode 100644 samples/server/petstore/php-slim/vendor/slim/slim/example/index.php diff --git a/samples/server/petstore-security-test/slim/composer.lock b/samples/server/petstore-security-test/slim/composer.lock index 3007790bbebd..c31fb841c9b8 100644 --- a/samples/server/petstore-security-test/slim/composer.lock +++ b/samples/server/petstore-security-test/slim/composer.lock @@ -4,23 +4,25 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "834a8ce57aaea28f119aedff36481779", "content-hash": "913417690829da41975a473b88f30f64", "packages": [ { "name": "container-interop/container-interop", - "version": "1.1.0", + "version": "1.2.0", "source": { "type": "git", "url": "https://github.com/container-interop/container-interop.git", - "reference": "fc08354828f8fd3245f77a66b9e23a6bca48297e" + "reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/container-interop/container-interop/zipball/fc08354828f8fd3245f77a66b9e23a6bca48297e", - "reference": "fc08354828f8fd3245f77a66b9e23a6bca48297e", + "url": "https://api.github.com/repos/container-interop/container-interop/zipball/79cbf1341c22ec75643d841642dd5d6acd83bdb8", + "reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8", "shasum": "" }, + "require": { + "psr/container": "^1.0" + }, "type": "library", "autoload": { "psr-4": { @@ -32,25 +34,29 @@ "MIT" ], "description": "Promoting the interoperability of container objects (DIC, SL, etc.)", - "time": "2014-12-30 15:22:37" + "homepage": "https://github.com/container-interop/container-interop", + "time": "2017-02-14T19:40:03+00:00" }, { "name": "nikic/fast-route", - "version": "v1.0.1", + "version": "v1.3.0", "source": { "type": "git", "url": "https://github.com/nikic/FastRoute.git", - "reference": "8ea928195fa9b907f0d6e48312d323c1a13cc2af" + "reference": "181d480e08d9476e61381e04a71b34dc0432e812" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/FastRoute/zipball/8ea928195fa9b907f0d6e48312d323c1a13cc2af", - "reference": "8ea928195fa9b907f0d6e48312d323c1a13cc2af", + "url": "https://api.github.com/repos/nikic/FastRoute/zipball/181d480e08d9476e61381e04a71b34dc0432e812", + "reference": "181d480e08d9476e61381e04a71b34dc0432e812", "shasum": "" }, "require": { "php": ">=5.4.0" }, + "require-dev": { + "phpunit/phpunit": "^4.8.35|~5.7" + }, "type": "library", "autoload": { "psr-4": { @@ -75,29 +81,33 @@ "router", "routing" ], - "time": "2016-06-12 19:08:51" + "time": "2018-02-13T20:26:39+00:00" }, { "name": "pimple/pimple", - "version": "v3.0.2", + "version": "v3.2.3", "source": { "type": "git", "url": "https://github.com/silexphp/Pimple.git", - "reference": "a30f7d6e57565a2e1a316e1baf2a483f788b258a" + "reference": "9e403941ef9d65d20cba7d54e29fe906db42cf32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/silexphp/Pimple/zipball/a30f7d6e57565a2e1a316e1baf2a483f788b258a", - "reference": "a30f7d6e57565a2e1a316e1baf2a483f788b258a", + "url": "https://api.github.com/repos/silexphp/Pimple/zipball/9e403941ef9d65d20cba7d54e29fe906db42cf32", + "reference": "9e403941ef9d65d20cba7d54e29fe906db42cf32", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=5.3.0", + "psr/container": "^1.0" + }, + "require-dev": { + "symfony/phpunit-bridge": "^3.2" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0.x-dev" + "dev-master": "3.2.x-dev" } }, "autoload": { @@ -121,20 +131,69 @@ "container", "dependency injection" ], - "time": "2015-09-11 15:10:35" + "time": "2018-01-21T07:42:36+00:00" + }, + { + "name": "psr/container", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "time": "2017-02-14T16:28:37+00:00" }, { "name": "psr/http-message", - "version": "1.0", + "version": "1.0.1", "source": { "type": "git", "url": "https://github.com/php-fig/http-message.git", - "reference": "85d63699f0dbedb190bbd4b0d2b9dc707ea4c298" + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/85d63699f0dbedb190bbd4b0d2b9dc707ea4c298", - "reference": "85d63699f0dbedb190bbd4b0d2b9dc707ea4c298", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", "shasum": "" }, "require": { @@ -162,6 +221,7 @@ } ], "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", "keywords": [ "http", "http-message", @@ -170,27 +230,28 @@ "request", "response" ], - "time": "2015-05-04 20:22:00" + "time": "2016-08-06T14:39:51+00:00" }, { "name": "slim/slim", - "version": "3.4.2", + "version": "3.10.0", "source": { "type": "git", "url": "https://github.com/slimphp/Slim.git", - "reference": "a132385f736063d00632b52b3f8a389fe66fe4fa" + "reference": "d8aabeacc3688b25e2f2dd2db91df91ec6fdd748" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/slimphp/Slim/zipball/a132385f736063d00632b52b3f8a389fe66fe4fa", - "reference": "a132385f736063d00632b52b3f8a389fe66fe4fa", + "url": "https://api.github.com/repos/slimphp/Slim/zipball/d8aabeacc3688b25e2f2dd2db91df91ec6fdd748", + "reference": "d8aabeacc3688b25e2f2dd2db91df91ec6fdd748", "shasum": "" }, "require": { - "container-interop/container-interop": "^1.1", + "container-interop/container-interop": "^1.2", "nikic/fast-route": "^1.0", "php": ">=5.5.0", "pimple/pimple": "^3.0", + "psr/container": "^1.0", "psr/http-message": "^1.0" }, "provide": { @@ -233,14 +294,14 @@ } ], "description": "Slim is a PHP micro framework that helps you quickly write simple yet powerful web applications and APIs", - "homepage": "http://slimframework.com", + "homepage": "https://slimframework.com", "keywords": [ "api", "framework", "micro", "router" ], - "time": "2016-05-25 11:23:38" + "time": "2018-04-19T19:29:08+00:00" } ], "packages-dev": [], diff --git a/samples/server/petstore-security-test/slim/vendor/autoload.php b/samples/server/petstore-security-test/slim/vendor/autoload.php index 3b476eabc3ff..0caa48f7f05b 100644 --- a/samples/server/petstore-security-test/slim/vendor/autoload.php +++ b/samples/server/petstore-security-test/slim/vendor/autoload.php @@ -2,6 +2,6 @@ // autoload.php @generated by Composer -require_once __DIR__ . '/composer' . '/autoload_real.php'; +require_once __DIR__ . '/composer/autoload_real.php'; return ComposerAutoloaderInita7ca9e6d69dc1fe934d8e0e81434a295::getLoader(); diff --git a/samples/server/petstore-security-test/slim/vendor/composer/ClassLoader.php b/samples/server/petstore-security-test/slim/vendor/composer/ClassLoader.php index ff6ecfb822f8..dc02dfb114fb 100644 --- a/samples/server/petstore-security-test/slim/vendor/composer/ClassLoader.php +++ b/samples/server/petstore-security-test/slim/vendor/composer/ClassLoader.php @@ -53,8 +53,9 @@ class ClassLoader private $useIncludePath = false; private $classMap = array(); - private $classMapAuthoritative = false; + private $missingClasses = array(); + private $apcuPrefix; public function getPrefixes() { @@ -271,6 +272,26 @@ public function isClassMapAuthoritative() return $this->classMapAuthoritative; } + /** + * APCu prefix to use to cache found/not-found classes, if the extension is enabled. + * + * @param string|null $apcuPrefix + */ + public function setApcuPrefix($apcuPrefix) + { + $this->apcuPrefix = function_exists('apcu_fetch') && ini_get('apc.enabled') ? $apcuPrefix : null; + } + + /** + * The APCu prefix in use, or null if APCu caching is not enabled. + * + * @return string|null + */ + public function getApcuPrefix() + { + return $this->apcuPrefix; + } + /** * Registers this instance as an autoloader. * @@ -313,29 +334,34 @@ public function loadClass($class) */ 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) { + if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { return false; } + if (null !== $this->apcuPrefix) { + $file = apcu_fetch($this->apcuPrefix.$class, $hit); + if ($hit) { + return $file; + } + } $file = $this->findFileWithExtension($class, '.php'); // Search for Hack files if we are running on HHVM - if ($file === null && defined('HHVM_VERSION')) { + if (false === $file && defined('HHVM_VERSION')) { $file = $this->findFileWithExtension($class, '.hh'); } - if ($file === null) { + if (null !== $this->apcuPrefix) { + apcu_add($this->apcuPrefix.$class, $file); + } + + if (false === $file) { // Remember that this class does not exist. - return $this->classMap[$class] = false; + $this->missingClasses[$class] = true; } return $file; @@ -348,10 +374,14 @@ private function findFileWithExtension($class, $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))) { + $subPath = $class; + while (false !== $lastPos = strrpos($subPath, '\\')) { + $subPath = substr($subPath, 0, $lastPos); + $search = $subPath.'\\'; + if (isset($this->prefixDirsPsr4[$search])) { + $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); + foreach ($this->prefixDirsPsr4[$search] as $dir) { + if (file_exists($file = $dir . $pathEnd)) { return $file; } } @@ -399,6 +429,8 @@ private function findFileWithExtension($class, $ext) if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { return $file; } + + return false; } } diff --git a/samples/server/petstore-security-test/slim/vendor/composer/LICENSE b/samples/server/petstore-security-test/slim/vendor/composer/LICENSE index 1a28124886db..f27399a042d9 100644 --- a/samples/server/petstore-security-test/slim/vendor/composer/LICENSE +++ b/samples/server/petstore-security-test/slim/vendor/composer/LICENSE @@ -1,5 +1,5 @@ -Copyright (c) 2016 Nils Adermann, Jordi Boggiano +Copyright (c) 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 diff --git a/samples/server/petstore-security-test/slim/vendor/composer/autoload_psr4.php b/samples/server/petstore-security-test/slim/vendor/composer/autoload_psr4.php index 7e403d2e2d0f..9c0b4719520a 100644 --- a/samples/server/petstore-security-test/slim/vendor/composer/autoload_psr4.php +++ b/samples/server/petstore-security-test/slim/vendor/composer/autoload_psr4.php @@ -8,6 +8,7 @@ return array( 'Slim\\' => array($vendorDir . '/slim/slim/Slim'), 'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src'), + 'Psr\\Container\\' => array($vendorDir . '/psr/container/src'), 'Interop\\Container\\' => array($vendorDir . '/container-interop/container-interop/src/Interop/Container'), 'FastRoute\\' => array($vendorDir . '/nikic/fast-route/src'), ); diff --git a/samples/server/petstore-security-test/slim/vendor/composer/autoload_real.php b/samples/server/petstore-security-test/slim/vendor/composer/autoload_real.php index cb6d95c7fcf0..1aea141f3598 100644 --- a/samples/server/petstore-security-test/slim/vendor/composer/autoload_real.php +++ b/samples/server/petstore-security-test/slim/vendor/composer/autoload_real.php @@ -23,24 +23,35 @@ public static function getLoader() self::$loader = $loader = new \Composer\Autoload\ClassLoader(); spl_autoload_unregister(array('ComposerAutoloaderInita7ca9e6d69dc1fe934d8e0e81434a295', 'loadClassLoader')); - $map = require __DIR__ . '/autoload_namespaces.php'; - foreach ($map as $namespace => $path) { - $loader->set($namespace, $path); - } + $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); + if ($useStaticLoader) { + require_once __DIR__ . '/autoload_static.php'; - $map = require __DIR__ . '/autoload_psr4.php'; - foreach ($map as $namespace => $path) { - $loader->setPsr4($namespace, $path); - } + call_user_func(\Composer\Autoload\ComposerStaticInita7ca9e6d69dc1fe934d8e0e81434a295::getInitializer($loader)); + } else { + $map = require __DIR__ . '/autoload_namespaces.php'; + foreach ($map as $namespace => $path) { + $loader->set($namespace, $path); + } - $classMap = require __DIR__ . '/autoload_classmap.php'; - if ($classMap) { - $loader->addClassMap($classMap); + $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); - $includeFiles = require __DIR__ . '/autoload_files.php'; + if ($useStaticLoader) { + $includeFiles = Composer\Autoload\ComposerStaticInita7ca9e6d69dc1fe934d8e0e81434a295::$files; + } else { + $includeFiles = require __DIR__ . '/autoload_files.php'; + } foreach ($includeFiles as $fileIdentifier => $file) { composerRequirea7ca9e6d69dc1fe934d8e0e81434a295($fileIdentifier, $file); } diff --git a/samples/server/petstore-security-test/slim/vendor/composer/installed.json b/samples/server/petstore-security-test/slim/vendor/composer/installed.json index 9e041100fe23..f5c5dff605b8 100644 --- a/samples/server/petstore-security-test/slim/vendor/composer/installed.json +++ b/samples/server/petstore-security-test/slim/vendor/composer/installed.json @@ -1,20 +1,23 @@ [ { "name": "container-interop/container-interop", - "version": "1.1.0", - "version_normalized": "1.1.0.0", + "version": "1.2.0", + "version_normalized": "1.2.0.0", "source": { "type": "git", "url": "https://github.com/container-interop/container-interop.git", - "reference": "fc08354828f8fd3245f77a66b9e23a6bca48297e" + "reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/container-interop/container-interop/zipball/fc08354828f8fd3245f77a66b9e23a6bca48297e", - "reference": "fc08354828f8fd3245f77a66b9e23a6bca48297e", + "url": "https://api.github.com/repos/container-interop/container-interop/zipball/79cbf1341c22ec75643d841642dd5d6acd83bdb8", + "reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8", "shasum": "" }, - "time": "2014-12-30 15:22:37", + "require": { + "psr/container": "^1.0" + }, + "time": "2017-02-14T19:40:03+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -26,27 +29,31 @@ "license": [ "MIT" ], - "description": "Promoting the interoperability of container objects (DIC, SL, etc.)" + "description": "Promoting the interoperability of container objects (DIC, SL, etc.)", + "homepage": "https://github.com/container-interop/container-interop" }, { "name": "nikic/fast-route", - "version": "v1.0.1", - "version_normalized": "1.0.1.0", + "version": "v1.3.0", + "version_normalized": "1.3.0.0", "source": { "type": "git", "url": "https://github.com/nikic/FastRoute.git", - "reference": "8ea928195fa9b907f0d6e48312d323c1a13cc2af" + "reference": "181d480e08d9476e61381e04a71b34dc0432e812" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/FastRoute/zipball/8ea928195fa9b907f0d6e48312d323c1a13cc2af", - "reference": "8ea928195fa9b907f0d6e48312d323c1a13cc2af", + "url": "https://api.github.com/repos/nikic/FastRoute/zipball/181d480e08d9476e61381e04a71b34dc0432e812", + "reference": "181d480e08d9476e61381e04a71b34dc0432e812", "shasum": "" }, "require": { "php": ">=5.4.0" }, - "time": "2016-06-12 19:08:51", + "require-dev": { + "phpunit/phpunit": "^4.8.35|~5.7" + }, + "time": "2018-02-13T20:26:39+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -74,24 +81,76 @@ ] }, { - "name": "psr/http-message", - "version": "1.0", + "name": "pimple/pimple", + "version": "v3.2.3", + "version_normalized": "3.2.3.0", + "source": { + "type": "git", + "url": "https://github.com/silexphp/Pimple.git", + "reference": "9e403941ef9d65d20cba7d54e29fe906db42cf32" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/silexphp/Pimple/zipball/9e403941ef9d65d20cba7d54e29fe906db42cf32", + "reference": "9e403941ef9d65d20cba7d54e29fe906db42cf32", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "psr/container": "^1.0" + }, + "require-dev": { + "symfony/phpunit-bridge": "^3.2" + }, + "time": "2018-01-21T07:42:36+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2.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": "psr/container", + "version": "1.0.0", "version_normalized": "1.0.0.0", "source": { "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "85d63699f0dbedb190bbd4b0d2b9dc707ea4c298" + "url": "https://github.com/php-fig/container.git", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/85d63699f0dbedb190bbd4b0d2b9dc707ea4c298", - "reference": "85d63699f0dbedb190bbd4b0d2b9dc707ea4c298", + "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", "shasum": "" }, "require": { "php": ">=5.3.0" }, - "time": "2015-05-04 20:22:00", + "time": "2017-02-14T16:28:37+00:00", "type": "library", "extra": { "branch-alias": { @@ -101,7 +160,7 @@ "installation-source": "dist", "autoload": { "psr-4": { - "Psr\\Http\\Message\\": "src/" + "Psr\\Container\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -114,45 +173,45 @@ "homepage": "http://www.php-fig.org/" } ], - "description": "Common interface for HTTP messages", + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", "keywords": [ - "http", - "http-message", - "psr", - "psr-7", - "request", - "response" + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" ] }, { - "name": "pimple/pimple", - "version": "v3.0.2", - "version_normalized": "3.0.2.0", + "name": "psr/http-message", + "version": "1.0.1", + "version_normalized": "1.0.1.0", "source": { "type": "git", - "url": "https://github.com/silexphp/Pimple.git", - "reference": "a30f7d6e57565a2e1a316e1baf2a483f788b258a" + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/silexphp/Pimple/zipball/a30f7d6e57565a2e1a316e1baf2a483f788b258a", - "reference": "a30f7d6e57565a2e1a316e1baf2a483f788b258a", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", "shasum": "" }, "require": { "php": ">=5.3.0" }, - "time": "2015-09-11 15:10:35", + "time": "2016-08-06T14:39:51+00:00", "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0.x-dev" + "dev-master": "1.0.x-dev" } }, "installation-source": "dist", "autoload": { - "psr-0": { - "Pimple": "src/" + "psr-4": { + "Psr\\Http\\Message\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -161,37 +220,42 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" } ], - "description": "Pimple, a simple Dependency Injection Container", - "homepage": "http://pimple.sensiolabs.org", + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", "keywords": [ - "container", - "dependency injection" + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" ] }, { "name": "slim/slim", - "version": "3.4.2", - "version_normalized": "3.4.2.0", + "version": "3.10.0", + "version_normalized": "3.10.0.0", "source": { "type": "git", "url": "https://github.com/slimphp/Slim.git", - "reference": "a132385f736063d00632b52b3f8a389fe66fe4fa" + "reference": "d8aabeacc3688b25e2f2dd2db91df91ec6fdd748" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/slimphp/Slim/zipball/a132385f736063d00632b52b3f8a389fe66fe4fa", - "reference": "a132385f736063d00632b52b3f8a389fe66fe4fa", + "url": "https://api.github.com/repos/slimphp/Slim/zipball/d8aabeacc3688b25e2f2dd2db91df91ec6fdd748", + "reference": "d8aabeacc3688b25e2f2dd2db91df91ec6fdd748", "shasum": "" }, "require": { - "container-interop/container-interop": "^1.1", + "container-interop/container-interop": "^1.2", "nikic/fast-route": "^1.0", "php": ">=5.5.0", "pimple/pimple": "^3.0", + "psr/container": "^1.0", "psr/http-message": "^1.0" }, "provide": { @@ -201,7 +265,7 @@ "phpunit/phpunit": "^4.0", "squizlabs/php_codesniffer": "^2.5" }, - "time": "2016-05-25 11:23:38", + "time": "2018-04-19T19:29:08+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -236,7 +300,7 @@ } ], "description": "Slim is a PHP micro framework that helps you quickly write simple yet powerful web applications and APIs", - "homepage": "http://slimframework.com", + "homepage": "https://slimframework.com", "keywords": [ "api", "framework", diff --git a/samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/README.md b/samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/README.md index ec434d0f2683..cdd7a44c8ee8 100644 --- a/samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/README.md +++ b/samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/README.md @@ -1,11 +1,25 @@ # Container Interoperability [![Latest Stable Version](https://poser.pugx.org/container-interop/container-interop/v/stable.png)](https://packagist.org/packages/container-interop/container-interop) +[![Total Downloads](https://poser.pugx.org/container-interop/container-interop/downloads.svg)](https://packagist.org/packages/container-interop/container-interop) + +## Deprecation warning! + +Starting Feb. 13th 2017, container-interop is officially deprecated in favor of [PSR-11](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-11-container.md). +Container-interop has been the test-bed of PSR-11. From v1.2, container-interop directly extends PSR-11 interfaces. +Therefore, all containers implementing container-interop are now *de-facto* compatible with PSR-11. + +- Projects implementing container-interop interfaces are encouraged to directly implement PSR-11 interfaces instead. +- Projects consuming container-interop interfaces are very strongly encouraged to directly type-hint on PSR-11 interfaces, in order to be compatible with PSR-11 containers that are not compatible with container-interop. + +Regarding the delegate lookup feature, that is present in container-interop and not in PSR-11, the feature is actually a design pattern. It is therefore not deprecated. Documentation regarding this design pattern will be migrated from this repository into a separate website in the future. + +## About *container-interop* tries to identify and standardize features in *container* objects (service locators, -dependency injection containers, etc.) to achieve interopererability. +dependency injection containers, etc.) to achieve interoperability. -Through discussions and trials, we try to create a standard, made of common interfaces but also recommendations. +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 @@ -22,11 +36,7 @@ this project will pave the way for one or more future PSRs. You can install this package through Composer: ```json -{ - "require": { - "container-interop/container-interop": "~1.0" - } -} +composer require container-interop/container-interop ``` The packages adheres to the [SemVer](http://semver.org/) specification, and there will be full backward compatibility @@ -41,7 +51,7 @@ between minor versions. 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 +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 @@ -52,19 +62,72 @@ View open [request for comments](https://github.com/container-interop/container- ### Projects implementing `ContainerInterface` -- [Acclimate](https://github.com/jeremeamia/acclimate-container) -- [dcp-di](https://github.com/estelsmith/dcp-di) +- [Acclimate](https://github.com/jeremeamia/acclimate-container): Adapters for + Aura.Di, Laravel, Nette DI, Pimple, Symfony DI, ZF2 Service manager, ZF2 + Dependency injection and any container using `ArrayAccess` +- [Aura.Di](https://github.com/auraphp/Aura.Di) +- [auryn-container-interop](https://github.com/elazar/auryn-container-interop) +- [Burlap](https://github.com/codeeverything/burlap) +- [Chernozem](https://github.com/pyrsmk/Chernozem) +- [Data Manager](https://github.com/chrismichaels84/data-manager) +- [Disco](https://github.com/bitexpert/disco) +- [InDI](https://github.com/idealogica/indi) +- [League/Container](http://container.thephpleague.com/) - [Mouf](http://mouf-php.com) - [Njasm Container](https://github.com/njasm/container) - [PHP-DI](http://php-di.org) +- [Picotainer](https://github.com/thecodingmachine/picotainer) - [PimpleInterop](https://github.com/moufmouf/pimple-interop) +- [Pimple3-ContainerInterop](https://github.com/Sam-Burns/pimple3-containerinterop) (using Pimple v3) +- [SitePoint Container](https://github.com/sitepoint/Container) +- [Thruster Container](https://github.com/ThrusterIO/container) (PHP7 only) +- [Ultra-Lite Container](https://github.com/ultra-lite/container) +- [Unbox](https://github.com/mindplay-dk/unbox) - [XStatic](https://github.com/jeremeamia/xstatic) +- [Zend\ServiceManager](https://github.com/zendframework/zend-servicemanager) +- [Zit](https://github.com/inxilpro/Zit) ### Projects implementing the *delegate lookup* feature +- [Aura.Di](https://github.com/auraphp/Aura.Di) +- [Burlap](https://github.com/codeeverything/burlap) +- [Chernozem](https://github.com/pyrsmk/Chernozem) +- [InDI](https://github.com/idealogica/indi) +- [League/Container](http://container.thephpleague.com/) - [Mouf](http://mouf-php.com) +- [Picotainer](https://github.com/thecodingmachine/picotainer) - [PHP-DI](http://php-di.org) - [PimpleInterop](https://github.com/moufmouf/pimple-interop) +- [Ultra-Lite Container](https://github.com/ultra-lite/container) + +### Middlewares implementing `ContainerInterface` + +- [Alias-Container](https://github.com/thecodingmachine/alias-container): add + aliases support to any container +- [Prefixer-Container](https://github.com/thecodingmachine/prefixer-container): + dynamically prefix identifiers +- [Lazy-Container](https://github.com/snapshotpl/lazy-container): lazy services + +### Projects using `ContainerInterface` + +The list below contains only a sample of all the projects consuming `ContainerInterface`. For a more complete list have a look [here](http://packanalyst.com/class?q=Interop%5CContainer%5CContainerInterface). + +| | Downloads | +| --- | --- | +| [Adroit](https://github.com/bitexpert/adroit) | ![](https://img.shields.io/packagist/dt/bitexpert/adroit.svg) | +| [Behat](https://github.com/Behat/Behat/pull/974) | ![](https://img.shields.io/packagist/dt/behat/behat.svg) | +| [blast-facades](https://github.com/phpthinktank/blast-facades): Minimize complexity and represent dependencies as facades. | ![](https://img.shields.io/packagist/dt/blast/facades.svg) | +| [interop.silex.di](https://github.com/thecodingmachine/interop.silex.di): an extension to [Silex](http://silex.sensiolabs.org/) that adds support for any *container-interop* compatible container | ![](https://img.shields.io/packagist/dt/mouf/interop.silex.di.svg) | +| [mindplay/walkway](https://github.com/mindplay-dk/walkway): a modular request router | ![](https://img.shields.io/packagist/dt/mindplay/walkway.svg) | +| [mindplay/middleman](https://github.com/mindplay-dk/middleman): minimalist PSR-7 middleware dispatcher | ![](https://img.shields.io/packagist/dt/mindplay/middleman.svg) | +| [PHP-DI/Invoker](https://github.com/PHP-DI/Invoker): extensible and configurable invoker/dispatcher | ![](https://img.shields.io/packagist/dt/php-di/invoker.svg) | +| [Prophiler](https://github.com/fabfuel/prophiler) | ![](https://img.shields.io/packagist/dt/fabfuel/prophiler.svg) | +| [Silly](https://github.com/mnapoli/silly): CLI micro-framework | ![](https://img.shields.io/packagist/dt/mnapoli/silly.svg) | +| [Slim v3](https://github.com/slimphp/Slim) | ![](https://img.shields.io/packagist/dt/slim/slim.svg) | +| [Splash](http://mouf-php.com/packages/mouf/mvc.splash-common/version/8.0-dev/README.md) | ![](https://img.shields.io/packagist/dt/mouf/mvc.splash-common.svg) | +| [Woohoo Labs. Harmony](https://github.com/woohoolabs/harmony): a flexible micro-framework | ![](https://img.shields.io/packagist/dt/woohoolabs/harmony.svg) | +| [zend-expressive](https://github.com/zendframework/zend-expressive) | ![](https://img.shields.io/packagist/dt/zendframework/zend-expressive.svg) | + ## Workflow diff --git a/samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/composer.json b/samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/composer.json index 84f38752822f..855f766723a0 100644 --- a/samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/composer.json +++ b/samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/composer.json @@ -2,10 +2,14 @@ "name": "container-interop/container-interop", "type": "library", "description": "Promoting the interoperability of container objects (DIC, SL, etc.)", + "homepage": "https://github.com/container-interop/container-interop", "license": "MIT", "autoload": { "psr-4": { "Interop\\Container\\": "src/Interop/Container/" } + }, + "require": { + "psr/container": "^1.0" } } diff --git a/samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/docs/ContainerInterface-meta.md b/samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/docs/ContainerInterface-meta.md index 90711c9051d2..59f3d5599faf 100644 --- a/samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/docs/ContainerInterface-meta.md +++ b/samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/docs/ContainerInterface-meta.md @@ -54,7 +54,7 @@ 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 +- some containers have an optional additional argument for `get()`, but it doesn't have 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 diff --git a/samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/docs/ContainerInterface.md b/samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/docs/ContainerInterface.md index b670aa133b4e..bda973d6fce1 100644 --- a/samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/docs/ContainerInterface.md +++ b/samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/docs/ContainerInterface.md @@ -11,7 +11,7 @@ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", 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. +implementing the `ContainerInterface` in a dependency injection-related library or framework. Users of dependency injections containers (DIC) are referred to as `user`. [RFC 2119]: http://tools.ietf.org/html/rfc2119 @@ -31,50 +31,52 @@ Users of dependency injections containers (DIC) are referred to as `user`. `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. - + `has($id)` returning true does not mean that `get($id)` will not throw an exception. + It does however mean that `get($id)` will not throw a `NotFoundException`. + ### 1.2 Exceptions -Exceptions directly thrown by the container MUST implement the +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 +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 +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. +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 +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, +- 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 +- 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 +- 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 +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 @@ -114,6 +116,9 @@ interface ContainerInterface * Returns true if the container can return an entry for the given identifier. * Returns false otherwise. * + * `has($id)` returning true does not mean that `get($id)` will not throw an exception. + * It does however mean that `get($id)` will not throw a `NotFoundException`. + * * @param string $id Identifier of the entry to look for. * * @return boolean diff --git a/samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/docs/Delegate-lookup-meta.md b/samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/docs/Delegate-lookup-meta.md index d21ebf928f8e..6048b73e290e 100644 --- a/samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/docs/Delegate-lookup-meta.md +++ b/samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/docs/Delegate-lookup-meta.md @@ -89,16 +89,16 @@ In the example above, "container 2" contains a controller "myController" and the 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 +However, using the *delegate lookup* feature, here is what happens when we ask the composite container 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. +- The composite container asks container 1 if if contains the "myController" instance. The answer is no. +- The composite container asks container 2 if if contains the "myController" instance. The answer is yes. +- The composite container 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. +- Container 2 delegates the lookup of "entityManager" to the composite container. +- The composite container asks container 1 if if contains the "entityManager" instance. The answer is yes. +- The composite container 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. diff --git a/samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/docs/Delegate-lookup.md b/samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/docs/Delegate-lookup.md index 63cc3fb0f40b..f64a8f785a84 100644 --- a/samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/docs/Delegate-lookup.md +++ b/samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/docs/Delegate-lookup.md @@ -3,10 +3,10 @@ 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. +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 +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", @@ -36,22 +36,22 @@ fetching the dependencies from. 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, +- 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 + 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 +- 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 +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 diff --git a/samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/docs/images/interoperating_containers.png b/samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/docs/images/interoperating_containers.png index eddc8a52906d53746438e09c9bdf2bc503902b6e..1d3fdd0ddbea28d77c08cfb65834ec11357be5fb 100644 GIT binary patch literal 25738 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 diff --git a/samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/docs/images/priority.png b/samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/docs/images/priority.png index d2ae7942a64fc82cea3b0569d1efffd8d884a269..d02cb7d1f1ed29c6fa87a269cdd8955e0e907a4c 100644 GIT binary patch literal 16252 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 ?classname, - 'dataGenerator' => ?classname, - 'dispatcher' => ?classname, - 'routeCollector' => ?classname, + ?'routeParser' => classname, + ?'dataGenerator' => classname, + ?'dispatcher' => classname, + ?'routeCollector' => classname, ) $options = shape()): Dispatcher; function cachedDispatcher( (function(RouteCollector): void) $routeDefinitionCallback, shape( - 'routeParser' => ?classname, - 'dataGenerator' => ?classname, - 'dispatcher' => ?classname, - 'routeCollector' => ?classname, - 'cacheDisabled' => ?bool, - 'cacheFile' => ?string, + ?'routeParser' => classname, + ?'dataGenerator' => classname, + ?'dispatcher' => classname, + ?'routeCollector' => classname, + ?'cacheDisabled' => bool, + ?'cacheFile' => string, ) $options = shape()): Dispatcher; } diff --git a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/README.md b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/README.md index f812a2a014ca..91bd4664e031 100644 --- a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/README.md +++ b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/README.md @@ -122,6 +122,46 @@ The `$handler` parameter does not necessarily have to be a callback, it could al 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. +#### Shorcut methods for common request methods + +For the `GET`, `POST`, `PUT`, `PATCH`, `DELETE` and `HEAD` request methods shortcut methods are available. For example: + +```php +$r->get('/get-route', 'get_handler'); +$r->post('/post-route', 'post_handler'); +``` + +Is equivalent to: + +```php +$r->addRoute('GET', '/get-route', 'get_handler'); +$r->addRoute('POST', '/post-route', 'post_handler'); +``` + +#### Route Groups + +Additionally, you can specify routes inside of a group. All routes defined inside a group will have a common prefix. + +For example, defining your routes as: + +```php +$r->addGroup('/admin', function (RouteCollector $r) { + $r->addRoute('GET', '/do-something', 'handler'); + $r->addRoute('GET', '/do-another-thing', 'handler'); + $r->addRoute('GET', '/do-something-else', 'handler'); +}); +``` + +Will have the same result as: + + ```php +$r->addRoute('GET', '/admin/do-something', 'handler'); +$r->addRoute('GET', '/admin/do-another-thing', 'handler'); +$r->addRoute('GET', '/admin/do-something-else', 'handler'); + ``` + +Nested groups are also supported, in which case the prefixes of all the nested groups are combined. + ### Caching The reason `simpleDispatcher` accepts a callback for defining the routes is to allow seamless diff --git a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/composer.json b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/composer.json index 62aad22b0ce0..fb446a2abfbc 100644 --- a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/composer.json +++ b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/composer.json @@ -9,13 +9,16 @@ "email": "nikic@php.net" } ], - "require": { - "php": ">=5.4.0" - }, "autoload": { "psr-4": { "FastRoute\\": "src/" }, "files": ["src/functions.php"] + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35|~5.7" } } diff --git a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/BadRouteException.php b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/BadRouteException.php index 7e38479661e0..62262ec66f66 100644 --- a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/BadRouteException.php +++ b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/BadRouteException.php @@ -2,5 +2,6 @@ namespace FastRoute; -class BadRouteException extends \LogicException { +class BadRouteException extends \LogicException +{ } diff --git a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/DataGenerator.php b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/DataGenerator.php index 16053db92ae2..af577cd54370 100644 --- a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/DataGenerator.php +++ b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/DataGenerator.php @@ -2,7 +2,8 @@ namespace FastRoute; -interface DataGenerator { +interface DataGenerator +{ /** * Adds a route to the data generator. The route data uses the * same format that is returned by RouterParser::parser(). diff --git a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/DataGenerator/CharCountBased.php b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/DataGenerator/CharCountBased.php index 5c38b89e3d26..3cfeed66f3e8 100644 --- a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/DataGenerator/CharCountBased.php +++ b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/DataGenerator/CharCountBased.php @@ -2,12 +2,15 @@ namespace FastRoute\DataGenerator; -class CharCountBased extends RegexBasedAbstract { - protected function getApproxChunkSize() { +class CharCountBased extends RegexBasedAbstract +{ + protected function getApproxChunkSize() + { return 30; } - protected function processChunk($regexToRoutesMap) { + protected function processChunk($regexToRoutesMap) + { $routeMap = []; $regexes = []; diff --git a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/DataGenerator/GroupCountBased.php b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/DataGenerator/GroupCountBased.php index d51807f0772c..54d9a05e20b6 100644 --- a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/DataGenerator/GroupCountBased.php +++ b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/DataGenerator/GroupCountBased.php @@ -2,12 +2,15 @@ namespace FastRoute\DataGenerator; -class GroupCountBased extends RegexBasedAbstract { - protected function getApproxChunkSize() { +class GroupCountBased extends RegexBasedAbstract +{ + protected function getApproxChunkSize() + { return 10; } - protected function processChunk($regexToRoutesMap) { + protected function processChunk($regexToRoutesMap) + { $routeMap = []; $regexes = []; $numGroups = 0; @@ -25,4 +28,3 @@ protected function processChunk($regexToRoutesMap) { return ['regex' => $regex, 'routeMap' => $routeMap]; } } - diff --git a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/DataGenerator/GroupPosBased.php b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/DataGenerator/GroupPosBased.php index 4152f7a7efc9..fc4dc0aff639 100644 --- a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/DataGenerator/GroupPosBased.php +++ b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/DataGenerator/GroupPosBased.php @@ -2,12 +2,15 @@ namespace FastRoute\DataGenerator; -class GroupPosBased extends RegexBasedAbstract { - protected function getApproxChunkSize() { +class GroupPosBased extends RegexBasedAbstract +{ + protected function getApproxChunkSize() + { return 10; } - protected function processChunk($regexToRoutesMap) { + protected function processChunk($regexToRoutesMap) + { $routeMap = []; $regexes = []; $offset = 1; @@ -22,4 +25,3 @@ protected function processChunk($regexToRoutesMap) { return ['regex' => $regex, 'routeMap' => $routeMap]; } } - diff --git a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/DataGenerator/MarkBased.php b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/DataGenerator/MarkBased.php index 61359f5e73f6..0aebed9a1614 100644 --- a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/DataGenerator/MarkBased.php +++ b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/DataGenerator/MarkBased.php @@ -2,12 +2,15 @@ namespace FastRoute\DataGenerator; -class MarkBased extends RegexBasedAbstract { - protected function getApproxChunkSize() { +class MarkBased extends RegexBasedAbstract +{ + protected function getApproxChunkSize() + { return 30; } - protected function processChunk($regexToRoutesMap) { + protected function processChunk($regexToRoutesMap) + { $routeMap = []; $regexes = []; $markName = 'a'; @@ -22,4 +25,3 @@ protected function processChunk($regexToRoutesMap) { return ['regex' => $regex, 'routeMap' => $routeMap]; } } - diff --git a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php index 713d8972f5ae..645729059925 100644 --- a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php +++ b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php @@ -2,18 +2,30 @@ namespace FastRoute\DataGenerator; -use FastRoute\DataGenerator; use FastRoute\BadRouteException; +use FastRoute\DataGenerator; use FastRoute\Route; -abstract class RegexBasedAbstract implements DataGenerator { +abstract class RegexBasedAbstract implements DataGenerator +{ + /** @var mixed[][] */ protected $staticRoutes = []; + + /** @var Route[][] */ protected $methodToRegexToRoutesMap = []; - protected abstract function getApproxChunkSize(); - protected abstract function processChunk($regexToRoutesMap); + /** + * @return int + */ + abstract protected function getApproxChunkSize(); + + /** + * @return mixed[] + */ + abstract protected function processChunk($regexToRoutesMap); - public function addRoute($httpMethod, $routeData, $handler) { + public function addRoute($httpMethod, $routeData, $handler) + { if ($this->isStaticRoute($routeData)) { $this->addStaticRoute($httpMethod, $routeData, $handler); } else { @@ -21,7 +33,11 @@ public function addRoute($httpMethod, $routeData, $handler) { } } - public function getData() { + /** + * @return mixed[] + */ + public function getData() + { if (empty($this->methodToRegexToRoutesMap)) { return [$this->staticRoutes, []]; } @@ -29,26 +45,41 @@ public function getData() { return [$this->staticRoutes, $this->generateVariableRouteData()]; } - private function generateVariableRouteData() { + /** + * @return mixed[] + */ + 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); + $data[$method] = array_map([$this, 'processChunk'], $chunks); } return $data; } - private function computeChunkSize($count) { + /** + * @param int + * @return int + */ + private function computeChunkSize($count) + { $numParts = max(1, round($count / $this->getApproxChunkSize())); - return ceil($count / $numParts); + return (int) ceil($count / $numParts); } - private function isStaticRoute($routeData) { + /** + * @param mixed[] + * @return bool + */ + private function isStaticRoute($routeData) + { return count($routeData) === 1 && is_string($routeData[0]); } - private function addStaticRoute($httpMethod, $routeData, $handler) { + private function addStaticRoute($httpMethod, $routeData, $handler) + { $routeStr = $routeData[0]; if (isset($this->staticRoutes[$httpMethod][$routeStr])) { @@ -72,7 +103,8 @@ private function addStaticRoute($httpMethod, $routeData, $handler) { $this->staticRoutes[$httpMethod][$routeStr] = $handler; } - private function addVariableRoute($httpMethod, $routeData, $handler) { + private function addVariableRoute($httpMethod, $routeData, $handler) + { list($regex, $variables) = $this->buildRegexForRoute($routeData); if (isset($this->methodToRegexToRoutesMap[$httpMethod][$regex])) { @@ -87,7 +119,12 @@ private function addVariableRoute($httpMethod, $routeData, $handler) { ); } - private function buildRegexForRoute($routeData) { + /** + * @param mixed[] + * @return mixed[] + */ + private function buildRegexForRoute($routeData) + { $regex = ''; $variables = []; foreach ($routeData as $part) { @@ -118,14 +155,19 @@ private function buildRegexForRoute($routeData) { return [$regex, $variables]; } - private function regexHasCapturingGroups($regex) { + /** + * @param string + * @return bool + */ + 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( + return (bool) preg_match( '~ (?: \(\?\( diff --git a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Dispatcher.php b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Dispatcher.php index ea98009bd264..4ae72a356b65 100644 --- a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Dispatcher.php +++ b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Dispatcher.php @@ -2,7 +2,8 @@ namespace FastRoute; -interface Dispatcher { +interface Dispatcher +{ const NOT_FOUND = 0; const FOUND = 1; const METHOD_NOT_ALLOWED = 2; diff --git a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Dispatcher/CharCountBased.php b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Dispatcher/CharCountBased.php index 22ba2406f1e8..ef1eec1345ea 100644 --- a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Dispatcher/CharCountBased.php +++ b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Dispatcher/CharCountBased.php @@ -2,12 +2,15 @@ namespace FastRoute\Dispatcher; -class CharCountBased extends RegexBasedAbstract { - public function __construct($data) { +class CharCountBased extends RegexBasedAbstract +{ + public function __construct($data) + { list($this->staticRouteMap, $this->variableRouteData) = $data; } - protected function dispatchVariableRoute($routeData, $uri) { + protected function dispatchVariableRoute($routeData, $uri) + { foreach ($routeData as $data) { if (!preg_match($data['regex'], $uri . $data['suffix'], $matches)) { continue; diff --git a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Dispatcher/GroupCountBased.php b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Dispatcher/GroupCountBased.php index 0abd32231309..493e7a94f08f 100644 --- a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Dispatcher/GroupCountBased.php +++ b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Dispatcher/GroupCountBased.php @@ -2,12 +2,15 @@ namespace FastRoute\Dispatcher; -class GroupCountBased extends RegexBasedAbstract { - public function __construct($data) { +class GroupCountBased extends RegexBasedAbstract +{ + public function __construct($data) + { list($this->staticRouteMap, $this->variableRouteData) = $data; } - protected function dispatchVariableRoute($routeData, $uri) { + protected function dispatchVariableRoute($routeData, $uri) + { foreach ($routeData as $data) { if (!preg_match($data['regex'], $uri, $matches)) { continue; diff --git a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Dispatcher/GroupPosBased.php b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Dispatcher/GroupPosBased.php index 32227d4944d2..498220ed6f7c 100644 --- a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Dispatcher/GroupPosBased.php +++ b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Dispatcher/GroupPosBased.php @@ -2,12 +2,15 @@ namespace FastRoute\Dispatcher; -class GroupPosBased extends RegexBasedAbstract { - public function __construct($data) { +class GroupPosBased extends RegexBasedAbstract +{ + public function __construct($data) + { list($this->staticRouteMap, $this->variableRouteData) = $data; } - protected function dispatchVariableRoute($routeData, $uri) { + protected function dispatchVariableRoute($routeData, $uri) + { foreach ($routeData as $data) { if (!preg_match($data['regex'], $uri, $matches)) { continue; diff --git a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Dispatcher/MarkBased.php b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Dispatcher/MarkBased.php index fefa71185711..22eb09ba575f 100644 --- a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Dispatcher/MarkBased.php +++ b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Dispatcher/MarkBased.php @@ -2,12 +2,15 @@ namespace FastRoute\Dispatcher; -class MarkBased extends RegexBasedAbstract { - public function __construct($data) { +class MarkBased extends RegexBasedAbstract +{ + public function __construct($data) + { list($this->staticRouteMap, $this->variableRouteData) = $data; } - protected function dispatchVariableRoute($routeData, $uri) { + protected function dispatchVariableRoute($routeData, $uri) + { foreach ($routeData as $data) { if (!preg_match($data['regex'], $uri, $matches)) { continue; diff --git a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Dispatcher/RegexBasedAbstract.php b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Dispatcher/RegexBasedAbstract.php index 8823b9b25280..206e879f7b25 100644 --- a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Dispatcher/RegexBasedAbstract.php +++ b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Dispatcher/RegexBasedAbstract.php @@ -4,13 +4,21 @@ use FastRoute\Dispatcher; -abstract class RegexBasedAbstract implements Dispatcher { - protected $staticRouteMap; - protected $variableRouteData; +abstract class RegexBasedAbstract implements Dispatcher +{ + /** @var mixed[][] */ + protected $staticRouteMap = []; - protected abstract function dispatchVariableRoute($routeData, $uri); + /** @var mixed[] */ + protected $variableRouteData = []; - public function dispatch($httpMethod, $uri) { + /** + * @return mixed[] + */ + abstract protected function dispatchVariableRoute($routeData, $uri); + + public function dispatch($httpMethod, $uri) + { if (isset($this->staticRouteMap[$httpMethod][$uri])) { $handler = $this->staticRouteMap[$httpMethod][$uri]; return [self::FOUND, $handler, []]; @@ -73,8 +81,8 @@ public function dispatch($httpMethod, $uri) { // 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]; } + + return [self::NOT_FOUND]; } } diff --git a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Route.php b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Route.php index d71ded18ad24..e1bf7dd97222 100644 --- a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Route.php +++ b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Route.php @@ -2,10 +2,18 @@ namespace FastRoute; -class Route { +class Route +{ + /** @var string */ public $httpMethod; + + /** @var string */ public $regex; + + /** @var array */ public $variables; + + /** @var mixed */ public $handler; /** @@ -16,7 +24,8 @@ class Route { * @param string $regex * @param array $variables */ - public function __construct($httpMethod, $handler, $regex, $variables) { + public function __construct($httpMethod, $handler, $regex, $variables) + { $this->httpMethod = $httpMethod; $this->handler = $handler; $this->regex = $regex; @@ -30,9 +39,9 @@ public function __construct($httpMethod, $handler, $regex, $variables) { * * @return bool */ - public function matches($str) { + public function matches($str) + { $regex = '~^' . $this->regex . '$~'; return (bool) preg_match($regex, $str); } } - diff --git a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/RouteCollector.php b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/RouteCollector.php index 4386bbf3aacc..c1c1762d8d3a 100644 --- a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/RouteCollector.php +++ b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/RouteCollector.php @@ -2,9 +2,16 @@ namespace FastRoute; -class RouteCollector { - private $routeParser; - private $dataGenerator; +class RouteCollector +{ + /** @var RouteParser */ + protected $routeParser; + + /** @var DataGenerator */ + protected $dataGenerator; + + /** @var string */ + protected $currentGroupPrefix; /** * Constructs a route collector. @@ -12,9 +19,11 @@ class RouteCollector { * @param RouteParser $routeParser * @param DataGenerator $dataGenerator */ - public function __construct(RouteParser $routeParser, DataGenerator $dataGenerator) { + public function __construct(RouteParser $routeParser, DataGenerator $dataGenerator) + { $this->routeParser = $routeParser; $this->dataGenerator = $dataGenerator; + $this->currentGroupPrefix = ''; } /** @@ -26,7 +35,9 @@ public function __construct(RouteParser $routeParser, DataGenerator $dataGenerat * @param string $route * @param mixed $handler */ - public function addRoute($httpMethod, $route, $handler) { + public function addRoute($httpMethod, $route, $handler) + { + $route = $this->currentGroupPrefix . $route; $routeDatas = $this->routeParser->parse($route); foreach ((array) $httpMethod as $method) { foreach ($routeDatas as $routeData) { @@ -35,12 +46,107 @@ public function addRoute($httpMethod, $route, $handler) { } } + /** + * Create a route group with a common prefix. + * + * All routes created in the passed callback will have the given group prefix prepended. + * + * @param string $prefix + * @param callable $callback + */ + public function addGroup($prefix, callable $callback) + { + $previousGroupPrefix = $this->currentGroupPrefix; + $this->currentGroupPrefix = $previousGroupPrefix . $prefix; + $callback($this); + $this->currentGroupPrefix = $previousGroupPrefix; + } + + /** + * Adds a GET route to the collection + * + * This is simply an alias of $this->addRoute('GET', $route, $handler) + * + * @param string $route + * @param mixed $handler + */ + public function get($route, $handler) + { + $this->addRoute('GET', $route, $handler); + } + + /** + * Adds a POST route to the collection + * + * This is simply an alias of $this->addRoute('POST', $route, $handler) + * + * @param string $route + * @param mixed $handler + */ + public function post($route, $handler) + { + $this->addRoute('POST', $route, $handler); + } + + /** + * Adds a PUT route to the collection + * + * This is simply an alias of $this->addRoute('PUT', $route, $handler) + * + * @param string $route + * @param mixed $handler + */ + public function put($route, $handler) + { + $this->addRoute('PUT', $route, $handler); + } + + /** + * Adds a DELETE route to the collection + * + * This is simply an alias of $this->addRoute('DELETE', $route, $handler) + * + * @param string $route + * @param mixed $handler + */ + public function delete($route, $handler) + { + $this->addRoute('DELETE', $route, $handler); + } + + /** + * Adds a PATCH route to the collection + * + * This is simply an alias of $this->addRoute('PATCH', $route, $handler) + * + * @param string $route + * @param mixed $handler + */ + public function patch($route, $handler) + { + $this->addRoute('PATCH', $route, $handler); + } + + /** + * Adds a HEAD route to the collection + * + * This is simply an alias of $this->addRoute('HEAD', $route, $handler) + * + * @param string $route + * @param mixed $handler + */ + public function head($route, $handler) + { + $this->addRoute('HEAD', $route, $handler); + } + /** * Returns the collected route data, as provided by the data generator. * * @return array */ - public function getData() { + public function getData() + { return $this->dataGenerator->getData(); } } diff --git a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/RouteParser.php b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/RouteParser.php index c089c3151632..6a7685cfed6c 100644 --- a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/RouteParser.php +++ b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/RouteParser.php @@ -2,7 +2,8 @@ namespace FastRoute; -interface RouteParser { +interface RouteParser +{ /** * Parses a route string into multiple route data arrays. * @@ -29,7 +30,7 @@ interface RouteParser { * 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/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/RouteParser/Std.php b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/RouteParser/Std.php index a6c21bdc613f..4fbdee129836 100644 --- a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/RouteParser/Std.php +++ b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/RouteParser/Std.php @@ -10,7 +10,8 @@ * * "/user/{name}[/{id:[0-9]+}]" */ -class Std implements RouteParser { +class Std implements RouteParser +{ const VARIABLE_REGEX = <<<'REGEX' \{ \s* ([a-zA-Z_][a-zA-Z0-9_-]*) \s* @@ -21,7 +22,8 @@ class Std implements RouteParser { REGEX; const DEFAULT_DISPATCH_REGEX = '[^/]+'; - public function parse($route) { + public function parse($route) + { $routeWithoutClosingOptionals = rtrim($route, ']'); $numOptionals = strlen($route) - strlen($routeWithoutClosingOptionals); @@ -30,7 +32,7 @@ public function parse($route) { 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('Optional segments can only occur at the end of a route'); } throw new BadRouteException("Number of opening '[' and closing ']' does not match"); } @@ -39,7 +41,7 @@ public function parse($route) { $routeDatas = []; foreach ($segments as $n => $segment) { if ($segment === '' && $n !== 0) { - throw new BadRouteException("Empty optional part"); + throw new BadRouteException('Empty optional part'); } $currentRoute .= $segment; @@ -50,8 +52,12 @@ public function parse($route) { /** * Parses a route string that does not contain optional segments. + * + * @param string + * @return mixed[] */ - private function parsePlaceholders($route) { + private function parsePlaceholders($route) + { if (!preg_match_all( '~' . self::VARIABLE_REGEX . '~x', $route, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER @@ -72,7 +78,7 @@ private function parsePlaceholders($route) { $offset = $set[0][1] + strlen($set[0][0]); } - if ($offset != strlen($route)) { + if ($offset !== strlen($route)) { $routeData[] = substr($route, $offset); } diff --git a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/bootstrap.php b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/bootstrap.php index add216c7d01f..0bce3a42071f 100644 --- a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/bootstrap.php +++ b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/bootstrap.php @@ -4,7 +4,7 @@ require __DIR__ . '/functions.php'; -spl_autoload_register(function($class) { +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/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/functions.php b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/functions.php index 3af67797b0b2..876a5d965c75 100644 --- a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/functions.php +++ b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/functions.php @@ -9,7 +9,8 @@ * * @return Dispatcher */ - function simpleDispatcher(callable $routeDefinitionCallback, array $options = []) { + function simpleDispatcher(callable $routeDefinitionCallback, array $options = []) + { $options += [ 'routeParser' => 'FastRoute\\RouteParser\\Std', 'dataGenerator' => 'FastRoute\\DataGenerator\\GroupCountBased', @@ -32,7 +33,8 @@ function simpleDispatcher(callable $routeDefinitionCallback, array $options = [] * * @return Dispatcher */ - function cachedDispatcher(callable $routeDefinitionCallback, array $options = []) { + function cachedDispatcher(callable $routeDefinitionCallback, array $options = []) + { $options += [ 'routeParser' => 'FastRoute\\RouteParser\\Std', 'dataGenerator' => 'FastRoute\\DataGenerator\\GroupCountBased', @@ -60,10 +62,12 @@ function cachedDispatcher(callable $routeDefinitionCallback, array $options = [] /** @var RouteCollector $routeCollector */ $dispatchData = $routeCollector->getData(); - file_put_contents( - $options['cacheFile'], - ' $this->getDataGeneratorClass(), 'dispatcher' => $this->getDispatcherClass() @@ -29,7 +31,8 @@ private function generateDispatcherOptions() { /** * @dataProvider provideFoundDispatchCases */ - public function testFoundDispatches($method, $uri, $callback, $handler, $argDict) { + 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]); @@ -40,11 +43,12 @@ public function testFoundDispatches($method, $uri, $callback, $handler, $argDict /** * @dataProvider provideNotFoundDispatchCases */ - public function testNotFoundDispatches($method, $uri, $callback) { + 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->assertArrayNotHasKey(1, $routeInfo, + 'NOT_FOUND result must only contain a single element in the returned info array' ); $this->assertSame($dispatcher::NOT_FOUND, $routeInfo[0]); } @@ -52,11 +56,12 @@ public function testNotFoundDispatches($method, $uri, $callback) { /** * @dataProvider provideMethodNotAllowedDispatchCases */ - public function testMethodNotAllowedDispatches($method, $uri, $callback, $availableMethods) { + 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" + $this->assertArrayHasKey(1, $routeInfo, + 'METHOD_NOT_ALLOWED result must return an array of allowed methods at index 1' ); list($routedStatus, $methodArray) = $dispatcher->dispatch($method, $uri); @@ -68,8 +73,9 @@ public function testMethodNotAllowedDispatches($method, $uri, $callback, $availa * @expectedException \FastRoute\BadRouteException * @expectedExceptionMessage Cannot use the same placeholder "test" twice */ - public function testDuplicateVariableNameError() { - \FastRoute\simpleDispatcher(function(RouteCollector $r) { + public function testDuplicateVariableNameError() + { + \FastRoute\simpleDispatcher(function (RouteCollector $r) { $r->addRoute('GET', '/foo/{test}/{test:\d+}', 'handler0'); }, $this->generateDispatcherOptions()); } @@ -78,8 +84,9 @@ public function testDuplicateVariableNameError() { * @expectedException \FastRoute\BadRouteException * @expectedExceptionMessage Cannot register two routes matching "/user/([^/]+)" for method "GET" */ - public function testDuplicateVariableRoute() { - \FastRoute\simpleDispatcher(function(RouteCollector $r) { + 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()); @@ -89,8 +96,9 @@ public function testDuplicateVariableRoute() { * @expectedException \FastRoute\BadRouteException * @expectedExceptionMessage Cannot register two routes matching "/user" for method "GET" */ - public function testDuplicateStaticRoute() { - \FastRoute\simpleDispatcher(function(RouteCollector $r) { + public function testDuplicateStaticRoute() + { + \FastRoute\simpleDispatcher(function (RouteCollector $r) { $r->addRoute('GET', '/user', 'handler0'); $r->addRoute('GET', '/user', 'handler1'); }, $this->generateDispatcherOptions()); @@ -100,8 +108,9 @@ public function testDuplicateStaticRoute() { * @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) { + public function testShadowedStaticRoute() + { + \FastRoute\simpleDispatcher(function (RouteCollector $r) { $r->addRoute('GET', '/user/{name}', 'handler0'); $r->addRoute('GET', '/user/nikic', 'handler1'); }, $this->generateDispatcherOptions()); @@ -111,18 +120,20 @@ public function testShadowedStaticRoute() { * @expectedException \FastRoute\BadRouteException * @expectedExceptionMessage Regex "(en|de)" for parameter "lang" contains a capturing group */ - public function testCapturing() { - \FastRoute\simpleDispatcher(function(RouteCollector $r) { + public function testCapturing() + { + \FastRoute\simpleDispatcher(function (RouteCollector $r) { $r->addRoute('GET', '/{lang:(en|de)}', 'handler0'); }, $this->generateDispatcherOptions()); } - public function provideFoundDispatchCases() { + public function provideFoundDispatchCases() + { $cases = []; // 0 --------------------------------------------------------------------------------------> - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('GET', '/resource/123/456', 'handler0'); }; @@ -135,7 +146,7 @@ public function provideFoundDispatchCases() { // 1 --------------------------------------------------------------------------------------> - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('GET', '/handler0', 'handler0'); $r->addRoute('GET', '/handler1', 'handler1'); $r->addRoute('GET', '/handler2', 'handler2'); @@ -150,7 +161,7 @@ public function provideFoundDispatchCases() { // 2 --------------------------------------------------------------------------------------> - $callback = function(RouteCollector $r) { + $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'); @@ -198,11 +209,10 @@ public function provideFoundDispatchCases() { // 6 --------------------------------------------------------------------------------------> - $callback = function(RouteCollector $r) { + $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'; @@ -214,7 +224,7 @@ public function provideFoundDispatchCases() { // 7 ----- Test GET method fallback on HEAD route miss ------------------------------------> - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('GET', '/user/{name}', 'handler0'); $r->addRoute('GET', '/user/{name}/{id:[0-9]+}', 'handler1'); $r->addRoute('GET', '/static0', 'handler2'); @@ -264,7 +274,7 @@ public function provideFoundDispatchCases() { // 11 ---- More specified routes are not shadowed by less specific of another method ------> - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('GET', '/user/{name}', 'handler0'); $r->addRoute('POST', '/user/{name:[a-z]+}', 'handler1'); }; @@ -278,7 +288,7 @@ public function provideFoundDispatchCases() { // 12 ---- Handler of more specific routes is used, if it occurs first --------------------> - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('GET', '/user/{name}', 'handler0'); $r->addRoute('POST', '/user/{name:[a-z]+}', 'handler1'); $r->addRoute('POST', '/user/{name}', 'handler2'); @@ -293,7 +303,7 @@ public function provideFoundDispatchCases() { // 13 ---- Route with constant suffix -----------------------------------------------------> - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('GET', '/user/{name}', 'handler0'); $r->addRoute('GET', '/user/{name}/edit', 'handler1'); }; @@ -307,7 +317,7 @@ public function provideFoundDispatchCases() { // 14 ---- Handle multiple methods with the same handler ----------------------------------> - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute(['GET', 'POST'], '/user', 'handlerGetPost'); $r->addRoute(['DELETE'], '/user', 'handlerDelete'); $r->addRoute([], '/user', 'handlerNone'); @@ -318,53 +328,53 @@ public function provideFoundDispatchCases() { $cases[] = ['POST', '/user', $callback, 'handlerGetPost', $argDict]; $cases[] = ['DELETE', '/user', $callback, 'handlerDelete', $argDict]; - // 15 ---- + // 17 ---- - $callback = function(RouteCollector $r) { + $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 ---- + // 18 ---- - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('GET', '', 'handler0'); }; $cases[] = ['GET', '', $callback, 'handler0', []]; - // 17 ---- + // 19 ---- - $callback = function(RouteCollector $r) { + $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 ---- + // 20 ---- - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('HEAD', '/a', 'handler0'); $r->addRoute('GET', '/b', 'handler1'); }; $cases[] = ['HEAD', '/b', $callback, 'handler1', []]; - // 19 ---- + // 21 ---- - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('GET', '/foo', 'handler0'); $r->addRoute('HEAD', '/{bar}', 'handler1'); }; $cases[] = ['HEAD', '/foo', $callback, 'handler1', ['bar' => 'foo']]; - // 20 ---- + // 22 ---- - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('*', '/user', 'handler0'); $r->addRoute('*', '/{user}', 'handler1'); $r->addRoute('GET', '/user', 'handler2'); @@ -372,39 +382,49 @@ public function provideFoundDispatchCases() { $cases[] = ['GET', '/user', $callback, 'handler2', []]; - // 21 ---- + // 23 ---- - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('*', '/user', 'handler0'); $r->addRoute('GET', '/user', 'handler1'); }; $cases[] = ['POST', '/user', $callback, 'handler0', []]; - // 22 ---- + // 24 ---- $cases[] = ['HEAD', '/user', $callback, 'handler1', []]; - // 23 ---- + // 25 ---- - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('GET', '/{bar}', 'handler0'); $r->addRoute('*', '/foo', 'handler1'); }; $cases[] = ['GET', '/foo', $callback, 'handler0', ['bar' => 'foo']]; + // 26 ---- + + $callback = function(RouteCollector $r) { + $r->addRoute('GET', '/user', 'handler0'); + $r->addRoute('*', '/{foo:.*}', 'handler1'); + }; + + $cases[] = ['POST', '/bar', $callback, 'handler1', ['foo' => 'bar']]; + // x --------------------------------------------------------------------------------------> return $cases; } - public function provideNotFoundDispatchCases() { + public function provideNotFoundDispatchCases() + { $cases = []; // 0 --------------------------------------------------------------------------------------> - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('GET', '/resource/123/456', 'handler0'); }; @@ -431,7 +451,7 @@ public function provideNotFoundDispatchCases() { // 3 --------------------------------------------------------------------------------------> - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('GET', '/handler0', 'handler0'); $r->addRoute('GET', '/handler1', 'handler1'); $r->addRoute('GET', '/handler2', 'handler2'); @@ -444,7 +464,7 @@ public function provideNotFoundDispatchCases() { // 4 --------------------------------------------------------------------------------------> - $callback = function(RouteCollector $r) { + $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'); @@ -468,19 +488,20 @@ public function provideNotFoundDispatchCases() { // reuse callback from #5 $method = 'HEAD'; - $cases[] = array($method, $uri, $callback); + $cases[] = [$method, $uri, $callback]; // x --------------------------------------------------------------------------------------> return $cases; } - public function provideMethodNotAllowedDispatchCases() { + public function provideMethodNotAllowedDispatchCases() + { $cases = []; // 0 --------------------------------------------------------------------------------------> - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('GET', '/resource/123/456', 'handler0'); }; @@ -492,7 +513,7 @@ public function provideMethodNotAllowedDispatchCases() { // 1 --------------------------------------------------------------------------------------> - $callback = function(RouteCollector $r) { + $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'); @@ -507,7 +528,7 @@ public function provideMethodNotAllowedDispatchCases() { // 2 --------------------------------------------------------------------------------------> - $callback = function(RouteCollector $r) { + $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'); @@ -522,7 +543,7 @@ public function provideMethodNotAllowedDispatchCases() { // 3 --------------------------------------------------------------------------------------> - $callback = function(RouteCollector $r) { + $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'); @@ -536,7 +557,7 @@ public function provideMethodNotAllowedDispatchCases() { // 4 --------------------------------------------------------------------------------------> - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute(['GET', 'POST'], '/user', 'handlerGetPost'); $r->addRoute(['DELETE'], '/user', 'handlerDelete'); $r->addRoute([], '/user', 'handlerNone'); @@ -546,7 +567,7 @@ public function provideMethodNotAllowedDispatchCases() { // 5 - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('POST', '/user.json', 'handler0'); $r->addRoute('GET', '/{entity}.json', 'handler1'); }; @@ -557,5 +578,4 @@ public function provideMethodNotAllowedDispatchCases() { return $cases; } - } diff --git a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/Dispatcher/GroupCountBasedTest.php b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/Dispatcher/GroupCountBasedTest.php index 74820fcaf989..f821ef56b93f 100644 --- a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/Dispatcher/GroupCountBasedTest.php +++ b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/Dispatcher/GroupCountBasedTest.php @@ -2,12 +2,15 @@ namespace FastRoute\Dispatcher; -class GroupCountBasedTest extends DispatcherTest { - protected function getDispatcherClass() { +class GroupCountBasedTest extends DispatcherTest +{ + protected function getDispatcherClass() + { return 'FastRoute\\Dispatcher\\GroupCountBased'; } - protected function getDataGeneratorClass() { + protected function getDataGeneratorClass() + { return 'FastRoute\\DataGenerator\\GroupCountBased'; } } diff --git a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/Dispatcher/GroupPosBasedTest.php b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/Dispatcher/GroupPosBasedTest.php index c3d4f8dbec36..b5c9567de805 100644 --- a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/Dispatcher/GroupPosBasedTest.php +++ b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/Dispatcher/GroupPosBasedTest.php @@ -2,12 +2,15 @@ namespace FastRoute\Dispatcher; -class GroupPosBasedTest extends DispatcherTest { - protected function getDispatcherClass() { +class GroupPosBasedTest extends DispatcherTest +{ + protected function getDispatcherClass() + { return 'FastRoute\\Dispatcher\\GroupPosBased'; } - protected function getDataGeneratorClass() { + protected function getDataGeneratorClass() + { return 'FastRoute\\DataGenerator\\GroupPosBased'; } } diff --git a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/Dispatcher/MarkBasedTest.php b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/Dispatcher/MarkBasedTest.php index 04b0af9bf86b..b3b27dd2fb11 100644 --- a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/Dispatcher/MarkBasedTest.php +++ b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/Dispatcher/MarkBasedTest.php @@ -2,19 +2,23 @@ namespace FastRoute\Dispatcher; -class MarkBasedTest extends DispatcherTest { - public function setUp() { +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() { + protected function getDispatcherClass() + { return 'FastRoute\\Dispatcher\\MarkBased'; } - protected function getDataGeneratorClass() { + protected function getDataGeneratorClass() + { return 'FastRoute\\DataGenerator\\MarkBased'; } } diff --git a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/HackTypechecker/HackTypecheckerTest.php b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/HackTypechecker/HackTypecheckerTest.php index 7bc6ebb310de..b6fc53f7702a 100644 --- a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/HackTypechecker/HackTypecheckerTest.php +++ b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/HackTypechecker/HackTypecheckerTest.php @@ -2,11 +2,16 @@ namespace FastRoute; -class HackTypecheckerTest extends \PhpUnit_Framework_TestCase { +use PHPUnit\Framework\TestCase; + +class HackTypecheckerTest extends TestCase +{ const SERVER_ALREADY_RUNNING_CODE = 77; - public function testTypechecks($recurse = true) { + + public function testTypechecks($recurse = true) + { if (!defined('HHVM_VERSION')) { - $this->markTestSkipped("HHVM only"); + $this->markTestSkipped('HHVM only'); } if (!version_compare(HHVM_VERSION, '3.9.0', '>=')) { $this->markTestSkipped('classname requires HHVM 3.9+'); @@ -15,17 +20,17 @@ public function testTypechecks($recurse = true) { // The typechecker recurses the whole tree, so it makes sure // that everything in fixtures/ is valid when this runs. - $output = array(); + $output = []; $exit_code = null; exec( - 'hh_server --check '.escapeshellarg(__DIR__.'/../../').' 2>&1', + '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" + 'Typechecker still running after running hh_client stop' ); // Server already running - 3.10 => 3.11 regression: // https://github.com/facebook/hhvm/issues/6646 diff --git a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/RouteParser/StdTest.php b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/RouteParser/StdTest.php index 41f194ba8b61..e13e4de61718 100644 --- a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/RouteParser/StdTest.php +++ b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/RouteParser/StdTest.php @@ -2,22 +2,28 @@ namespace FastRoute\RouteParser; -class StdTest extends \PhpUnit_Framework_TestCase { +use PHPUnit\Framework\TestCase; + +class StdTest extends TestCase +{ /** @dataProvider provideTestParse */ - public function testParse($routeString, $expectedRouteDatas) { + public function testParse($routeString, $expectedRouteDatas) + { $parser = new Std(); $routeDatas = $parser->parse($routeString); $this->assertSame($expectedRouteDatas, $routeDatas); } /** @dataProvider provideTestParseError */ - public function testParseError($routeString, $expectedExceptionMessage) { + public function testParseError($routeString, $expectedExceptionMessage) + { $parser = new Std(); $this->setExpectedException('FastRoute\\BadRouteException', $expectedExceptionMessage); $parser->parse($routeString); } - public function provideTestParse() { + public function provideTestParse() + { return [ [ '/test', @@ -112,7 +118,8 @@ public function provideTestParse() { ]; } - public function provideTestParseError() { + public function provideTestParseError() + { return [ [ '/test[opt', @@ -128,19 +135,19 @@ public function provideTestParseError() { ], [ '/test[]', - "Empty optional part" + 'Empty optional part' ], [ '/test[[opt]]', - "Empty optional part" + 'Empty optional part' ], [ '[[test]]', - "Empty optional part" + 'Empty optional part' ], [ '/test[/opt]/required', - "Optional segments can only occur at the end of a route" + 'Optional segments can only occur at the end of a route' ], ]; } diff --git a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/bootstrap.php b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/bootstrap.php index 27e6d4c8fbdc..3023f41e4659 100644 --- a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/bootstrap.php +++ b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/bootstrap.php @@ -2,7 +2,7 @@ require_once __DIR__ . '/../src/functions.php'; -spl_autoload_register(function($class) { +spl_autoload_register(function ($class) { if (strpos($class, 'FastRoute\\') === 0) { $dir = strcasecmp(substr($class, -4), 'Test') ? 'src/' : 'test/'; $name = substr($class, strlen('FastRoute')); diff --git a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/.travis.yml b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/.travis.yml index 5f8bb7c9f3b7..196f7fc19004 100644 --- a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/.travis.yml +++ b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/.travis.yml @@ -12,21 +12,29 @@ php: - 5.4 - 5.5 - 5.6 - - hhvm + - 7.0 + - 7.1 before_script: - composer self-update - - COMPOSER_ROOT_VERSION=dev-master composer dump-autoload + - COMPOSER_ROOT_VERSION=dev-master composer install - 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 + - if [ "$PIMPLE_EXT" == "yes" ]; then export SYMFONY_DEPRECATIONS_HELPER=weak; fi - cd ../.. - - phpunit + - ./vendor/bin/simple-phpunit matrix: - exclude: + include: - php: hhvm + dist: trusty + env: PIMPLE_EXT=no + exclude: + - php: 7.0 + env: PIMPLE_EXT=yes + - php: 7.1 env: PIMPLE_EXT=yes diff --git a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/CHANGELOG b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/CHANGELOG index cc679972ec76..ba56760c1f59 100644 --- a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/CHANGELOG +++ b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/CHANGELOG @@ -1,3 +1,27 @@ +* 3.2.3 (2017-XX-XX) + + * n/a + +* 3.2.2 (2017-07-23) + + * reverted extending a protected closure throws an exception (deprecated it instead) + +* 3.2.1 (2017-07-17) + + * fixed PHP error + +* 3.2.0 (2017-07-17) + + * added a PSR-11 service locator + * added a PSR-11 wrapper + * added ServiceIterator + * fixed extending a protected closure (now throws InvalidServiceIdentifierException) + +* 3.1.0 (2017-07-03) + + * deprecated the C extension + * added support for PSR-11 exceptions + * 3.0.2 (2015-09-11) * refactored the C extension diff --git a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/LICENSE b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/LICENSE index d7949e2fb35e..e02dc5a78dfa 100644 --- a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/LICENSE +++ b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2009-2015 Fabien Potencier +Copyright (c) 2009-2017 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 diff --git a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/README.rst b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/README.rst index 93fb35a89b76..a03b6d3a4992 100644 --- a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/README.rst +++ b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/README.rst @@ -17,18 +17,7 @@ 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 + $ ./composer.phar require pimple/pimple "^3.0" Usage ----- @@ -119,7 +108,7 @@ If you change the ``session_storage`` service definition like below: }; You can now easily change the cookie name by overriding the -``session_storage_class`` parameter instead of redefining the service +``cookie_name`` parameter instead of redefining the service definition. Protecting Parameters @@ -198,4 +187,140 @@ raw access to this function, you can use the ``raw()`` method: $sessionFunction = $container->raw('session'); +PSR-11 compatibility +-------------------- + +For historical reasons, the ``Container`` class does not implement the PSR-11 +``ContainerInterface``. However, Pimple provides a helper class that will let +you decouple your code from the Pimple container class. + +The PSR-11 container class +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The ``Pimple\Psr11\Container`` class lets you access the content of an +underlying Pimple container using ``Psr\Container\ContainerInterface`` +methods: + +.. code-block:: php + + use Pimple\Container; + use Pimple\Psr11\Container as PsrContainer; + + $container = new Container(); + $container['service'] = function ($c) { + return new Service(); + }; + $psr11 = new PsrContainer($container); + + $controller = function (PsrContainer $container) { + $service = $container->get('service'); + }; + $controller($psr11); + +Using the PSR-11 ServiceLocator +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Sometimes, a service needs access to several other services without being sure +that all of them will actually be used. In those cases, you may want the +instantiation of the services to be lazy. + +The traditional solution is to inject the entire service container to get only +the services really needed. However, this is not recommended because it gives +services a too broad access to the rest of the application and it hides their +actual dependencies. + +The ``ServiceLocator`` is intended to solve this problem by giving access to a +set of predefined services while instantiating them only when actually needed. + +It also allows you to make your services available under a different name than +the one used to register them. For instance, you may want to use an object +that expects an instance of ``EventDispatcherInterface`` to be available under +the name ``event_dispatcher`` while your event dispatcher has been +registered under the name ``dispatcher``: + +.. code-block:: php + + use Monolog\Logger; + use Pimple\Psr11\ServiceLocator; + use Psr\Container\ContainerInterface; + use Symfony\Component\EventDispatcher\EventDispatcher; + + class MyService + { + /** + * "logger" must be an instance of Psr\Log\LoggerInterface + * "event_dispatcher" must be an instance of Symfony\Component\EventDispatcher\EventDispatcherInterface + */ + private $services; + + public function __construct(ContainerInterface $services) + { + $this->services = $services; + } + } + + $container['logger'] = function ($c) { + return new Monolog\Logger(); + }; + $container['dispatcher'] = function () { + return new EventDispatcher(); + }; + + $container['service'] = function ($c) { + $locator = new ServiceLocator($c, array('logger', 'event_dispatcher' => 'dispatcher')); + + return new MyService($locator); + }; + +Referencing a Collection of Services Lazily +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Passing a collection of services instances in an array may prove inefficient +if the class that consumes the collection only needs to iterate over it at a +later stage, when one of its method is called. It can also lead to problems +if there is a circular dependency between one of the services stored in the +collection and the class that consumes it. + +The ``ServiceIterator`` class helps you solve these issues. It receives a +list of service names during instantiation and will retrieve the services +when iterated over: + +.. code-block:: php + + use Pimple\Container; + use Pimple\ServiceIterator; + + class AuthorizationService + { + private $voters; + + public function __construct($voters) + { + $this->voters = $voters; + } + + public function canAccess($resource) + { + foreach ($this->voters as $voter) { + if (true === $voter->canAccess($resource) { + return true; + } + } + + return false; + } + } + + $container = new Container(); + + $container['voter1'] = function ($c) { + return new SomeVoter(); + } + $container['voter2'] = function ($c) { + return new SomeOtherVoter($c['auth']); + } + $container['auth'] = function ($c) { + return new AuthorizationService(new ServiceIterator($c, array('voter1', 'voter2')); + } + .. _Pimple 1.x documentation: https://github.com/silexphp/Pimple/tree/1.1 diff --git a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/composer.json b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/composer.json index a5268f161185..dabf190a9ade 100644 --- a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/composer.json +++ b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/composer.json @@ -12,14 +12,18 @@ } ], "require": { - "php": ">=5.3.0" + "php": ">=5.3.0", + "psr/container": "^1.0" + }, + "require-dev": { + "symfony/phpunit-bridge": "^3.2" }, "autoload": { "psr-0": { "Pimple": "src/" } }, "extra": { "branch-alias": { - "dev-master": "3.0.x-dev" + "dev-master": "3.2.x-dev" } } } diff --git a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/config.m4 b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/config.m4 index c9ba17ddbd58..3a6e9aaeb158 100644 --- a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/config.m4 +++ b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/config.m4 @@ -45,7 +45,7 @@ if test "$PHP_PIMPLE" != "no"; then 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 LIBSYMBOL=pimple # you most likely want to change this dnl PHP_CHECK_LIBRARY($LIBNAME,$LIBSYMBOL, dnl [ diff --git a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/php_pimple.h b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/php_pimple.h index 49431f08a846..eed7c1731d48 100644 --- a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/php_pimple.h +++ b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/php_pimple.h @@ -41,17 +41,31 @@ extern zend_module_entry pimple_module_entry; #include "TSRM.h" #endif -#define PIMPLE_VERSION "3.0.2" +#define PIMPLE_VERSION "3.2.3-DEV" + #define PIMPLE_NS "Pimple" +#define PSR_CONTAINER_NS "Psr\\Container" +#define PIMPLE_EXCEPTION_NS "Pimple\\Exception" #define PIMPLE_DEFAULT_ZVAL_CACHE_NUM 5 #define PIMPLE_DEFAULT_ZVAL_VALUES_NUM 10 +#define PIMPLE_DEPRECATE do { \ + int er = EG(error_reporting); \ + EG(error_reporting) = 0;\ + php_error(E_DEPRECATED, "The Pimple C extension is deprecated since version 3.1 and will be removed in 4.0."); \ + EG(error_reporting) = er; \ +} while (0); + zend_module_entry *get_module(void); PHP_MINIT_FUNCTION(pimple); PHP_MINFO_FUNCTION(pimple); +PHP_METHOD(FrozenServiceException, __construct); +PHP_METHOD(InvalidServiceIdentifierException, __construct); +PHP_METHOD(UnknownIdentifierException, __construct); + PHP_METHOD(Pimple, __construct); PHP_METHOD(Pimple, factory); PHP_METHOD(Pimple, protect); @@ -93,6 +107,8 @@ typedef struct _pimple_closure_object { static const char sensiolabs_logo[] = ""; +static void pimple_exception_call_parent_constructor(zval *this_ptr, const char *format, const char *arg1 TSRMLS_DC); + 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); diff --git a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/pimple.c b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/pimple.c index 821365bf1277..c80499b39956 100644 --- a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/pimple.c +++ b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/pimple.c @@ -40,6 +40,15 @@ #include "main/php_output.h" #include "SAPI.h" +static zend_class_entry *pimple_ce_PsrContainerInterface; +static zend_class_entry *pimple_ce_PsrContainerExceptionInterface; +static zend_class_entry *pimple_ce_PsrNotFoundExceptionInterface; + +static zend_class_entry *pimple_ce_ExpectedInvokableException; +static zend_class_entry *pimple_ce_FrozenServiceException; +static zend_class_entry *pimple_ce_InvalidServiceIdentifierException; +static zend_class_entry *pimple_ce_UnknownIdentifierException; + static zend_class_entry *pimple_ce; static zend_object_handlers pimple_object_handlers; static zend_class_entry *pimple_closure_ce; @@ -92,6 +101,63 @@ static zend_internal_function pimple_closure_invoker_function; } \ } while(0); + +/* Psr\Container\ContainerInterface */ +ZEND_BEGIN_ARG_INFO_EX(arginfo_pimple_PsrContainerInterface_get, 0, 0, 1) +ZEND_ARG_INFO(0, id) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_pimple_PsrContainerInterface_has, 0, 0, 1) +ZEND_ARG_INFO(0, id) +ZEND_END_ARG_INFO() + +static const zend_function_entry pimple_ce_PsrContainerInterface_functions[] = { + PHP_ABSTRACT_ME(ContainerInterface, get, arginfo_pimple_PsrContainerInterface_get) + PHP_ABSTRACT_ME(ContainerInterface, has, arginfo_pimple_PsrContainerInterface_has) + PHP_FE_END +}; + +/* Psr\Container\ContainerExceptionInterface */ +static const zend_function_entry pimple_ce_PsrContainerExceptionInterface_functions[] = { + PHP_FE_END +}; + +/* Psr\Container\NotFoundExceptionInterface */ +static const zend_function_entry pimple_ce_PsrNotFoundExceptionInterface_functions[] = { + PHP_FE_END +}; + +/* Pimple\Exception\FrozenServiceException */ +ZEND_BEGIN_ARG_INFO_EX(arginfo_FrozenServiceException___construct, 0, 0, 1) +ZEND_ARG_INFO(0, id) +ZEND_END_ARG_INFO() + +static const zend_function_entry pimple_ce_FrozenServiceException_functions[] = { + PHP_ME(FrozenServiceException, __construct, arginfo_FrozenServiceException___construct, ZEND_ACC_PUBLIC) + PHP_FE_END +}; + +/* Pimple\Exception\InvalidServiceIdentifierException */ +ZEND_BEGIN_ARG_INFO_EX(arginfo_InvalidServiceIdentifierException___construct, 0, 0, 1) +ZEND_ARG_INFO(0, id) +ZEND_END_ARG_INFO() + +static const zend_function_entry pimple_ce_InvalidServiceIdentifierException_functions[] = { + PHP_ME(InvalidServiceIdentifierException, __construct, arginfo_InvalidServiceIdentifierException___construct, ZEND_ACC_PUBLIC) + PHP_FE_END +}; + +/* Pimple\Exception\UnknownIdentifierException */ +ZEND_BEGIN_ARG_INFO_EX(arginfo_UnknownIdentifierException___construct, 0, 0, 1) +ZEND_ARG_INFO(0, id) +ZEND_END_ARG_INFO() + +static const zend_function_entry pimple_ce_UnknownIdentifierException_functions[] = { + PHP_ME(UnknownIdentifierException, __construct, arginfo_UnknownIdentifierException___construct, ZEND_ACC_PUBLIC) + PHP_FE_END +}; + +/* Pimple\Container */ ZEND_BEGIN_ARG_INFO_EX(arginfo___construct, 0, 0, 0) ZEND_ARG_ARRAY_INFO(0, value, 0) ZEND_END_ARG_INFO() @@ -138,10 +204,6 @@ 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) @@ -158,11 +220,54 @@ static const zend_function_entry pimple_ce_functions[] = { PHP_FE_END }; +/* Pimple\ServiceProviderInterface */ +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_serviceprovider_iface_ce_functions[] = { PHP_ABSTRACT_ME(ServiceProviderInterface, register, arginfo_serviceprovider_register) PHP_FE_END }; +/* parent::__construct(sprintf("Something with %s", $arg1)) */ +static void pimple_exception_call_parent_constructor(zval *this_ptr, const char *format, const char *arg1 TSRMLS_DC) +{ + zend_class_entry *ce = Z_OBJCE_P(this_ptr); + char *message = NULL; + int message_len; + zval *constructor_arg; + + message_len = spprintf(&message, 0, format, arg1); + ALLOC_INIT_ZVAL(constructor_arg); + ZVAL_STRINGL(constructor_arg, message, message_len, 1); + + zend_call_method_with_1_params(&this_ptr, ce, &ce->parent->constructor, "__construct", NULL, constructor_arg); + + efree(message); + zval_ptr_dtor(&constructor_arg); +} + +/** + * Pass a single string parameter to exception constructor and throw + */ +static void pimple_throw_exception_string(zend_class_entry *ce, const char *message, zend_uint message_len TSRMLS_DC) +{ + zval *exception, *param; + + ALLOC_INIT_ZVAL(exception); + object_init_ex(exception, ce); + + ALLOC_INIT_ZVAL(param); + ZVAL_STRINGL(param, message, message_len, 1); + + zend_call_method_with_1_params(&exception, ce, &ce->constructor, "__construct", NULL, param); + + zend_throw_exception_object(exception TSRMLS_CC); + + zval_ptr_dtor(¶m); +} + static void pimple_closure_free_object_storage(pimple_closure_object *obj TSRMLS_DC) { zend_object_std_dtor(&obj->zobj TSRMLS_CC); @@ -264,7 +369,7 @@ static void pimple_object_write_dimension(zval *object, zval *offset, zval *valu 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)); + pimple_throw_exception_string(pimple_ce_FrozenServiceException, Z_STRVAL_P(offset), Z_STRLEN_P(offset) TSRMLS_CC); 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) { @@ -284,7 +389,8 @@ static void pimple_object_write_dimension(zval *object, zval *offset, zval *valu 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); + convert_to_string(offset); + pimple_throw_exception_string(pimple_ce_FrozenServiceException, Z_STRVAL_P(offset), Z_STRLEN_P(offset) TSRMLS_CC); return; } if (zend_hash_index_update(&pimple_obj->values, index, (void *)&pimple_value, sizeof(pimple_bucket_value), NULL) == FAILURE) { @@ -385,7 +491,8 @@ static zval *pimple_object_read_dimension(zval *object, zval *offset, int type T 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)); + pimple_throw_exception_string(pimple_ce_UnknownIdentifierException, Z_STRVAL_P(offset), Z_STRLEN_P(offset) TSRMLS_CC); + return EG(uninitialized_zval_ptr); } break; @@ -482,6 +589,39 @@ static void pimple_bucket_dtor(pimple_bucket_value *bucket) pimple_free_bucket(bucket); } +PHP_METHOD(FrozenServiceException, __construct) +{ + char *id = NULL; + int id_len; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &id, &id_len) == FAILURE) { + return; + } + pimple_exception_call_parent_constructor(getThis(), "Cannot override frozen service \"%s\".", id TSRMLS_CC); +} + +PHP_METHOD(InvalidServiceIdentifierException, __construct) +{ + char *id = NULL; + int id_len; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &id, &id_len) == FAILURE) { + return; + } + pimple_exception_call_parent_constructor(getThis(), "Identifier \"%s\" does not contain an object definition.", id TSRMLS_CC); +} + +PHP_METHOD(UnknownIdentifierException, __construct) +{ + char *id = NULL; + int id_len; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &id, &id_len) == FAILURE) { + return; + } + pimple_exception_call_parent_constructor(getThis(), "Identifier \"%s\" is not defined.", id TSRMLS_CC); +} + PHP_METHOD(Pimple, protect) { zval *protected = NULL; @@ -494,7 +634,7 @@ PHP_METHOD(Pimple, protect) 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); + zend_throw_exception(pimple_ce_ExpectedInvokableException, "Callable is not a Closure or invokable object.", 0 TSRMLS_CC); return; } @@ -526,7 +666,7 @@ PHP_METHOD(Pimple, raw) 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)); + pimple_throw_exception_string(pimple_ce_UnknownIdentifierException, Z_STRVAL_P(offset), Z_STRLEN_P(offset) TSRMLS_CC); RETURN_NULL(); } break; @@ -571,13 +711,20 @@ PHP_METHOD(Pimple, extend) 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)); + pimple_throw_exception_string(pimple_ce_UnknownIdentifierException, Z_STRVAL_P(offset), Z_STRLEN_P(offset) TSRMLS_CC); 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)); + pimple_throw_exception_string(pimple_ce_InvalidServiceIdentifierException, Z_STRVAL_P(offset), Z_STRLEN_P(offset) TSRMLS_CC); RETURN_NULL(); } + if (zend_hash_index_exists(&pobj->protected, value->handle_num)) { + int er = EG(error_reporting); + EG(error_reporting) = 0; + php_error(E_DEPRECATED, "How Pimple behaves when extending protected closures will be fixed in Pimple 4. Are you sure \"%s\" should be protected?", Z_STRVAL_P(offset)); + EG(error_reporting) = er; + } break; case IS_DOUBLE: case IS_BOOL: @@ -588,13 +735,21 @@ PHP_METHOD(Pimple, extend) 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); + convert_to_string(offset); + pimple_throw_exception_string(pimple_ce_UnknownIdentifierException, Z_STRVAL_P(offset), Z_STRLEN_P(offset) TSRMLS_CC); 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); + convert_to_string(offset); + pimple_throw_exception_string(pimple_ce_InvalidServiceIdentifierException, Z_STRVAL_P(offset), Z_STRLEN_P(offset) TSRMLS_CC); RETURN_NULL(); } + if (zend_hash_index_exists(&pobj->protected, value->handle_num)) { + int er = EG(error_reporting); + EG(error_reporting) = 0; + php_error(E_DEPRECATED, "How Pimple behaves when extending protected closures will be fixed in Pimple 4. Are you sure \"%ld\" should be protected?", index); + EG(error_reporting) = er; + } break; case IS_NULL: default: @@ -603,7 +758,7 @@ PHP_METHOD(Pimple, extend) 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); + zend_throw_exception(pimple_ce_ExpectedInvokableException, "Extension service definition is not a Closure or invokable object.", 0 TSRMLS_CC); RETURN_NULL(); } pimple_free_bucket(&bucket); @@ -676,7 +831,7 @@ PHP_METHOD(Pimple, factory) 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); + zend_throw_exception(pimple_ce_ExpectedInvokableException, "Service definition is not a Closure or invokable object.", 0 TSRMLS_CC); return; } @@ -782,7 +937,13 @@ PHP_METHOD(Pimple, __construct) zend_uint str_length; ulong num_index; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|a!", &values) == FAILURE || !values) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|a!", &values) == FAILURE) { + return; + } + + PIMPLE_DEPRECATE + + if (!values) { return; } @@ -857,7 +1018,38 @@ PHP_METHOD(PimpleClosure, invoker) PHP_MINIT_FUNCTION(pimple) { + zend_class_entry tmp_ce_PsrContainerInterface, tmp_ce_PsrContainerExceptionInterface, tmp_ce_PsrNotFoundExceptionInterface; + zend_class_entry tmp_ce_ExpectedInvokableException, tmp_ce_FrozenServiceException, tmp_ce_InvalidServiceIdentifierException, tmp_ce_UnknownIdentifierException; zend_class_entry tmp_pimple_ce, tmp_pimple_closure_ce, tmp_pimple_serviceprovider_iface_ce; + + /* Psr\Container namespace */ + INIT_NS_CLASS_ENTRY(tmp_ce_PsrContainerInterface, PSR_CONTAINER_NS, "ContainerInterface", pimple_ce_PsrContainerInterface_functions); + INIT_NS_CLASS_ENTRY(tmp_ce_PsrContainerExceptionInterface, PSR_CONTAINER_NS, "ContainerExceptionInterface", pimple_ce_PsrContainerExceptionInterface_functions); + INIT_NS_CLASS_ENTRY(tmp_ce_PsrNotFoundExceptionInterface, PSR_CONTAINER_NS, "NotFoundExceptionInterface", pimple_ce_PsrNotFoundExceptionInterface_functions); + + pimple_ce_PsrContainerInterface = zend_register_internal_interface(&tmp_ce_PsrContainerInterface TSRMLS_CC); + pimple_ce_PsrContainerExceptionInterface = zend_register_internal_interface(&tmp_ce_PsrContainerExceptionInterface TSRMLS_CC); + pimple_ce_PsrNotFoundExceptionInterface = zend_register_internal_interface(&tmp_ce_PsrNotFoundExceptionInterface TSRMLS_CC); + + zend_class_implements(pimple_ce_PsrNotFoundExceptionInterface TSRMLS_CC, 1, pimple_ce_PsrContainerExceptionInterface); + + /* Pimple\Exception namespace */ + INIT_NS_CLASS_ENTRY(tmp_ce_ExpectedInvokableException, PIMPLE_EXCEPTION_NS, "ExpectedInvokableException", NULL); + INIT_NS_CLASS_ENTRY(tmp_ce_FrozenServiceException, PIMPLE_EXCEPTION_NS, "FrozenServiceException", pimple_ce_FrozenServiceException_functions); + INIT_NS_CLASS_ENTRY(tmp_ce_InvalidServiceIdentifierException, PIMPLE_EXCEPTION_NS, "InvalidServiceIdentifierException", pimple_ce_InvalidServiceIdentifierException_functions); + INIT_NS_CLASS_ENTRY(tmp_ce_UnknownIdentifierException, PIMPLE_EXCEPTION_NS, "UnknownIdentifierException", pimple_ce_UnknownIdentifierException_functions); + + pimple_ce_ExpectedInvokableException = zend_register_internal_class_ex(&tmp_ce_ExpectedInvokableException, spl_ce_InvalidArgumentException, NULL TSRMLS_CC); + pimple_ce_FrozenServiceException = zend_register_internal_class_ex(&tmp_ce_FrozenServiceException, spl_ce_RuntimeException, NULL TSRMLS_CC); + pimple_ce_InvalidServiceIdentifierException = zend_register_internal_class_ex(&tmp_ce_InvalidServiceIdentifierException, spl_ce_InvalidArgumentException, NULL TSRMLS_CC); + pimple_ce_UnknownIdentifierException = zend_register_internal_class_ex(&tmp_ce_UnknownIdentifierException, spl_ce_InvalidArgumentException, NULL TSRMLS_CC); + + zend_class_implements(pimple_ce_ExpectedInvokableException TSRMLS_CC, 1, pimple_ce_PsrContainerExceptionInterface); + zend_class_implements(pimple_ce_FrozenServiceException TSRMLS_CC, 1, pimple_ce_PsrContainerExceptionInterface); + zend_class_implements(pimple_ce_InvalidServiceIdentifierException TSRMLS_CC, 1, pimple_ce_PsrContainerExceptionInterface); + zend_class_implements(pimple_ce_UnknownIdentifierException TSRMLS_CC, 1, pimple_ce_PsrNotFoundExceptionInterface); + + /* Pimple namespace */ 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); diff --git a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/src/Pimple/Container.php b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/src/Pimple/Container.php index c976431e99a8..707b92b82c13 100644 --- a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/src/Pimple/Container.php +++ b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/src/Pimple/Container.php @@ -26,10 +26,15 @@ namespace Pimple; +use Pimple\Exception\ExpectedInvokableException; +use Pimple\Exception\FrozenServiceException; +use Pimple\Exception\InvalidServiceIdentifierException; +use Pimple\Exception\UnknownIdentifierException; + /** * Container main class. * - * @author Fabien Potencier + * @author Fabien Potencier */ class Container implements \ArrayAccess { @@ -41,11 +46,11 @@ class Container implements \ArrayAccess private $keys = array(); /** - * Instantiate the container. + * Instantiates the container. * * Objects and parameters can be passed as argument to the constructor. * - * @param array $values The parameters or objects. + * @param array $values The parameters or objects */ public function __construct(array $values = array()) { @@ -69,12 +74,12 @@ public function __construct(array $values = array()) * @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 + * @throws FrozenServiceException 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)); + throw new FrozenServiceException($id); } $this->values[$id] = $value; @@ -88,19 +93,19 @@ public function offsetSet($id, $value) * * @return mixed The value of the parameter or an object * - * @throws \InvalidArgumentException if the identifier is not defined + * @throws UnknownIdentifierException 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)); + throw new UnknownIdentifierException($id); } if ( isset($this->raw[$id]) - || !is_object($this->values[$id]) + || !\is_object($this->values[$id]) || isset($this->protected[$this->values[$id]]) - || !method_exists($this->values[$id], '__invoke') + || !\method_exists($this->values[$id], '__invoke') ) { return $this->values[$id]; } @@ -138,7 +143,7 @@ public function offsetExists($id) public function offsetUnset($id) { if (isset($this->keys[$id])) { - if (is_object($this->values[$id])) { + if (\is_object($this->values[$id])) { unset($this->factories[$this->values[$id]], $this->protected[$this->values[$id]]); } @@ -153,12 +158,12 @@ public function offsetUnset($id) * * @return callable The passed callable * - * @throws \InvalidArgumentException Service definition has to be a closure of an invokable object + * @throws ExpectedInvokableException Service definition has to be a closure or an invokable object */ public function factory($callable) { - if (!method_exists($callable, '__invoke')) { - throw new \InvalidArgumentException('Service definition is not a Closure or invokable object.'); + if (!\method_exists($callable, '__invoke')) { + throw new ExpectedInvokableException('Service definition is not a Closure or invokable object.'); } $this->factories->attach($callable); @@ -175,12 +180,12 @@ public function factory($callable) * * @return callable The passed callable * - * @throws \InvalidArgumentException Service definition has to be a closure of an invokable object + * @throws ExpectedInvokableException Service definition has to be a closure or an invokable object */ public function protect($callable) { - if (!method_exists($callable, '__invoke')) { - throw new \InvalidArgumentException('Callable is not a Closure or invokable object.'); + if (!\method_exists($callable, '__invoke')) { + throw new ExpectedInvokableException('Callable is not a Closure or invokable object.'); } $this->protected->attach($callable); @@ -195,12 +200,12 @@ public function protect($callable) * * @return mixed The value of the parameter or the closure defining an object * - * @throws \InvalidArgumentException if the identifier is not defined + * @throws UnknownIdentifierException 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)); + throw new UnknownIdentifierException($id); } if (isset($this->raw[$id])) { @@ -221,20 +226,31 @@ public function raw($id) * * @return callable The wrapped callable * - * @throws \InvalidArgumentException if the identifier is not defined or not a service definition + * @throws UnknownIdentifierException If the identifier is not defined + * @throws FrozenServiceException If the service is frozen + * @throws InvalidServiceIdentifierException If the identifier belongs to a parameter + * @throws ExpectedInvokableException If the extension callable is not a closure or an invokable object */ public function extend($id, $callable) { if (!isset($this->keys[$id])) { - throw new \InvalidArgumentException(sprintf('Identifier "%s" is not defined.', $id)); + throw new UnknownIdentifierException($id); + } + + if (isset($this->frozen[$id])) { + throw new FrozenServiceException($id); + } + + if (!\is_object($this->values[$id]) || !\method_exists($this->values[$id], '__invoke')) { + throw new InvalidServiceIdentifierException($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 (isset($this->protected[$this->values[$id]])) { + @\trigger_error(\sprintf('How Pimple behaves when extending protected closures will be fixed in Pimple 4. Are you sure "%s" should be protected?', $id), \E_USER_DEPRECATED); } - if (!is_object($callable) || !method_exists($callable, '__invoke')) { - throw new \InvalidArgumentException('Extension service definition is not a Closure or invokable object.'); + if (!\is_object($callable) || !\method_exists($callable, '__invoke')) { + throw new ExpectedInvokableException('Extension service definition is not a Closure or invokable object.'); } $factory = $this->values[$id]; @@ -258,7 +274,7 @@ public function extend($id, $callable) */ public function keys() { - return array_keys($this->values); + return \array_keys($this->values); } /** diff --git a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/src/Pimple/Tests/PimpleTest.php b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/src/Pimple/Tests/PimpleTest.php index 918f620d8841..acb66e000261 100644 --- a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/src/Pimple/Tests/PimpleTest.php +++ b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/src/Pimple/Tests/PimpleTest.php @@ -29,7 +29,7 @@ use Pimple\Container; /** - * @author Igor Wiedler + * @author Igor Wiedler */ class PimpleTest extends \PHPUnit_Framework_TestCase { @@ -106,7 +106,7 @@ public function testConstructorInjection() } /** - * @expectedException \InvalidArgumentException + * @expectedException \Pimple\Exception\UnknownIdentifierException * @expectedExceptionMessage Identifier "foo" is not defined. */ public function testOffsetGetValidatesKeyIsPresent() @@ -115,6 +115,17 @@ public function testOffsetGetValidatesKeyIsPresent() echo $pimple['foo']; } + /** + * @group legacy + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage Identifier "foo" is not defined. + */ + public function testLegacyOffsetGetValidatesKeyIsPresent() + { + $pimple = new Container(); + echo $pimple['foo']; + } + public function testOffsetGetHonorsNullValues() { $pimple = new Container(); @@ -187,11 +198,11 @@ public function testRawHonorsNullValues() public function testFluentRegister() { $pimple = new Container(); - $this->assertSame($pimple, $pimple->register($this->getMock('Pimple\ServiceProviderInterface'))); + $this->assertSame($pimple, $pimple->register($this->getMockBuilder('Pimple\ServiceProviderInterface')->getMock())); } /** - * @expectedException \InvalidArgumentException + * @expectedException \Pimple\Exception\UnknownIdentifierException * @expectedExceptionMessage Identifier "foo" is not defined. */ public function testRawValidatesKeyIsPresent() @@ -200,6 +211,17 @@ public function testRawValidatesKeyIsPresent() $pimple->raw('foo'); } + /** + * @group legacy + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage Identifier "foo" is not defined. + */ + public function testLegacyRawValidatesKeyIsPresent() + { + $pimple = new Container(); + $pimple->raw('foo'); + } + /** * @dataProvider serviceDefinitionProvider */ @@ -251,7 +273,7 @@ public function testExtendDoesNotLeakWithFactories() } /** - * @expectedException \InvalidArgumentException + * @expectedException \Pimple\Exception\UnknownIdentifierException * @expectedExceptionMessage Identifier "foo" is not defined. */ public function testExtendValidatesKeyIsPresent() @@ -260,6 +282,17 @@ public function testExtendValidatesKeyIsPresent() $pimple->extend('foo', function () {}); } + /** + * @group legacy + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage Identifier "foo" is not defined. + */ + public function testLegacyExtendValidatesKeyIsPresent() + { + $pimple = new Container(); + $pimple->extend('foo', function () {}); + } + public function testKeys() { $pimple = new Container(); @@ -289,7 +322,7 @@ public function settingNonInvokableObjectShouldTreatItAsParameter() /** * @dataProvider badServiceDefinitionProvider - * @expectedException \InvalidArgumentException + * @expectedException \Pimple\Exception\ExpectedInvokableException * @expectedExceptionMessage Service definition is not a Closure or invokable object. */ public function testFactoryFailsForInvalidServiceDefinitions($service) @@ -299,8 +332,20 @@ public function testFactoryFailsForInvalidServiceDefinitions($service) } /** + * @group legacy * @dataProvider badServiceDefinitionProvider * @expectedException \InvalidArgumentException + * @expectedExceptionMessage Service definition is not a Closure or invokable object. + */ + public function testLegacyFactoryFailsForInvalidServiceDefinitions($service) + { + $pimple = new Container(); + $pimple->factory($service); + } + + /** + * @dataProvider badServiceDefinitionProvider + * @expectedException \Pimple\Exception\ExpectedInvokableException * @expectedExceptionMessage Callable is not a Closure or invokable object. */ public function testProtectFailsForInvalidServiceDefinitions($service) @@ -310,8 +355,20 @@ public function testProtectFailsForInvalidServiceDefinitions($service) } /** + * @group legacy * @dataProvider badServiceDefinitionProvider * @expectedException \InvalidArgumentException + * @expectedExceptionMessage Callable is not a Closure or invokable object. + */ + public function testLegacyProtectFailsForInvalidServiceDefinitions($service) + { + $pimple = new Container(); + $pimple->protect($service); + } + + /** + * @dataProvider badServiceDefinitionProvider + * @expectedException \Pimple\Exception\InvalidServiceIdentifierException * @expectedExceptionMessage Identifier "foo" does not contain an object definition. */ public function testExtendFailsForKeysNotContainingServiceDefinitions($service) @@ -322,8 +379,39 @@ public function testExtendFailsForKeysNotContainingServiceDefinitions($service) } /** + * @group legacy * @dataProvider badServiceDefinitionProvider * @expectedException \InvalidArgumentException + * @expectedExceptionMessage Identifier "foo" does not contain an object definition. + */ + public function testLegacyExtendFailsForKeysNotContainingServiceDefinitions($service) + { + $pimple = new Container(); + $pimple['foo'] = $service; + $pimple->extend('foo', function () {}); + } + + /** + * @group legacy + * @expectedDeprecation How Pimple behaves when extending protected closures will be fixed in Pimple 4. Are you sure "foo" should be protected? + */ + public function testExtendingProtectedClosureDeprecation() + { + $pimple = new Container(); + $pimple['foo'] = $pimple->protect(function () { + return 'bar'; + }); + + $pimple->extend('foo', function ($value) { + return $value.'-baz'; + }); + + $this->assertSame('bar-baz', $pimple['foo']); + } + + /** + * @dataProvider badServiceDefinitionProvider + * @expectedException \Pimple\Exception\ExpectedInvokableException * @expectedExceptionMessage Extension service definition is not a Closure or invokable object. */ public function testExtendFailsForInvalidServiceDefinitions($service) @@ -333,6 +421,49 @@ public function testExtendFailsForInvalidServiceDefinitions($service) $pimple->extend('foo', $service); } + /** + * @group legacy + * @dataProvider badServiceDefinitionProvider + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage Extension service definition is not a Closure or invokable object. + */ + public function testLegacyExtendFailsForInvalidServiceDefinitions($service) + { + $pimple = new Container(); + $pimple['foo'] = function () {}; + $pimple->extend('foo', $service); + } + + /** + * @expectedException \Pimple\Exception\FrozenServiceException + * @expectedExceptionMessage Cannot override frozen service "foo". + */ + public function testExtendFailsIfFrozenServiceIsNonInvokable() + { + $pimple = new Container(); + $pimple['foo'] = function () { + return new Fixtures\NonInvokable(); + }; + $foo = $pimple['foo']; + + $pimple->extend('foo', function () {}); + } + + /** + * @expectedException \Pimple\Exception\FrozenServiceException + * @expectedExceptionMessage Cannot override frozen service "foo". + */ + public function testExtendFailsIfFrozenServiceIsInvokable() + { + $pimple = new Container(); + $pimple['foo'] = function () { + return new Fixtures\Invokable(); + }; + $foo = $pimple['foo']; + + $pimple->extend('foo', function () {}); + } + /** * Provider for invalid service definitions. */ @@ -375,7 +506,7 @@ public function testDefiningNewServiceAfterFreeze() } /** - * @expectedException \RuntimeException + * @expectedException \Pimple\Exception\FrozenServiceException * @expectedExceptionMessage Cannot override frozen service "foo". */ public function testOverridingServiceAfterFreeze() @@ -391,6 +522,24 @@ public function testOverridingServiceAfterFreeze() }; } + /** + * @group legacy + * @expectedException \RuntimeException + * @expectedExceptionMessage Cannot override frozen service "foo". + */ + public function testLegacyOverridingServiceAfterFreeze() + { + $pimple = new Container(); + $pimple['foo'] = function () { + return 'foo'; + }; + $foo = $pimple['foo']; + + $pimple['foo'] = function () { + return 'bar'; + }; + } + public function testRemovingServiceAfterFreeze() { $pimple = new Container(); diff --git a/samples/server/petstore-security-test/slim/vendor/psr/http-message/composer.json b/samples/server/petstore-security-test/slim/vendor/psr/http-message/composer.json index 4774b6126276..b0d2937a03a5 100644 --- a/samples/server/petstore-security-test/slim/vendor/psr/http-message/composer.json +++ b/samples/server/petstore-security-test/slim/vendor/psr/http-message/composer.json @@ -2,6 +2,7 @@ "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": [ { diff --git a/samples/server/petstore-security-test/slim/vendor/psr/http-message/src/MessageInterface.php b/samples/server/petstore-security-test/slim/vendor/psr/http-message/src/MessageInterface.php index 8f67a050e8cf..dd46e5ec81ee 100644 --- a/samples/server/petstore-security-test/slim/vendor/psr/http-message/src/MessageInterface.php +++ b/samples/server/petstore-security-test/slim/vendor/psr/http-message/src/MessageInterface.php @@ -36,7 +36,7 @@ public function getProtocolVersion(); * new protocol version. * * @param string $version HTTP protocol version - * @return self + * @return static */ public function withProtocolVersion($version); @@ -61,7 +61,7 @@ public function withProtocolVersion($version); * 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 + * @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. */ @@ -126,7 +126,7 @@ public function getHeaderLine($name); * * @param string $name Case-insensitive header field name. * @param string|string[] $value Header value(s). - * @return self + * @return static * @throws \InvalidArgumentException for invalid header names or values. */ public function withHeader($name, $value); @@ -144,7 +144,7 @@ public function withHeader($name, $value); * * @param string $name Case-insensitive header field name to add. * @param string|string[] $value Header value(s). - * @return self + * @return static * @throws \InvalidArgumentException for invalid header names or values. */ public function withAddedHeader($name, $value); @@ -159,7 +159,7 @@ public function withAddedHeader($name, $value); * the named header. * * @param string $name Case-insensitive header field name to remove. - * @return self + * @return static */ public function withoutHeader($name); @@ -180,7 +180,7 @@ public function getBody(); * new body stream. * * @param StreamInterface $body Body. - * @return self + * @return static * @throws \InvalidArgumentException When the body is not valid. */ public function withBody(StreamInterface $body); diff --git a/samples/server/petstore-security-test/slim/vendor/psr/http-message/src/RequestInterface.php b/samples/server/petstore-security-test/slim/vendor/psr/http-message/src/RequestInterface.php index 75c802e2927d..a96d4fd63667 100644 --- a/samples/server/petstore-security-test/slim/vendor/psr/http-message/src/RequestInterface.php +++ b/samples/server/petstore-security-test/slim/vendor/psr/http-message/src/RequestInterface.php @@ -53,10 +53,10 @@ public function getRequestTarget(); * 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 + * @link http://tools.ietf.org/html/rfc7230#section-5.3 (for the various * request-target forms allowed in request messages) * @param mixed $requestTarget - * @return self + * @return static */ public function withRequestTarget($requestTarget); @@ -79,7 +79,7 @@ public function getMethod(); * changed request method. * * @param string $method Case-sensitive method. - * @return self + * @return static * @throws \InvalidArgumentException for invalid HTTP methods. */ public function withMethod($method); @@ -107,7 +107,7 @@ public function getUri(); * 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 + * - 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 @@ -123,7 +123,7 @@ public function getUri(); * @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 + * @return static */ public function withUri(UriInterface $uri, $preserveHost = false); } diff --git a/samples/server/petstore-security-test/slim/vendor/psr/http-message/src/ResponseInterface.php b/samples/server/petstore-security-test/slim/vendor/psr/http-message/src/ResponseInterface.php index 6724809e3ac0..c306514e6bbd 100644 --- a/samples/server/petstore-security-test/slim/vendor/psr/http-message/src/ResponseInterface.php +++ b/samples/server/petstore-security-test/slim/vendor/psr/http-message/src/ResponseInterface.php @@ -46,7 +46,7 @@ public function getStatusCode(); * @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 + * @return static * @throws \InvalidArgumentException For invalid status code arguments. */ public function withStatus($code, $reasonPhrase = ''); diff --git a/samples/server/petstore-security-test/slim/vendor/psr/http-message/src/ServerRequestInterface.php b/samples/server/petstore-security-test/slim/vendor/psr/http-message/src/ServerRequestInterface.php index 916e0658d370..02512340ad85 100644 --- a/samples/server/petstore-security-test/slim/vendor/psr/http-message/src/ServerRequestInterface.php +++ b/samples/server/petstore-security-test/slim/vendor/psr/http-message/src/ServerRequestInterface.php @@ -80,7 +80,7 @@ public function getCookieParams(); * updated cookie values. * * @param array $cookies Array of key/value pairs representing cookies. - * @return self + * @return static */ public function withCookieParams(array $cookies); @@ -118,7 +118,7 @@ public function getQueryParams(); * * @param array $query Array of query string arguments, typically from * $_GET. - * @return self + * @return static */ public function withQueryParams(array $query); @@ -143,8 +143,8 @@ public function getUploadedFiles(); * immutability of the message, and MUST return an instance that has the * updated body parameters. * - * @param array An array tree of UploadedFileInterface instances. - * @return self + * @param array $uploadedFiles An array tree of UploadedFileInterface instances. + * @return static * @throws \InvalidArgumentException if an invalid structure is provided. */ public function withUploadedFiles(array $uploadedFiles); @@ -190,7 +190,7 @@ public function getParsedBody(); * * @param null|array|object $data The deserialized body data. This will * typically be in an array or object. - * @return self + * @return static * @throws \InvalidArgumentException if an unsupported argument type is * provided. */ @@ -239,7 +239,7 @@ public function getAttribute($name, $default = null); * @see getAttributes() * @param string $name The attribute name. * @param mixed $value The value of the attribute. - * @return self + * @return static */ public function withAttribute($name, $value); @@ -255,7 +255,7 @@ public function withAttribute($name, $value); * * @see getAttributes() * @param string $name The attribute name. - * @return self + * @return static */ public function withoutAttribute($name); } diff --git a/samples/server/petstore-security-test/slim/vendor/psr/http-message/src/UploadedFileInterface.php b/samples/server/petstore-security-test/slim/vendor/psr/http-message/src/UploadedFileInterface.php index 5ad288d2be35..f8a6901e0144 100644 --- a/samples/server/petstore-security-test/slim/vendor/psr/http-message/src/UploadedFileInterface.php +++ b/samples/server/petstore-security-test/slim/vendor/psr/http-message/src/UploadedFileInterface.php @@ -58,7 +58,7 @@ public function getStream(); * @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 \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. */ diff --git a/samples/server/petstore-security-test/slim/vendor/psr/http-message/src/UriInterface.php b/samples/server/petstore-security-test/slim/vendor/psr/http-message/src/UriInterface.php index 1ff5bf01dded..9d7ab9eae8f2 100644 --- a/samples/server/petstore-security-test/slim/vendor/psr/http-message/src/UriInterface.php +++ b/samples/server/petstore-security-test/slim/vendor/psr/http-message/src/UriInterface.php @@ -185,7 +185,7 @@ public function getFragment(); * 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. + * @return static A new instance with the specified scheme. * @throws \InvalidArgumentException for invalid or unsupported schemes. */ public function withScheme($scheme); @@ -202,7 +202,7 @@ public function withScheme($scheme); * * @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. + * @return static A new instance with the specified user information. */ public function withUserInfo($user, $password = null); @@ -215,7 +215,7 @@ public function withUserInfo($user, $password = null); * 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. + * @return static A new instance with the specified host. * @throws \InvalidArgumentException for invalid hostnames. */ public function withHost($host); @@ -234,7 +234,7 @@ public function withHost($host); * * @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. + * @return static A new instance with the specified port. * @throws \InvalidArgumentException for invalid ports. */ public function withPort($port); @@ -258,7 +258,7 @@ public function withPort($port); * 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. + * @return static A new instance with the specified path. * @throws \InvalidArgumentException for invalid paths. */ public function withPath($path); @@ -275,7 +275,7 @@ public function withPath($path); * 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. + * @return static A new instance with the specified query string. * @throws \InvalidArgumentException for invalid query strings. */ public function withQuery($query); @@ -292,7 +292,7 @@ public function withQuery($query); * 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. + * @return static A new instance with the specified fragment. */ public function withFragment($fragment); diff --git a/samples/server/petstore-security-test/slim/vendor/slim/slim/CONTRIBUTING.md b/samples/server/petstore-security-test/slim/vendor/slim/slim/CONTRIBUTING.md deleted file mode 100644 index 9bbb6b17ca2c..000000000000 --- a/samples/server/petstore-security-test/slim/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/samples/server/petstore-security-test/slim/vendor/slim/slim/LICENSE.md b/samples/server/petstore-security-test/slim/vendor/slim/slim/LICENSE.md index 0875f84f9057..682c21dc7a47 100644 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/LICENSE.md +++ b/samples/server/petstore-security-test/slim/vendor/slim/slim/LICENSE.md @@ -1,4 +1,4 @@ -Copyright (c) 2011-2016 Josh Lockhart +Copyright (c) 2011-2017 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 diff --git a/samples/server/petstore-security-test/slim/vendor/slim/slim/README.md b/samples/server/petstore-security-test/slim/vendor/slim/slim/README.md deleted file mode 100644 index d20f3939d1c4..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/README.md +++ /dev/null @@ -1,84 +0,0 @@ -# Slim Framework - -[![Build Status](https://travis-ci.org/slimphp/Slim.svg?branch=develop)](https://travis-ci.org/slimphp/Slim) -[![Coverage Status](https://coveralls.io/repos/slimphp/Slim/badge.svg)](https://coveralls.io/r/slimphp/Slim) -[![Total Downloads](https://poser.pugx.org/slim/slim/downloads)](https://packagist.org/packages/slim/slim) -[![License](https://poser.pugx.org/slim/slim/license)](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 -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/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/App.php b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/App.php index 639d9b9b4709..ba2aef40695f 100644 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/App.php +++ b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/App.php @@ -1,21 +1,23 @@ withHeader('Location', (string)$to)->withStatus($status); + }; + + return $this->get($from, $handler); + } + /** * Route Groups * @@ -292,10 +307,31 @@ public function group($pattern, $callable) */ public function run($silent = false) { - $request = $this->container->get('request'); $response = $this->container->get('response'); - $response = $this->process($request, $response); + try { + ob_start(); + $response = $this->process($this->container->get('request'), $response); + } catch (InvalidMethodException $e) { + $response = $this->processInvalidMethod($e->getRequest(), $response); + } finally { + $output = ob_get_clean(); + } + + if (!empty($output) && $response->getBody()->isWritable()) { + $outputBuffering = $this->container->get('settings')['outputBuffering']; + if ($outputBuffering === 'prepend') { + // prepend output buffer content + $body = new Http\Body(fopen('php://temp', 'r+')); + $body->write($output . $response->getBody()); + $response = $response->withBody($body); + } elseif ($outputBuffering === 'append') { + // append output buffer content + $response->getBody()->write($output); + } + } + + $response = $this->finalize($response); if (!$silent) { $this->respond($response); @@ -304,6 +340,39 @@ public function run($silent = false) return $response; } + /** + * Pull route info for a request with a bad method to decide whether to + * return a not-found error (default) or a bad-method error, then run + * the handler for that error, returning the resulting response. + * + * Used for cases where an incoming request has an unrecognized method, + * rather than throwing an exception and not catching it all the way up. + * + * @param ServerRequestInterface $request + * @param ResponseInterface $response + * @return ResponseInterface + */ + protected function processInvalidMethod(ServerRequestInterface $request, ResponseInterface $response) + { + $router = $this->container->get('router'); + if (is_callable([$request->getUri(), 'getBasePath']) && is_callable([$router, 'setBasePath'])) { + $router->setBasePath($request->getUri()->getBasePath()); + } + + $request = $this->dispatchRouterAndPrepareRoute($request, $router); + $routeInfo = $request->getAttribute('routeInfo', [RouterInterface::DISPATCH_STATUS => Dispatcher::NOT_FOUND]); + + if ($routeInfo[RouterInterface::DISPATCH_STATUS] === Dispatcher::METHOD_NOT_ALLOWED) { + return $this->handleException( + new MethodNotAllowedException($request, $response, $routeInfo[RouterInterface::ALLOWED_METHODS]), + $request, + $response + ); + } + + return $this->handleException(new NotFoundException($request, $response), $request, $response); + } + /** * Process a request * @@ -341,13 +410,11 @@ public function process(ServerRequestInterface $request, ResponseInterface $resp $response = $this->handlePhpError($e, $request, $response); } - $response = $this->finalize($response); - return $response; } /** - * Send the response the client + * Send the response to the client * * @param ResponseInterface $response */ @@ -355,6 +422,16 @@ public function respond(ResponseInterface $response) { // Send response if (!headers_sent()) { + // Headers + foreach ($response->getHeaders() as $name => $values) { + foreach ($values as $value) { + header(sprintf('%s: %s', $name, $value), false); + } + } + + // Set the status _after_ the headers, because of PHP's "helpful" behavior with location headers. + // See https://github.com/slimphp/Slim/issues/1730 + // Status header(sprintf( 'HTTP/%s %s %s', @@ -362,13 +439,6 @@ public function respond(ResponseInterface $response) $response->getStatusCode(), $response->getReasonPhrase() )); - - // Headers - foreach ($response->getHeaders() as $name => $values) { - foreach ($values as $value) { - header(sprintf('%s: %s', $name, $value), false); - } - } } // Body @@ -391,9 +461,9 @@ public function respond(ResponseInterface $response) while ($amountToRead > 0 && !$body->eof()) { $data = $body->read(min($chunkSize, $amountToRead)); echo $data; - + $amountToRead -= strlen($data); - + if (connection_status() != CONNECTION_NORMAL) { break; } @@ -597,7 +667,7 @@ protected function handleException(Exception $e, ServerRequestInterface $request $params = [$e->getRequest(), $e->getResponse(), $e->getAllowedMethods()]; } elseif ($e instanceof NotFoundException) { $handler = 'notFoundHandler'; - $params = [$e->getRequest(), $e->getResponse()]; + $params = [$e->getRequest(), $e->getResponse(), $e]; } elseif ($e instanceof SlimException) { // This is a Stop exception and contains the response return $e->getResponse(); diff --git a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/CallableResolver.php b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/CallableResolver.php index 705a9f207fe0..2211a3291878 100644 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/CallableResolver.php +++ b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/CallableResolver.php @@ -1,15 +1,15 @@ 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_string($toResolve)) { + $this->assertCallable($toResolve); } - if (!is_callable($resolved)) { - throw new RuntimeException(sprintf('%s is not resolvable', $toResolve)); + // check for slim callable as "class:method" + if (preg_match(self::CALLABLE_PATTERN, $toResolve, $matches)) { + $resolved = $this->resolveCallable($matches[1], $matches[2]); + $this->assertCallable($resolved); + + return $resolved; } + $resolved = $this->resolveCallable($toResolve); + $this->assertCallable($resolved); + return $resolved; } + + /** + * Check if string is something in the DIC + * that's callable or is a class name which has an __invoke() method. + * + * @param string $class + * @param string $method + * @return callable + * + * @throws \RuntimeException if the callable does not exist + */ + protected function resolveCallable($class, $method = '__invoke') + { + if ($this->container->has($class)) { + return [$this->container->get($class), $method]; + } + + if (!class_exists($class)) { + throw new RuntimeException(sprintf('Callable %s does not exist', $class)); + } + + return [new $class($this->container), $method]; + } + + /** + * @param Callable $callable + * + * @throws \RuntimeException if the callable is not resolvable + */ + protected function assertCallable($callable) + { + if (!is_callable($callable)) { + throw new RuntimeException(sprintf( + '%s is not resolvable', + is_array($callable) || is_object($callable) ? json_encode($callable) : $callable + )); + } + } } diff --git a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/CallableResolverAwareTrait.php b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/CallableResolverAwareTrait.php index f7ff485282d2..ffb4eb28a439 100644 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/CallableResolverAwareTrait.php +++ b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/CallableResolverAwareTrait.php @@ -1,15 +1,15 @@ $value) { - $this->set($key, $value); - } + $this->replace($items); } /******************************************************************************** @@ -68,7 +66,7 @@ public function get($key, $default = null) } /** - * Add item to collection + * 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 */ diff --git a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Container.php b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Container.php index c97f2b3fdf44..1f713ac4eabb 100644 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Container.php +++ b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Container.php @@ -1,9 +1,9 @@ get('settings')['routerCacheFile'])) { $routerCacheFile = $container->get('settings')['routerCacheFile']; } - - return (new Router)->setCacheFile($routerCacheFile); + + + $router = (new Router)->setCacheFile($routerCacheFile); + if (method_exists($router, 'setContainer')) { + $router->setContainer($container); + } + + return $router; }; } @@ -147,7 +152,9 @@ public function register($container) * @return callable */ $container['errorHandler'] = function ($container) { - return new Error($container->get('settings')['displayErrorDetails']); + return new Error( + $container->get('settings')['displayErrorDetails'] + ); }; } diff --git a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/DeferredCallable.php b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/DeferredCallable.php index def58ab23b36..22887c0fce63 100644 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/DeferredCallable.php +++ b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/DeferredCallable.php @@ -1,10 +1,16 @@ renderHtmlErrorMessage($exception); break; - + default: throw new UnexpectedValueException('Cannot render unknown content type ' . $contentType); } @@ -81,7 +81,7 @@ protected function renderHtmlErrorMessage(\Exception $exception) while ($exception = $exception->getPrevious()) { $html .= '

Previous exception

'; - $html .= $this->renderHtmlException($exception); + $html .= $this->renderHtmlExceptionOrError($exception); } } else { $html = '

A website error has occurred. Sorry for the temporary inconvenience.

'; @@ -103,12 +103,30 @@ protected function renderHtmlErrorMessage(\Exception $exception) /** * Render exception as HTML. * + * Provided for backwards compatibility; use renderHtmlExceptionOrError(). + * * @param \Exception $exception * * @return string */ protected function renderHtmlException(\Exception $exception) { + return $this->renderHtmlExceptionOrError($exception); + } + + /** + * Render exception or error as HTML. + * + * @param \Exception|\Error $exception + * + * @return string + */ + protected function renderHtmlExceptionOrError($exception) + { + if (!$exception instanceof \Exception && !$exception instanceof \Error) { + throw new \RuntimeException("Unexpected type. Expected Exception or Error."); + } + $html = sprintf('
Type: %s
', get_class($exception)); if (($code = $exception->getCode())) { diff --git a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Handlers/NotAllowed.php b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Handlers/NotAllowed.php index 3442f20bc528..345f0ff8c42f 100644 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Handlers/NotAllowed.php +++ b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Handlers/NotAllowed.php @@ -1,9 +1,9 @@ getMethod() === 'OPTIONS') { $status = 200; $contentType = 'text/plain'; - $output = $this->renderPlainNotAllowedMessage($methods); + $output = $this->renderPlainOptionsMessage($methods); } else { $status = 405; $contentType = $this->determineContentType($request); @@ -70,12 +70,12 @@ public function __invoke(ServerRequestInterface $request, ResponseInterface $res } /** - * Render PLAIN not allowed message + * Render PLAIN message for OPTIONS response * * @param array $methods * @return string */ - protected function renderPlainNotAllowedMessage($methods) + protected function renderPlainOptionsMessage($methods) { $allow = implode(', ', $methods); diff --git a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Handlers/NotFound.php b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Handlers/NotFound.php index ab1d47a4575d..b3330321ff38 100644 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Handlers/NotFound.php +++ b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Handlers/NotFound.php @@ -1,9 +1,9 @@ determineContentType($request); - switch ($contentType) { - case 'application/json': - $output = $this->renderJsonNotFoundOutput(); - break; + if ($request->getMethod() === 'OPTIONS') { + $contentType = 'text/plain'; + $output = $this->renderPlainNotFoundOutput(); + } else { + $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/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); + 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+')); @@ -59,6 +64,16 @@ public function __invoke(ServerRequestInterface $request, ResponseInterface $res ->withBody($body); } + /** + * Render plain not found message + * + * @return ResponseInterface + */ + protected function renderPlainNotFoundOutput() + { + return 'Not found'; + } + /** * Return a response for application/json content not found * diff --git a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Handlers/PhpError.php b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Handlers/PhpError.php index 0122ddb07852..3ecce30cfaf0 100644 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Handlers/PhpError.php +++ b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Handlers/PhpError.php @@ -1,9 +1,9 @@ null, 'expires' => null, 'secure' => false, - 'httponly' => false + 'httponly' => false, + 'samesite' => null ]; /** @@ -141,7 +142,7 @@ protected function toHeader($name, array $properties) if (isset($properties['secure']) && $properties['secure']) { $result .= '; secure'; } - + if (isset($properties['hostonly']) && $properties['hostonly']) { $result .= '; HostOnly'; } @@ -150,6 +151,11 @@ protected function toHeader($name, array $properties) $result .= '; HttpOnly'; } + if (isset($properties['samesite']) && in_array(strtolower($properties['samesite']), ['lax', 'strict'], true)) { + // While strtolower is needed for correct comparison, the RFC doesn't care about case + $result .= '; SameSite=' . $properties['samesite']; + } + return $result; } @@ -174,7 +180,7 @@ public static function parseHeader($header) } $header = rtrim($header, "\r\n"); - $pieces = preg_split('@\s*[;,]\s*@', $header); + $pieces = preg_split('@[;]\s*@', $header); $cookies = []; foreach ($pieces as $cookie) { diff --git a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/Environment.php b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/Environment.php index a106fa8b8770..cd452fcff97e 100644 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/Environment.php +++ b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/Environment.php @@ -1,9 +1,9 @@ 'HTTP/1.1', 'REQUEST_METHOD' => 'GET', + 'REQUEST_SCHEME' => $defscheme, 'SCRIPT_NAME' => '', 'REQUEST_URI' => '', 'QUERY_STRING' => '', 'SERVER_NAME' => 'localhost', - 'SERVER_PORT' => 80, + 'SERVER_PORT' => $defport, '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', diff --git a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/Headers.php b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/Headers.php index 4aa7a5e4de01..ef50f84b6015 100644 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/Headers.php +++ b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/Headers.php @@ -1,9 +1,9 @@ get('HTTP_AUTHORIZATION'); - if (null === $authorization && is_callable('getallheaders')) { + if (empty($authorization) && is_callable('getallheaders')) { $headers = getallheaders(); $headers = array_change_key_case($headers, CASE_LOWER); if (isset($headers['authorization'])) { diff --git a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/Message.php b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/Message.php index d0e832d695f1..9195fb5b70fa 100644 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/Message.php +++ b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/Message.php @@ -1,9 +1,9 @@ true, + '1.1' => true, + '2.0' => true, + '2' => true, + ]; + /** * Headers * @@ -86,13 +98,11 @@ public function getProtocolVersion() */ public function withProtocolVersion($version) { - static $valid = [ - '1.0' => true, - '1.1' => true, - '2.0' => true, - ]; - if (!isset($valid[$version])) { - throw new InvalidArgumentException('Invalid HTTP version. Must be one of: 1.0, 1.1, 2.0'); + 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; diff --git a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/Request.php b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/Request.php index 7d5b185dcd83..3bda649b3353 100644 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/Request.php +++ b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/Request.php @@ -1,9 +1,9 @@ 1, @@ -131,7 +133,7 @@ class Request extends Message implements ServerRequestInterface * * @param Environment $environment The Slim application Environment * - * @return self + * @return static */ public static function createFromEnvironment(Environment $environment) { @@ -166,6 +168,7 @@ public static function createFromEnvironment(Environment $environment) * @param array $serverParams The server environment variables * @param StreamInterface $body The request body object * @param array $uploadedFiles The request uploadedFiles collection + * @throws InvalidMethodException on invalid HTTP method */ public function __construct( $method, @@ -176,7 +179,12 @@ public function __construct( StreamInterface $body, array $uploadedFiles = [] ) { - $this->originalMethod = $this->filterMethod($method); + try { + $this->originalMethod = $this->filterMethod($method); + } catch (InvalidMethodException $e) { + $this->originalMethod = $method; + } + $this->uri = $uri; $this->headers = $headers; $this->cookies = $cookies; @@ -189,25 +197,43 @@ public function __construct( $this->protocolVersion = str_replace('HTTP/', '', $serverParams['SERVER_PROTOCOL']); } - if (!$this->headers->has('Host') || $this->uri->getHost() !== '') { - $this->headers->set('Host', $this->uri->getHost()); + if (!$this->headers->has('Host') && $this->uri->getHost() !== '') { + $port = $this->uri->getPort() ? ":{$this->uri->getPort()}" : ''; + + $this->headers->set('Host', $this->uri->getHost() . $port); } $this->registerMediaTypeParser('application/json', function ($input) { - return json_decode($input, true); + $result = json_decode($input, true); + if (!is_array($result)) { + return null; + } + return $result; }); $this->registerMediaTypeParser('application/xml', function ($input) { $backup = libxml_disable_entity_loader(true); + $backup_errors = libxml_use_internal_errors(true); $result = simplexml_load_string($input); libxml_disable_entity_loader($backup); + libxml_clear_errors(); + libxml_use_internal_errors($backup_errors); + if ($result === false) { + return null; + } return $result; }); $this->registerMediaTypeParser('text/xml', function ($input) { $backup = libxml_disable_entity_loader(true); + $backup_errors = libxml_use_internal_errors(true); $result = simplexml_load_string($input); libxml_disable_entity_loader($backup); + libxml_clear_errors(); + libxml_use_internal_errors($backup_errors); + if ($result === false) { + return null; + } return $result; }); @@ -215,6 +241,11 @@ public function __construct( parse_str($input, $data); return $data; }); + + // if the request had an invalid method, we can throw it now + if (isset($e) && $e instanceof InvalidMethodException) { + throw $e; + } } /** @@ -248,12 +279,9 @@ public function getMethod() 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']); + $overrideMethod = $this->filterMethod($this->getParsedBodyParam('_METHOD')); + if ($overrideMethod !== null) { + $this->method = $overrideMethod; } if ($this->getBody()->eof()) { @@ -289,7 +317,7 @@ public function getOriginalMethod() * changed request method. * * @param string $method Case-sensitive method. - * @return self + * @return static * @throws \InvalidArgumentException for invalid HTTP methods. */ public function withMethod($method) @@ -323,11 +351,8 @@ protected function filterMethod($method) } $method = strtoupper($method); - if (!isset($this->validMethods[$method])) { - throw new InvalidArgumentException(sprintf( - 'Unsupported HTTP method "%s" provided', - $method - )); + if (preg_match("/^[!#$%&'*+.^_`|~0-9a-z-]+$/i", $method) !== 1) { + throw new InvalidMethodException($this, $method); } return $method; @@ -500,7 +525,7 @@ public function getRequestTarget() * @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 + * @return static * @throws InvalidArgumentException if the request target is invalid */ public function withRequestTarget($requestTarget) @@ -558,7 +583,7 @@ public function getUri() * @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 + * @return static */ public function withUri(UriInterface $uri, $preserveHost = false) { @@ -570,7 +595,7 @@ public function withUri(UriInterface $uri, $preserveHost = false) $clone->headers->set('Host', $uri->getHost()); } } else { - if ($this->uri->getHost() !== '' && (!$this->hasHeader('Host') || $this->getHeader('Host') === null)) { + if ($uri->getHost() !== '' && (!$this->hasHeader('Host') || $this->getHeaderLine('Host') === '')) { $clone->headers->set('Host', $uri->getHost()); } } @@ -684,6 +709,27 @@ 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 $key 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. * @@ -699,7 +745,7 @@ public function getCookieParams() * updated cookie values. * * @param array $cookies Array of key/value pairs representing cookies. - * @return self + * @return static */ public function withCookieParams(array $cookies) { @@ -760,7 +806,7 @@ public function getQueryParams() * * @param array $query Array of query string arguments, typically from * $_GET. - * @return self + * @return static */ public function withQueryParams(array $query) { @@ -799,7 +845,7 @@ public function getUploadedFiles() * updated body parameters. * * @param array $uploadedFiles An array tree of UploadedFileInterface instances. - * @return self + * @return static * @throws \InvalidArgumentException if an invalid structure is provided. */ public function withUploadedFiles(array $uploadedFiles) @@ -828,6 +874,22 @@ public function getServerParams() return $this->serverParams; } + /** + * Retrieve a server parameter. + * + * Note: This method is not part of the PSR-7 standard. + * + * @param string $key + * @param mixed $default + * @return mixed + */ + public function getServerParam($key, $default = null) + { + $serverParams = $this->getServerParams(); + + return isset($serverParams[$key]) ? $serverParams[$key] : $default; + } + /******************************************************************************* * Attributes ******************************************************************************/ @@ -881,7 +943,7 @@ public function getAttribute($name, $default = null) * @see getAttributes() * @param string $name The attribute name. * @param mixed $value The value of the attribute. - * @return self + * @return static */ public function withAttribute($name, $value) { @@ -904,7 +966,7 @@ public function withAttribute($name, $value) * updated attributes. * * @param array $attributes New attributes - * @return self + * @return static */ public function withAttributes(array $attributes) { @@ -926,7 +988,7 @@ public function withAttributes(array $attributes) * * @see getAttributes() * @param string $name The attribute name. - * @return self + * @return static */ public function withoutAttribute($name) { @@ -1014,7 +1076,7 @@ public function getParsedBody() * * @param null|array|object $data The deserialized body data. This will * typically be in an array or object. - * @return self + * @return static * @throws \InvalidArgumentException if an unsupported argument type is * provided. */ @@ -1035,7 +1097,7 @@ public function withParsedBody($data) * * Note: This method is not part of the PSR-7 standard. * - * @return self + * @return $this */ public function reparseBody() { @@ -1097,10 +1159,10 @@ public function getParam($key, $default = null) * * Note: This method is not part of the PSR-7 standard. * - * @param $key - * @param null $default + * @param string $key + * @param mixed $default * - * @return null + * @return mixed */ public function getParsedBodyParam($key, $default = null) { @@ -1120,10 +1182,10 @@ public function getParsedBodyParam($key, $default = null) * * Note: This method is not part of the PSR-7 standard. * - * @param $key - * @param null $default + * @param string $key + * @param mixed $default * - * @return null + * @return mixed */ public function getQueryParam($key, $default = null) { @@ -1137,13 +1199,14 @@ public function getQueryParam($key, $default = null) } /** - * Fetch assocative array of body and query string parameters. + * Fetch associative array of body and query string parameters. * * Note: This method is not part of the PSR-7 standard. * - * @return array + * @param array|null $only list the keys to retrieve. + * @return array|null */ - public function getParams() + public function getParams(array $only = null) { $params = $this->getQueryParams(); $postParams = $this->getParsedBody(); @@ -1151,6 +1214,16 @@ public function getParams() $params = array_merge($params, (array)$postParams); } + if ($only) { + $onlyParams = []; + foreach ($only as $key) { + if (array_key_exists($key, $params)) { + $onlyParams[$key] = $params[$key]; + } + } + return $onlyParams; + } + return $params; } } diff --git a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/RequestBody.php b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/RequestBody.php index 2345fe4354c7..50887fddc23b 100644 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/RequestBody.php +++ b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/RequestBody.php @@ -1,9 +1,9 @@ 'Requested Range Not Satisfiable', 417 => 'Expectation Failed', 418 => 'I\'m a teapot', + 421 => 'Misdirected Request', 422 => 'Unprocessable Entity', 423 => 'Locked', 424 => 'Failed Dependency', @@ -98,7 +99,9 @@ class Response extends Message implements ResponseInterface 428 => 'Precondition Required', 429 => 'Too Many Requests', 431 => 'Request Header Fields Too Large', + 444 => 'Connection Closed Without Response', 451 => 'Unavailable For Legal Reasons', + 499 => 'Client Closed Request', //Server Error 5xx 500 => 'Internal Server Error', 501 => 'Not Implemented', @@ -111,8 +114,16 @@ class Response extends Message implements ResponseInterface 508 => 'Loop Detected', 510 => 'Not Extended', 511 => 'Network Authentication Required', + 599 => 'Network Connect Timeout Error', ]; + /** + * EOL characters used for HTTP response. + * + * @var string + */ + const EOL = "\r\n"; + /** * Create new HTTP response. * @@ -172,7 +183,7 @@ public function getStatusCode() * @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 + * @return static * @throws \InvalidArgumentException For invalid status code arguments. */ public function withStatus($code, $reasonPhrase = '') @@ -238,6 +249,34 @@ public function getReasonPhrase() return ''; } + /******************************************************************************* + * Headers + ******************************************************************************/ + + /** + * Return an instance with the provided value replacing the specified header. + * + * If a Location header is set and the status code is 200, then set the status + * code to 302 to mimic what PHP does. See https://github.com/slimphp/Slim/issues/1730 + * + * @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); + + if ($clone->getStatusCode() === 200 && strtolower($name) === 'location') { + $clone = $clone->withStatus(302); + } + + return $clone; + } + + /******************************************************************************* * Body ******************************************************************************/ @@ -250,7 +289,7 @@ public function getReasonPhrase() * Proxies to the underlying stream and writes the provided data to it. * * @param string $data - * @return self + * @return $this */ public function write($data) { @@ -273,7 +312,7 @@ public function write($data) * * @param string|UriInterface $url The redirect destination. * @param int|null $status The redirect HTTP status code. - * @return self + * @return static */ public function withRedirect($url, $status = null) { @@ -302,20 +341,19 @@ public function withRedirect($url, $status = null) * @param int $status The HTTP status code. * @param int $encodingOptions Json encoding options * @throws \RuntimeException - * @return self + * @return static */ public function withJson($data, $status = null, $encodingOptions = 0) { - $body = $this->getBody(); - $body->rewind(); - $body->write($json = json_encode($data, $encodingOptions)); + $response = $this->withBody(new Body(fopen('php://temp', 'r+'))); + $response->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'); + $responseWithJson = $response->withHeader('Content-Type', 'application/json;charset=utf-8'); if (isset($status)) { return $responseWithJson->withStatus($status); } @@ -458,11 +496,11 @@ public function __toString() $this->getStatusCode(), $this->getReasonPhrase() ); - $output .= PHP_EOL; + $output .= Response::EOL; foreach ($this->getHeaders() as $name => $values) { - $output .= sprintf('%s: %s', $name, $this->getHeaderLine($name)) . PHP_EOL; + $output .= sprintf('%s: %s', $name, $this->getHeaderLine($name)) . Response::EOL; } - $output .= PHP_EOL; + $output .= Response::EOL; $output .= (string)$this->getBody(); return $output; diff --git a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/Stream.php b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/Stream.php index 97de9ac0090a..27c7a7645bf6 100644 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/Stream.php +++ b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/Stream.php @@ -1,9 +1,9 @@ writable = null; $this->seekable = null; $this->size = null; + $this->isPipe = null; return $oldResource; } @@ -196,7 +211,11 @@ public function __toString() public function close() { if ($this->isAttached() === true) { - fclose($this->stream); + if ($this->isPipe()) { + pclose($this->stream); + } else { + fclose($this->stream); + } } $this->detach(); @@ -211,7 +230,7 @@ public function getSize() { if (!$this->size && $this->isAttached() === true) { $stats = fstat($this->stream); - $this->size = isset($stats['size']) ? $stats['size'] : null; + $this->size = isset($stats['size']) && !$this->isPipe() ? $stats['size'] : null; } return $this->size; @@ -226,7 +245,7 @@ public function getSize() */ public function tell() { - if (!$this->isAttached() || ($position = ftell($this->stream)) === false) { + if (!$this->isAttached() || ($position = ftell($this->stream)) === false || $this->isPipe()) { throw new RuntimeException('Could not get the position of the pointer in stream'); } @@ -251,13 +270,17 @@ public function eof() public function isReadable() { if ($this->readable === null) { - $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; + 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; + } } } } @@ -300,7 +323,7 @@ public function isSeekable() $this->seekable = false; if ($this->isAttached()) { $meta = $this->getMetadata(); - $this->seekable = $meta['seekable']; + $this->seekable = !$this->isPipe() && $meta['seekable']; } } @@ -406,4 +429,22 @@ public function getContents() 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/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/UploadedFile.php b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/UploadedFile.php index ff970277c7c7..ae5dfb65e593 100644 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/UploadedFile.php +++ b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/UploadedFile.php @@ -1,9 +1,9 @@ 0; + if (!$targetIsStream && !is_writable(dirname($targetPath))) { throw new InvalidArgumentException('Upload target path is not writable'); } - $targetIsStream = strpos($targetPath, '://') > 0; if ($targetIsStream) { if (!copy($this->file, $targetPath)) { throw new RuntimeException(sprintf('Error moving uploaded file %1s to %2s', $this->name, $targetPath)); diff --git a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/Uri.php b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/Uri.php index 27b1d0d59389..fb0f04b5c3e9 100644 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/Uri.php +++ b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/Uri.php @@ -1,9 +1,9 @@ get('QUERY_STRING', ''); + if ($queryString === '') { + $queryString = parse_url('http://example.com' . $env->get('REQUEST_URI'), PHP_URL_QUERY); + } // Fragment $fragment = ''; @@ -375,12 +378,33 @@ public function getUserInfo() public function withUserInfo($user, $password = null) { $clone = clone $this; - $clone->user = $user; - $clone->password = $password ? $password : ''; + $clone->user = $this->filterUserInfo($user); + if ($clone->user) { + $clone->password = $password ? $this->filterUserInfo($password) : ''; + } else { + $clone->password = ''; + } return $clone; } + /** + * Filters the user info string. + * + * @param string $query The raw uri query string. + * @return string The percent-encoded query string. + */ + protected function filterUserInfo($query) + { + return preg_replace_callback( + '/(?:[^a-zA-Z0-9_\-\.~!\$&\'\(\)\*\+,;=]+|%(?![A-Fa-f0-9]{2}))/u', + function ($match) { + return rawurlencode($match[0]); + }, + $query + ); + } + /** * Retrieve the host component of the URI. * diff --git a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Interfaces/CallableResolverInterface.php b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Interfaces/CallableResolverInterface.php index 9bde59ac97a7..17d81dbe84ea 100644 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Interfaces/CallableResolverInterface.php +++ b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Interfaces/CallableResolverInterface.php @@ -1,9 +1,9 @@ stack)) { + if (is_null($this->tip)) { $this->seedMiddlewareStack(); } - $next = $this->stack->top(); - $this->stack[] = function (ServerRequestInterface $req, ResponseInterface $res) use ($callable, $next) { - $result = call_user_func($callable, $req, $res, $next); + $next = $this->tip; + $this->tip = function ( + ServerRequestInterface $request, + ResponseInterface $response + ) use ( + $callable, + $next + ) { + $result = call_user_func($callable, $request, $response, $next); if ($result instanceof ResponseInterface === false) { throw new UnexpectedValueException( 'Middleware must return instance of \Psr\Http\Message\ResponseInterface' @@ -86,35 +89,33 @@ protected function addMiddleware(callable $callable) */ protected function seedMiddlewareStack(callable $kernel = null) { - if (!is_null($this->stack)) { + if (!is_null($this->tip)) { 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; + $this->tip = $kernel; } /** * Call middleware stack * - * @param ServerRequestInterface $req A request object - * @param ResponseInterface $res A response object + * @param ServerRequestInterface $request A request object + * @param ResponseInterface $response A response object * * @return ResponseInterface */ - public function callMiddlewareStack(ServerRequestInterface $req, ResponseInterface $res) + public function callMiddlewareStack(ServerRequestInterface $request, ResponseInterface $response) { - if (is_null($this->stack)) { + if (is_null($this->tip)) { $this->seedMiddlewareStack(); } /** @var callable $start */ - $start = $this->stack->top(); + $start = $this->tip; $this->middlewareLock = true; - $resp = $start($req, $res); + $response = $start($request, $response); $this->middlewareLock = false; - return $resp; + return $response; } } diff --git a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Routable.php b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Routable.php index 4a6759fac469..c912db433a14 100644 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Routable.php +++ b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Routable.php @@ -1,14 +1,14 @@ middleware[] = new DeferredCallable($callable, $this->container); return $this; } - + /** * Set the route pattern * - * @set string + * @param string $newPattern */ public function setPattern($newPattern) { diff --git a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Route.php b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Route.php index 3cb4a0e28b4a..fa8be4e44688 100644 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Route.php +++ b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Route.php @@ -1,14 +1,13 @@ methods = $methods; + $this->methods = is_string($methods) ? [$methods] : $methods; $this->pattern = $pattern; $this->callable = $callable; $this->groups = $groups; @@ -120,6 +126,16 @@ public function getCallable() return $this->callable; } + /** + * This method enables you to override the Route's callable + * + * @param string|\Closure $callable + */ + public function setCallable($callable) + { + $this->callable = $callable; + } + /** * Get route methods * @@ -246,7 +262,7 @@ public function getArguments() * Retrieve a specific route argument * * @param string $name - * @param mixed $default + * @param string|null $default * * @return mixed */ @@ -316,19 +332,7 @@ public function __invoke(ServerRequestInterface $request, ResponseInterface $res /** @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; - } - } + $newResponse = $handler($this->callable, $request, $response, $this->arguments); if ($newResponse instanceof ResponseInterface) { // if route callback returns a ResponseInterface, then use it @@ -340,18 +344,6 @@ public function __invoke(ServerRequestInterface $request, ResponseInterface $res } } - 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/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/RouteGroup.php b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/RouteGroup.php index a0cdf4d47d8d..8260bbd6c760 100644 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/RouteGroup.php +++ b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/RouteGroup.php @@ -1,9 +1,9 @@ bindTo($app); } - $callable(); + $callable($app); } } diff --git a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Router.php b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Router.php index b9d5d132ab2f..83116288c68c 100644 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Router.php +++ b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Router.php @@ -1,21 +1,21 @@ container = $container; + } + /** * Add route * @@ -153,7 +168,7 @@ public function map($methods, $pattern, $handler) $methods = array_map("strtoupper", $methods); // Add route - $route = new Route($methods, $pattern, $handler, $this->routeGroups, $this->routeCounter); + $route = $this->createRoute($methods, $pattern, $handler); $this->routes[$route->getIdentifier()] = $route; $this->routeCounter++; @@ -179,6 +194,25 @@ public function dispatch(ServerRequestInterface $request) ); } + /** + * Create a new Route object + * + * @param string[] $methods Array of HTTP methods + * @param string $pattern The route pattern + * @param callable $callable The route callable + * + * @return \Slim\Interfaces\RouteInterface + */ + protected function createRoute($methods, $pattern, $callable) + { + $route = new Route($methods, $pattern, $callable, $this->routeGroups, $this->routeCounter); + if (!empty($this->container)) { + $route->setContainer($this->container); + } + + return $route; + } + /** * @return \FastRoute\Dispatcher */ @@ -244,7 +278,7 @@ public function getNamedRoute($name) } throw new RuntimeException('Named route does not exist for name: ' . $name); } - + /** * Remove named route * diff --git a/samples/server/petstore-security-test/slim/vendor/slim/slim/composer.json b/samples/server/petstore-security-test/slim/vendor/slim/slim/composer.json index 808eb9d38577..554a838a95d5 100644 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/composer.json +++ b/samples/server/petstore-security-test/slim/vendor/slim/slim/composer.json @@ -3,7 +3,7 @@ "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", + "homepage": "https://slimframework.com", "license": "MIT", "authors": [ { @@ -32,7 +32,8 @@ "pimple/pimple": "^3.0", "psr/http-message": "^1.0", "nikic/fast-route": "^1.0", - "container-interop/container-interop": "^1.1" + "container-interop/container-interop": "^1.2", + "psr/container": "^1.0" }, "require-dev": { "squizlabs/php_codesniffer": "^2.5", diff --git a/samples/server/petstore-security-test/slim/vendor/slim/slim/example/.htaccess b/samples/server/petstore-security-test/slim/vendor/slim/slim/example/.htaccess deleted file mode 100644 index 0784bd22014a..000000000000 --- a/samples/server/petstore-security-test/slim/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/samples/server/petstore-security-test/slim/vendor/slim/slim/example/README.md b/samples/server/petstore-security-test/slim/vendor/slim/slim/example/README.md deleted file mode 100644 index e4fb35982c25..000000000000 --- a/samples/server/petstore-security-test/slim/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/samples/server/petstore-security-test/slim/vendor/slim/slim/example/index.php b/samples/server/petstore-security-test/slim/vendor/slim/slim/example/index.php deleted file mode 100644 index ef895f83f93b..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/example/index.php +++ /dev/null @@ -1,45 +0,0 @@ -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(); diff --git a/samples/server/petstore/php-slim/composer.lock b/samples/server/petstore/php-slim/composer.lock index 3007790bbebd..c31fb841c9b8 100644 --- a/samples/server/petstore/php-slim/composer.lock +++ b/samples/server/petstore/php-slim/composer.lock @@ -4,23 +4,25 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "834a8ce57aaea28f119aedff36481779", "content-hash": "913417690829da41975a473b88f30f64", "packages": [ { "name": "container-interop/container-interop", - "version": "1.1.0", + "version": "1.2.0", "source": { "type": "git", "url": "https://github.com/container-interop/container-interop.git", - "reference": "fc08354828f8fd3245f77a66b9e23a6bca48297e" + "reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/container-interop/container-interop/zipball/fc08354828f8fd3245f77a66b9e23a6bca48297e", - "reference": "fc08354828f8fd3245f77a66b9e23a6bca48297e", + "url": "https://api.github.com/repos/container-interop/container-interop/zipball/79cbf1341c22ec75643d841642dd5d6acd83bdb8", + "reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8", "shasum": "" }, + "require": { + "psr/container": "^1.0" + }, "type": "library", "autoload": { "psr-4": { @@ -32,25 +34,29 @@ "MIT" ], "description": "Promoting the interoperability of container objects (DIC, SL, etc.)", - "time": "2014-12-30 15:22:37" + "homepage": "https://github.com/container-interop/container-interop", + "time": "2017-02-14T19:40:03+00:00" }, { "name": "nikic/fast-route", - "version": "v1.0.1", + "version": "v1.3.0", "source": { "type": "git", "url": "https://github.com/nikic/FastRoute.git", - "reference": "8ea928195fa9b907f0d6e48312d323c1a13cc2af" + "reference": "181d480e08d9476e61381e04a71b34dc0432e812" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/FastRoute/zipball/8ea928195fa9b907f0d6e48312d323c1a13cc2af", - "reference": "8ea928195fa9b907f0d6e48312d323c1a13cc2af", + "url": "https://api.github.com/repos/nikic/FastRoute/zipball/181d480e08d9476e61381e04a71b34dc0432e812", + "reference": "181d480e08d9476e61381e04a71b34dc0432e812", "shasum": "" }, "require": { "php": ">=5.4.0" }, + "require-dev": { + "phpunit/phpunit": "^4.8.35|~5.7" + }, "type": "library", "autoload": { "psr-4": { @@ -75,29 +81,33 @@ "router", "routing" ], - "time": "2016-06-12 19:08:51" + "time": "2018-02-13T20:26:39+00:00" }, { "name": "pimple/pimple", - "version": "v3.0.2", + "version": "v3.2.3", "source": { "type": "git", "url": "https://github.com/silexphp/Pimple.git", - "reference": "a30f7d6e57565a2e1a316e1baf2a483f788b258a" + "reference": "9e403941ef9d65d20cba7d54e29fe906db42cf32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/silexphp/Pimple/zipball/a30f7d6e57565a2e1a316e1baf2a483f788b258a", - "reference": "a30f7d6e57565a2e1a316e1baf2a483f788b258a", + "url": "https://api.github.com/repos/silexphp/Pimple/zipball/9e403941ef9d65d20cba7d54e29fe906db42cf32", + "reference": "9e403941ef9d65d20cba7d54e29fe906db42cf32", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=5.3.0", + "psr/container": "^1.0" + }, + "require-dev": { + "symfony/phpunit-bridge": "^3.2" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0.x-dev" + "dev-master": "3.2.x-dev" } }, "autoload": { @@ -121,20 +131,69 @@ "container", "dependency injection" ], - "time": "2015-09-11 15:10:35" + "time": "2018-01-21T07:42:36+00:00" + }, + { + "name": "psr/container", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "time": "2017-02-14T16:28:37+00:00" }, { "name": "psr/http-message", - "version": "1.0", + "version": "1.0.1", "source": { "type": "git", "url": "https://github.com/php-fig/http-message.git", - "reference": "85d63699f0dbedb190bbd4b0d2b9dc707ea4c298" + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/85d63699f0dbedb190bbd4b0d2b9dc707ea4c298", - "reference": "85d63699f0dbedb190bbd4b0d2b9dc707ea4c298", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", "shasum": "" }, "require": { @@ -162,6 +221,7 @@ } ], "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", "keywords": [ "http", "http-message", @@ -170,27 +230,28 @@ "request", "response" ], - "time": "2015-05-04 20:22:00" + "time": "2016-08-06T14:39:51+00:00" }, { "name": "slim/slim", - "version": "3.4.2", + "version": "3.10.0", "source": { "type": "git", "url": "https://github.com/slimphp/Slim.git", - "reference": "a132385f736063d00632b52b3f8a389fe66fe4fa" + "reference": "d8aabeacc3688b25e2f2dd2db91df91ec6fdd748" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/slimphp/Slim/zipball/a132385f736063d00632b52b3f8a389fe66fe4fa", - "reference": "a132385f736063d00632b52b3f8a389fe66fe4fa", + "url": "https://api.github.com/repos/slimphp/Slim/zipball/d8aabeacc3688b25e2f2dd2db91df91ec6fdd748", + "reference": "d8aabeacc3688b25e2f2dd2db91df91ec6fdd748", "shasum": "" }, "require": { - "container-interop/container-interop": "^1.1", + "container-interop/container-interop": "^1.2", "nikic/fast-route": "^1.0", "php": ">=5.5.0", "pimple/pimple": "^3.0", + "psr/container": "^1.0", "psr/http-message": "^1.0" }, "provide": { @@ -233,14 +294,14 @@ } ], "description": "Slim is a PHP micro framework that helps you quickly write simple yet powerful web applications and APIs", - "homepage": "http://slimframework.com", + "homepage": "https://slimframework.com", "keywords": [ "api", "framework", "micro", "router" ], - "time": "2016-05-25 11:23:38" + "time": "2018-04-19T19:29:08+00:00" } ], "packages-dev": [], diff --git a/samples/server/petstore/php-slim/vendor/autoload.php b/samples/server/petstore/php-slim/vendor/autoload.php index a5bed55dcd23..58c1fa48aaaf 100644 --- a/samples/server/petstore/php-slim/vendor/autoload.php +++ b/samples/server/petstore/php-slim/vendor/autoload.php @@ -2,6 +2,6 @@ // autoload.php @generated by Composer -require_once __DIR__ . '/composer' . '/autoload_real.php'; +require_once __DIR__ . '/composer/autoload_real.php'; return ComposerAutoloaderInit8ad75658dadd8f07df6a5456dd736c25::getLoader(); diff --git a/samples/server/petstore/php-slim/vendor/composer/ClassLoader.php b/samples/server/petstore/php-slim/vendor/composer/ClassLoader.php index ff6ecfb822f8..dc02dfb114fb 100644 --- a/samples/server/petstore/php-slim/vendor/composer/ClassLoader.php +++ b/samples/server/petstore/php-slim/vendor/composer/ClassLoader.php @@ -53,8 +53,9 @@ class ClassLoader private $useIncludePath = false; private $classMap = array(); - private $classMapAuthoritative = false; + private $missingClasses = array(); + private $apcuPrefix; public function getPrefixes() { @@ -271,6 +272,26 @@ public function isClassMapAuthoritative() return $this->classMapAuthoritative; } + /** + * APCu prefix to use to cache found/not-found classes, if the extension is enabled. + * + * @param string|null $apcuPrefix + */ + public function setApcuPrefix($apcuPrefix) + { + $this->apcuPrefix = function_exists('apcu_fetch') && ini_get('apc.enabled') ? $apcuPrefix : null; + } + + /** + * The APCu prefix in use, or null if APCu caching is not enabled. + * + * @return string|null + */ + public function getApcuPrefix() + { + return $this->apcuPrefix; + } + /** * Registers this instance as an autoloader. * @@ -313,29 +334,34 @@ public function loadClass($class) */ 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) { + if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { return false; } + if (null !== $this->apcuPrefix) { + $file = apcu_fetch($this->apcuPrefix.$class, $hit); + if ($hit) { + return $file; + } + } $file = $this->findFileWithExtension($class, '.php'); // Search for Hack files if we are running on HHVM - if ($file === null && defined('HHVM_VERSION')) { + if (false === $file && defined('HHVM_VERSION')) { $file = $this->findFileWithExtension($class, '.hh'); } - if ($file === null) { + if (null !== $this->apcuPrefix) { + apcu_add($this->apcuPrefix.$class, $file); + } + + if (false === $file) { // Remember that this class does not exist. - return $this->classMap[$class] = false; + $this->missingClasses[$class] = true; } return $file; @@ -348,10 +374,14 @@ private function findFileWithExtension($class, $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))) { + $subPath = $class; + while (false !== $lastPos = strrpos($subPath, '\\')) { + $subPath = substr($subPath, 0, $lastPos); + $search = $subPath.'\\'; + if (isset($this->prefixDirsPsr4[$search])) { + $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); + foreach ($this->prefixDirsPsr4[$search] as $dir) { + if (file_exists($file = $dir . $pathEnd)) { return $file; } } @@ -399,6 +429,8 @@ private function findFileWithExtension($class, $ext) if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { return $file; } + + return false; } } diff --git a/samples/server/petstore/php-slim/vendor/composer/autoload_psr4.php b/samples/server/petstore/php-slim/vendor/composer/autoload_psr4.php index 7e403d2e2d0f..9c0b4719520a 100644 --- a/samples/server/petstore/php-slim/vendor/composer/autoload_psr4.php +++ b/samples/server/petstore/php-slim/vendor/composer/autoload_psr4.php @@ -8,6 +8,7 @@ return array( 'Slim\\' => array($vendorDir . '/slim/slim/Slim'), 'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src'), + 'Psr\\Container\\' => array($vendorDir . '/psr/container/src'), 'Interop\\Container\\' => array($vendorDir . '/container-interop/container-interop/src/Interop/Container'), 'FastRoute\\' => array($vendorDir . '/nikic/fast-route/src'), ); diff --git a/samples/server/petstore/php-slim/vendor/composer/autoload_real.php b/samples/server/petstore/php-slim/vendor/composer/autoload_real.php index 8911c4b258f5..2ebf2ad72869 100644 --- a/samples/server/petstore/php-slim/vendor/composer/autoload_real.php +++ b/samples/server/petstore/php-slim/vendor/composer/autoload_real.php @@ -23,24 +23,35 @@ public static function getLoader() self::$loader = $loader = new \Composer\Autoload\ClassLoader(); spl_autoload_unregister(array('ComposerAutoloaderInit8ad75658dadd8f07df6a5456dd736c25', 'loadClassLoader')); - $map = require __DIR__ . '/autoload_namespaces.php'; - foreach ($map as $namespace => $path) { - $loader->set($namespace, $path); - } + $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); + if ($useStaticLoader) { + require_once __DIR__ . '/autoload_static.php'; - $map = require __DIR__ . '/autoload_psr4.php'; - foreach ($map as $namespace => $path) { - $loader->setPsr4($namespace, $path); - } + call_user_func(\Composer\Autoload\ComposerStaticInit8ad75658dadd8f07df6a5456dd736c25::getInitializer($loader)); + } else { + $map = require __DIR__ . '/autoload_namespaces.php'; + foreach ($map as $namespace => $path) { + $loader->set($namespace, $path); + } - $classMap = require __DIR__ . '/autoload_classmap.php'; - if ($classMap) { - $loader->addClassMap($classMap); + $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); - $includeFiles = require __DIR__ . '/autoload_files.php'; + if ($useStaticLoader) { + $includeFiles = Composer\Autoload\ComposerStaticInit8ad75658dadd8f07df6a5456dd736c25::$files; + } else { + $includeFiles = require __DIR__ . '/autoload_files.php'; + } foreach ($includeFiles as $fileIdentifier => $file) { composerRequire8ad75658dadd8f07df6a5456dd736c25($fileIdentifier, $file); } diff --git a/samples/server/petstore/php-slim/vendor/composer/installed.json b/samples/server/petstore/php-slim/vendor/composer/installed.json index 9e041100fe23..f5c5dff605b8 100644 --- a/samples/server/petstore/php-slim/vendor/composer/installed.json +++ b/samples/server/petstore/php-slim/vendor/composer/installed.json @@ -1,20 +1,23 @@ [ { "name": "container-interop/container-interop", - "version": "1.1.0", - "version_normalized": "1.1.0.0", + "version": "1.2.0", + "version_normalized": "1.2.0.0", "source": { "type": "git", "url": "https://github.com/container-interop/container-interop.git", - "reference": "fc08354828f8fd3245f77a66b9e23a6bca48297e" + "reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/container-interop/container-interop/zipball/fc08354828f8fd3245f77a66b9e23a6bca48297e", - "reference": "fc08354828f8fd3245f77a66b9e23a6bca48297e", + "url": "https://api.github.com/repos/container-interop/container-interop/zipball/79cbf1341c22ec75643d841642dd5d6acd83bdb8", + "reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8", "shasum": "" }, - "time": "2014-12-30 15:22:37", + "require": { + "psr/container": "^1.0" + }, + "time": "2017-02-14T19:40:03+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -26,27 +29,31 @@ "license": [ "MIT" ], - "description": "Promoting the interoperability of container objects (DIC, SL, etc.)" + "description": "Promoting the interoperability of container objects (DIC, SL, etc.)", + "homepage": "https://github.com/container-interop/container-interop" }, { "name": "nikic/fast-route", - "version": "v1.0.1", - "version_normalized": "1.0.1.0", + "version": "v1.3.0", + "version_normalized": "1.3.0.0", "source": { "type": "git", "url": "https://github.com/nikic/FastRoute.git", - "reference": "8ea928195fa9b907f0d6e48312d323c1a13cc2af" + "reference": "181d480e08d9476e61381e04a71b34dc0432e812" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/FastRoute/zipball/8ea928195fa9b907f0d6e48312d323c1a13cc2af", - "reference": "8ea928195fa9b907f0d6e48312d323c1a13cc2af", + "url": "https://api.github.com/repos/nikic/FastRoute/zipball/181d480e08d9476e61381e04a71b34dc0432e812", + "reference": "181d480e08d9476e61381e04a71b34dc0432e812", "shasum": "" }, "require": { "php": ">=5.4.0" }, - "time": "2016-06-12 19:08:51", + "require-dev": { + "phpunit/phpunit": "^4.8.35|~5.7" + }, + "time": "2018-02-13T20:26:39+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -74,24 +81,76 @@ ] }, { - "name": "psr/http-message", - "version": "1.0", + "name": "pimple/pimple", + "version": "v3.2.3", + "version_normalized": "3.2.3.0", + "source": { + "type": "git", + "url": "https://github.com/silexphp/Pimple.git", + "reference": "9e403941ef9d65d20cba7d54e29fe906db42cf32" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/silexphp/Pimple/zipball/9e403941ef9d65d20cba7d54e29fe906db42cf32", + "reference": "9e403941ef9d65d20cba7d54e29fe906db42cf32", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "psr/container": "^1.0" + }, + "require-dev": { + "symfony/phpunit-bridge": "^3.2" + }, + "time": "2018-01-21T07:42:36+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2.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": "psr/container", + "version": "1.0.0", "version_normalized": "1.0.0.0", "source": { "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "85d63699f0dbedb190bbd4b0d2b9dc707ea4c298" + "url": "https://github.com/php-fig/container.git", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/85d63699f0dbedb190bbd4b0d2b9dc707ea4c298", - "reference": "85d63699f0dbedb190bbd4b0d2b9dc707ea4c298", + "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", "shasum": "" }, "require": { "php": ">=5.3.0" }, - "time": "2015-05-04 20:22:00", + "time": "2017-02-14T16:28:37+00:00", "type": "library", "extra": { "branch-alias": { @@ -101,7 +160,7 @@ "installation-source": "dist", "autoload": { "psr-4": { - "Psr\\Http\\Message\\": "src/" + "Psr\\Container\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -114,45 +173,45 @@ "homepage": "http://www.php-fig.org/" } ], - "description": "Common interface for HTTP messages", + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", "keywords": [ - "http", - "http-message", - "psr", - "psr-7", - "request", - "response" + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" ] }, { - "name": "pimple/pimple", - "version": "v3.0.2", - "version_normalized": "3.0.2.0", + "name": "psr/http-message", + "version": "1.0.1", + "version_normalized": "1.0.1.0", "source": { "type": "git", - "url": "https://github.com/silexphp/Pimple.git", - "reference": "a30f7d6e57565a2e1a316e1baf2a483f788b258a" + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/silexphp/Pimple/zipball/a30f7d6e57565a2e1a316e1baf2a483f788b258a", - "reference": "a30f7d6e57565a2e1a316e1baf2a483f788b258a", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", "shasum": "" }, "require": { "php": ">=5.3.0" }, - "time": "2015-09-11 15:10:35", + "time": "2016-08-06T14:39:51+00:00", "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0.x-dev" + "dev-master": "1.0.x-dev" } }, "installation-source": "dist", "autoload": { - "psr-0": { - "Pimple": "src/" + "psr-4": { + "Psr\\Http\\Message\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -161,37 +220,42 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" } ], - "description": "Pimple, a simple Dependency Injection Container", - "homepage": "http://pimple.sensiolabs.org", + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", "keywords": [ - "container", - "dependency injection" + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" ] }, { "name": "slim/slim", - "version": "3.4.2", - "version_normalized": "3.4.2.0", + "version": "3.10.0", + "version_normalized": "3.10.0.0", "source": { "type": "git", "url": "https://github.com/slimphp/Slim.git", - "reference": "a132385f736063d00632b52b3f8a389fe66fe4fa" + "reference": "d8aabeacc3688b25e2f2dd2db91df91ec6fdd748" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/slimphp/Slim/zipball/a132385f736063d00632b52b3f8a389fe66fe4fa", - "reference": "a132385f736063d00632b52b3f8a389fe66fe4fa", + "url": "https://api.github.com/repos/slimphp/Slim/zipball/d8aabeacc3688b25e2f2dd2db91df91ec6fdd748", + "reference": "d8aabeacc3688b25e2f2dd2db91df91ec6fdd748", "shasum": "" }, "require": { - "container-interop/container-interop": "^1.1", + "container-interop/container-interop": "^1.2", "nikic/fast-route": "^1.0", "php": ">=5.5.0", "pimple/pimple": "^3.0", + "psr/container": "^1.0", "psr/http-message": "^1.0" }, "provide": { @@ -201,7 +265,7 @@ "phpunit/phpunit": "^4.0", "squizlabs/php_codesniffer": "^2.5" }, - "time": "2016-05-25 11:23:38", + "time": "2018-04-19T19:29:08+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -236,7 +300,7 @@ } ], "description": "Slim is a PHP micro framework that helps you quickly write simple yet powerful web applications and APIs", - "homepage": "http://slimframework.com", + "homepage": "https://slimframework.com", "keywords": [ "api", "framework", diff --git a/samples/server/petstore/php-slim/vendor/container-interop/container-interop/README.md b/samples/server/petstore/php-slim/vendor/container-interop/container-interop/README.md index ec434d0f2683..cdd7a44c8ee8 100644 --- a/samples/server/petstore/php-slim/vendor/container-interop/container-interop/README.md +++ b/samples/server/petstore/php-slim/vendor/container-interop/container-interop/README.md @@ -1,11 +1,25 @@ # Container Interoperability [![Latest Stable Version](https://poser.pugx.org/container-interop/container-interop/v/stable.png)](https://packagist.org/packages/container-interop/container-interop) +[![Total Downloads](https://poser.pugx.org/container-interop/container-interop/downloads.svg)](https://packagist.org/packages/container-interop/container-interop) + +## Deprecation warning! + +Starting Feb. 13th 2017, container-interop is officially deprecated in favor of [PSR-11](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-11-container.md). +Container-interop has been the test-bed of PSR-11. From v1.2, container-interop directly extends PSR-11 interfaces. +Therefore, all containers implementing container-interop are now *de-facto* compatible with PSR-11. + +- Projects implementing container-interop interfaces are encouraged to directly implement PSR-11 interfaces instead. +- Projects consuming container-interop interfaces are very strongly encouraged to directly type-hint on PSR-11 interfaces, in order to be compatible with PSR-11 containers that are not compatible with container-interop. + +Regarding the delegate lookup feature, that is present in container-interop and not in PSR-11, the feature is actually a design pattern. It is therefore not deprecated. Documentation regarding this design pattern will be migrated from this repository into a separate website in the future. + +## About *container-interop* tries to identify and standardize features in *container* objects (service locators, -dependency injection containers, etc.) to achieve interopererability. +dependency injection containers, etc.) to achieve interoperability. -Through discussions and trials, we try to create a standard, made of common interfaces but also recommendations. +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 @@ -22,11 +36,7 @@ this project will pave the way for one or more future PSRs. You can install this package through Composer: ```json -{ - "require": { - "container-interop/container-interop": "~1.0" - } -} +composer require container-interop/container-interop ``` The packages adheres to the [SemVer](http://semver.org/) specification, and there will be full backward compatibility @@ -41,7 +51,7 @@ between minor versions. 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 +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 @@ -52,19 +62,72 @@ View open [request for comments](https://github.com/container-interop/container- ### Projects implementing `ContainerInterface` -- [Acclimate](https://github.com/jeremeamia/acclimate-container) -- [dcp-di](https://github.com/estelsmith/dcp-di) +- [Acclimate](https://github.com/jeremeamia/acclimate-container): Adapters for + Aura.Di, Laravel, Nette DI, Pimple, Symfony DI, ZF2 Service manager, ZF2 + Dependency injection and any container using `ArrayAccess` +- [Aura.Di](https://github.com/auraphp/Aura.Di) +- [auryn-container-interop](https://github.com/elazar/auryn-container-interop) +- [Burlap](https://github.com/codeeverything/burlap) +- [Chernozem](https://github.com/pyrsmk/Chernozem) +- [Data Manager](https://github.com/chrismichaels84/data-manager) +- [Disco](https://github.com/bitexpert/disco) +- [InDI](https://github.com/idealogica/indi) +- [League/Container](http://container.thephpleague.com/) - [Mouf](http://mouf-php.com) - [Njasm Container](https://github.com/njasm/container) - [PHP-DI](http://php-di.org) +- [Picotainer](https://github.com/thecodingmachine/picotainer) - [PimpleInterop](https://github.com/moufmouf/pimple-interop) +- [Pimple3-ContainerInterop](https://github.com/Sam-Burns/pimple3-containerinterop) (using Pimple v3) +- [SitePoint Container](https://github.com/sitepoint/Container) +- [Thruster Container](https://github.com/ThrusterIO/container) (PHP7 only) +- [Ultra-Lite Container](https://github.com/ultra-lite/container) +- [Unbox](https://github.com/mindplay-dk/unbox) - [XStatic](https://github.com/jeremeamia/xstatic) +- [Zend\ServiceManager](https://github.com/zendframework/zend-servicemanager) +- [Zit](https://github.com/inxilpro/Zit) ### Projects implementing the *delegate lookup* feature +- [Aura.Di](https://github.com/auraphp/Aura.Di) +- [Burlap](https://github.com/codeeverything/burlap) +- [Chernozem](https://github.com/pyrsmk/Chernozem) +- [InDI](https://github.com/idealogica/indi) +- [League/Container](http://container.thephpleague.com/) - [Mouf](http://mouf-php.com) +- [Picotainer](https://github.com/thecodingmachine/picotainer) - [PHP-DI](http://php-di.org) - [PimpleInterop](https://github.com/moufmouf/pimple-interop) +- [Ultra-Lite Container](https://github.com/ultra-lite/container) + +### Middlewares implementing `ContainerInterface` + +- [Alias-Container](https://github.com/thecodingmachine/alias-container): add + aliases support to any container +- [Prefixer-Container](https://github.com/thecodingmachine/prefixer-container): + dynamically prefix identifiers +- [Lazy-Container](https://github.com/snapshotpl/lazy-container): lazy services + +### Projects using `ContainerInterface` + +The list below contains only a sample of all the projects consuming `ContainerInterface`. For a more complete list have a look [here](http://packanalyst.com/class?q=Interop%5CContainer%5CContainerInterface). + +| | Downloads | +| --- | --- | +| [Adroit](https://github.com/bitexpert/adroit) | ![](https://img.shields.io/packagist/dt/bitexpert/adroit.svg) | +| [Behat](https://github.com/Behat/Behat/pull/974) | ![](https://img.shields.io/packagist/dt/behat/behat.svg) | +| [blast-facades](https://github.com/phpthinktank/blast-facades): Minimize complexity and represent dependencies as facades. | ![](https://img.shields.io/packagist/dt/blast/facades.svg) | +| [interop.silex.di](https://github.com/thecodingmachine/interop.silex.di): an extension to [Silex](http://silex.sensiolabs.org/) that adds support for any *container-interop* compatible container | ![](https://img.shields.io/packagist/dt/mouf/interop.silex.di.svg) | +| [mindplay/walkway](https://github.com/mindplay-dk/walkway): a modular request router | ![](https://img.shields.io/packagist/dt/mindplay/walkway.svg) | +| [mindplay/middleman](https://github.com/mindplay-dk/middleman): minimalist PSR-7 middleware dispatcher | ![](https://img.shields.io/packagist/dt/mindplay/middleman.svg) | +| [PHP-DI/Invoker](https://github.com/PHP-DI/Invoker): extensible and configurable invoker/dispatcher | ![](https://img.shields.io/packagist/dt/php-di/invoker.svg) | +| [Prophiler](https://github.com/fabfuel/prophiler) | ![](https://img.shields.io/packagist/dt/fabfuel/prophiler.svg) | +| [Silly](https://github.com/mnapoli/silly): CLI micro-framework | ![](https://img.shields.io/packagist/dt/mnapoli/silly.svg) | +| [Slim v3](https://github.com/slimphp/Slim) | ![](https://img.shields.io/packagist/dt/slim/slim.svg) | +| [Splash](http://mouf-php.com/packages/mouf/mvc.splash-common/version/8.0-dev/README.md) | ![](https://img.shields.io/packagist/dt/mouf/mvc.splash-common.svg) | +| [Woohoo Labs. Harmony](https://github.com/woohoolabs/harmony): a flexible micro-framework | ![](https://img.shields.io/packagist/dt/woohoolabs/harmony.svg) | +| [zend-expressive](https://github.com/zendframework/zend-expressive) | ![](https://img.shields.io/packagist/dt/zendframework/zend-expressive.svg) | + ## Workflow diff --git a/samples/server/petstore/php-slim/vendor/container-interop/container-interop/composer.json b/samples/server/petstore/php-slim/vendor/container-interop/container-interop/composer.json index 84f38752822f..855f766723a0 100644 --- a/samples/server/petstore/php-slim/vendor/container-interop/container-interop/composer.json +++ b/samples/server/petstore/php-slim/vendor/container-interop/container-interop/composer.json @@ -2,10 +2,14 @@ "name": "container-interop/container-interop", "type": "library", "description": "Promoting the interoperability of container objects (DIC, SL, etc.)", + "homepage": "https://github.com/container-interop/container-interop", "license": "MIT", "autoload": { "psr-4": { "Interop\\Container\\": "src/Interop/Container/" } + }, + "require": { + "psr/container": "^1.0" } } diff --git a/samples/server/petstore/php-slim/vendor/container-interop/container-interop/docs/ContainerInterface-meta.md b/samples/server/petstore/php-slim/vendor/container-interop/container-interop/docs/ContainerInterface-meta.md index 90711c9051d2..59f3d5599faf 100644 --- a/samples/server/petstore/php-slim/vendor/container-interop/container-interop/docs/ContainerInterface-meta.md +++ b/samples/server/petstore/php-slim/vendor/container-interop/container-interop/docs/ContainerInterface-meta.md @@ -54,7 +54,7 @@ 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 +- some containers have an optional additional argument for `get()`, but it doesn't have 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 diff --git a/samples/server/petstore/php-slim/vendor/container-interop/container-interop/docs/ContainerInterface.md b/samples/server/petstore/php-slim/vendor/container-interop/container-interop/docs/ContainerInterface.md index b670aa133b4e..bda973d6fce1 100644 --- a/samples/server/petstore/php-slim/vendor/container-interop/container-interop/docs/ContainerInterface.md +++ b/samples/server/petstore/php-slim/vendor/container-interop/container-interop/docs/ContainerInterface.md @@ -11,7 +11,7 @@ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", 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. +implementing the `ContainerInterface` in a dependency injection-related library or framework. Users of dependency injections containers (DIC) are referred to as `user`. [RFC 2119]: http://tools.ietf.org/html/rfc2119 @@ -31,50 +31,52 @@ Users of dependency injections containers (DIC) are referred to as `user`. `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. - + `has($id)` returning true does not mean that `get($id)` will not throw an exception. + It does however mean that `get($id)` will not throw a `NotFoundException`. + ### 1.2 Exceptions -Exceptions directly thrown by the container MUST implement the +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 +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 +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. +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 +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, +- 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 +- 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 +- 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 +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 @@ -114,6 +116,9 @@ interface ContainerInterface * Returns true if the container can return an entry for the given identifier. * Returns false otherwise. * + * `has($id)` returning true does not mean that `get($id)` will not throw an exception. + * It does however mean that `get($id)` will not throw a `NotFoundException`. + * * @param string $id Identifier of the entry to look for. * * @return boolean diff --git a/samples/server/petstore/php-slim/vendor/container-interop/container-interop/docs/Delegate-lookup-meta.md b/samples/server/petstore/php-slim/vendor/container-interop/container-interop/docs/Delegate-lookup-meta.md index d21ebf928f8e..6048b73e290e 100644 --- a/samples/server/petstore/php-slim/vendor/container-interop/container-interop/docs/Delegate-lookup-meta.md +++ b/samples/server/petstore/php-slim/vendor/container-interop/container-interop/docs/Delegate-lookup-meta.md @@ -89,16 +89,16 @@ In the example above, "container 2" contains a controller "myController" and the 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 +However, using the *delegate lookup* feature, here is what happens when we ask the composite container 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. +- The composite container asks container 1 if if contains the "myController" instance. The answer is no. +- The composite container asks container 2 if if contains the "myController" instance. The answer is yes. +- The composite container 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. +- Container 2 delegates the lookup of "entityManager" to the composite container. +- The composite container asks container 1 if if contains the "entityManager" instance. The answer is yes. +- The composite container 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. diff --git a/samples/server/petstore/php-slim/vendor/container-interop/container-interop/docs/Delegate-lookup.md b/samples/server/petstore/php-slim/vendor/container-interop/container-interop/docs/Delegate-lookup.md index 63cc3fb0f40b..f64a8f785a84 100644 --- a/samples/server/petstore/php-slim/vendor/container-interop/container-interop/docs/Delegate-lookup.md +++ b/samples/server/petstore/php-slim/vendor/container-interop/container-interop/docs/Delegate-lookup.md @@ -3,10 +3,10 @@ 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. +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 +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", @@ -36,22 +36,22 @@ fetching the dependencies from. 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, +- 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 + 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 +- 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 +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 diff --git a/samples/server/petstore/php-slim/vendor/container-interop/container-interop/docs/images/interoperating_containers.png b/samples/server/petstore/php-slim/vendor/container-interop/container-interop/docs/images/interoperating_containers.png index eddc8a52906d53746438e09c9bdf2bc503902b6e..1d3fdd0ddbea28d77c08cfb65834ec11357be5fb 100644 GIT binary patch literal 25738 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 diff --git a/samples/server/petstore/php-slim/vendor/container-interop/container-interop/docs/images/priority.png b/samples/server/petstore/php-slim/vendor/container-interop/container-interop/docs/images/priority.png index d2ae7942a64fc82cea3b0569d1efffd8d884a269..d02cb7d1f1ed29c6fa87a269cdd8955e0e907a4c 100644 GIT binary patch literal 16252 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 ?classname, - 'dataGenerator' => ?classname, - 'dispatcher' => ?classname, - 'routeCollector' => ?classname, + ?'routeParser' => classname, + ?'dataGenerator' => classname, + ?'dispatcher' => classname, + ?'routeCollector' => classname, ) $options = shape()): Dispatcher; function cachedDispatcher( (function(RouteCollector): void) $routeDefinitionCallback, shape( - 'routeParser' => ?classname, - 'dataGenerator' => ?classname, - 'dispatcher' => ?classname, - 'routeCollector' => ?classname, - 'cacheDisabled' => ?bool, - 'cacheFile' => ?string, + ?'routeParser' => classname, + ?'dataGenerator' => classname, + ?'dispatcher' => classname, + ?'routeCollector' => classname, + ?'cacheDisabled' => bool, + ?'cacheFile' => string, ) $options = shape()): Dispatcher; } diff --git a/samples/server/petstore/php-slim/vendor/nikic/fast-route/README.md b/samples/server/petstore/php-slim/vendor/nikic/fast-route/README.md index f812a2a014ca..91bd4664e031 100644 --- a/samples/server/petstore/php-slim/vendor/nikic/fast-route/README.md +++ b/samples/server/petstore/php-slim/vendor/nikic/fast-route/README.md @@ -122,6 +122,46 @@ The `$handler` parameter does not necessarily have to be a callback, it could al 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. +#### Shorcut methods for common request methods + +For the `GET`, `POST`, `PUT`, `PATCH`, `DELETE` and `HEAD` request methods shortcut methods are available. For example: + +```php +$r->get('/get-route', 'get_handler'); +$r->post('/post-route', 'post_handler'); +``` + +Is equivalent to: + +```php +$r->addRoute('GET', '/get-route', 'get_handler'); +$r->addRoute('POST', '/post-route', 'post_handler'); +``` + +#### Route Groups + +Additionally, you can specify routes inside of a group. All routes defined inside a group will have a common prefix. + +For example, defining your routes as: + +```php +$r->addGroup('/admin', function (RouteCollector $r) { + $r->addRoute('GET', '/do-something', 'handler'); + $r->addRoute('GET', '/do-another-thing', 'handler'); + $r->addRoute('GET', '/do-something-else', 'handler'); +}); +``` + +Will have the same result as: + + ```php +$r->addRoute('GET', '/admin/do-something', 'handler'); +$r->addRoute('GET', '/admin/do-another-thing', 'handler'); +$r->addRoute('GET', '/admin/do-something-else', 'handler'); + ``` + +Nested groups are also supported, in which case the prefixes of all the nested groups are combined. + ### Caching The reason `simpleDispatcher` accepts a callback for defining the routes is to allow seamless diff --git a/samples/server/petstore/php-slim/vendor/nikic/fast-route/composer.json b/samples/server/petstore/php-slim/vendor/nikic/fast-route/composer.json index 62aad22b0ce0..fb446a2abfbc 100644 --- a/samples/server/petstore/php-slim/vendor/nikic/fast-route/composer.json +++ b/samples/server/petstore/php-slim/vendor/nikic/fast-route/composer.json @@ -9,13 +9,16 @@ "email": "nikic@php.net" } ], - "require": { - "php": ">=5.4.0" - }, "autoload": { "psr-4": { "FastRoute\\": "src/" }, "files": ["src/functions.php"] + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35|~5.7" } } diff --git a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/BadRouteException.php b/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/BadRouteException.php index 7e38479661e0..62262ec66f66 100644 --- a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/BadRouteException.php +++ b/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/BadRouteException.php @@ -2,5 +2,6 @@ namespace FastRoute; -class BadRouteException extends \LogicException { +class BadRouteException extends \LogicException +{ } diff --git a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/DataGenerator.php b/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/DataGenerator.php index 16053db92ae2..af577cd54370 100644 --- a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/DataGenerator.php +++ b/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/DataGenerator.php @@ -2,7 +2,8 @@ namespace FastRoute; -interface DataGenerator { +interface DataGenerator +{ /** * Adds a route to the data generator. The route data uses the * same format that is returned by RouterParser::parser(). diff --git a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/DataGenerator/CharCountBased.php b/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/DataGenerator/CharCountBased.php index 5c38b89e3d26..3cfeed66f3e8 100644 --- a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/DataGenerator/CharCountBased.php +++ b/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/DataGenerator/CharCountBased.php @@ -2,12 +2,15 @@ namespace FastRoute\DataGenerator; -class CharCountBased extends RegexBasedAbstract { - protected function getApproxChunkSize() { +class CharCountBased extends RegexBasedAbstract +{ + protected function getApproxChunkSize() + { return 30; } - protected function processChunk($regexToRoutesMap) { + protected function processChunk($regexToRoutesMap) + { $routeMap = []; $regexes = []; diff --git a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/DataGenerator/GroupCountBased.php b/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/DataGenerator/GroupCountBased.php index d51807f0772c..54d9a05e20b6 100644 --- a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/DataGenerator/GroupCountBased.php +++ b/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/DataGenerator/GroupCountBased.php @@ -2,12 +2,15 @@ namespace FastRoute\DataGenerator; -class GroupCountBased extends RegexBasedAbstract { - protected function getApproxChunkSize() { +class GroupCountBased extends RegexBasedAbstract +{ + protected function getApproxChunkSize() + { return 10; } - protected function processChunk($regexToRoutesMap) { + protected function processChunk($regexToRoutesMap) + { $routeMap = []; $regexes = []; $numGroups = 0; @@ -25,4 +28,3 @@ protected function processChunk($regexToRoutesMap) { return ['regex' => $regex, 'routeMap' => $routeMap]; } } - diff --git a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/DataGenerator/GroupPosBased.php b/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/DataGenerator/GroupPosBased.php index 4152f7a7efc9..fc4dc0aff639 100644 --- a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/DataGenerator/GroupPosBased.php +++ b/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/DataGenerator/GroupPosBased.php @@ -2,12 +2,15 @@ namespace FastRoute\DataGenerator; -class GroupPosBased extends RegexBasedAbstract { - protected function getApproxChunkSize() { +class GroupPosBased extends RegexBasedAbstract +{ + protected function getApproxChunkSize() + { return 10; } - protected function processChunk($regexToRoutesMap) { + protected function processChunk($regexToRoutesMap) + { $routeMap = []; $regexes = []; $offset = 1; @@ -22,4 +25,3 @@ protected function processChunk($regexToRoutesMap) { return ['regex' => $regex, 'routeMap' => $routeMap]; } } - diff --git a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/DataGenerator/MarkBased.php b/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/DataGenerator/MarkBased.php index 61359f5e73f6..0aebed9a1614 100644 --- a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/DataGenerator/MarkBased.php +++ b/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/DataGenerator/MarkBased.php @@ -2,12 +2,15 @@ namespace FastRoute\DataGenerator; -class MarkBased extends RegexBasedAbstract { - protected function getApproxChunkSize() { +class MarkBased extends RegexBasedAbstract +{ + protected function getApproxChunkSize() + { return 30; } - protected function processChunk($regexToRoutesMap) { + protected function processChunk($regexToRoutesMap) + { $routeMap = []; $regexes = []; $markName = 'a'; @@ -22,4 +25,3 @@ protected function processChunk($regexToRoutesMap) { return ['regex' => $regex, 'routeMap' => $routeMap]; } } - diff --git a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php b/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php index 713d8972f5ae..645729059925 100644 --- a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php +++ b/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php @@ -2,18 +2,30 @@ namespace FastRoute\DataGenerator; -use FastRoute\DataGenerator; use FastRoute\BadRouteException; +use FastRoute\DataGenerator; use FastRoute\Route; -abstract class RegexBasedAbstract implements DataGenerator { +abstract class RegexBasedAbstract implements DataGenerator +{ + /** @var mixed[][] */ protected $staticRoutes = []; + + /** @var Route[][] */ protected $methodToRegexToRoutesMap = []; - protected abstract function getApproxChunkSize(); - protected abstract function processChunk($regexToRoutesMap); + /** + * @return int + */ + abstract protected function getApproxChunkSize(); + + /** + * @return mixed[] + */ + abstract protected function processChunk($regexToRoutesMap); - public function addRoute($httpMethod, $routeData, $handler) { + public function addRoute($httpMethod, $routeData, $handler) + { if ($this->isStaticRoute($routeData)) { $this->addStaticRoute($httpMethod, $routeData, $handler); } else { @@ -21,7 +33,11 @@ public function addRoute($httpMethod, $routeData, $handler) { } } - public function getData() { + /** + * @return mixed[] + */ + public function getData() + { if (empty($this->methodToRegexToRoutesMap)) { return [$this->staticRoutes, []]; } @@ -29,26 +45,41 @@ public function getData() { return [$this->staticRoutes, $this->generateVariableRouteData()]; } - private function generateVariableRouteData() { + /** + * @return mixed[] + */ + 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); + $data[$method] = array_map([$this, 'processChunk'], $chunks); } return $data; } - private function computeChunkSize($count) { + /** + * @param int + * @return int + */ + private function computeChunkSize($count) + { $numParts = max(1, round($count / $this->getApproxChunkSize())); - return ceil($count / $numParts); + return (int) ceil($count / $numParts); } - private function isStaticRoute($routeData) { + /** + * @param mixed[] + * @return bool + */ + private function isStaticRoute($routeData) + { return count($routeData) === 1 && is_string($routeData[0]); } - private function addStaticRoute($httpMethod, $routeData, $handler) { + private function addStaticRoute($httpMethod, $routeData, $handler) + { $routeStr = $routeData[0]; if (isset($this->staticRoutes[$httpMethod][$routeStr])) { @@ -72,7 +103,8 @@ private function addStaticRoute($httpMethod, $routeData, $handler) { $this->staticRoutes[$httpMethod][$routeStr] = $handler; } - private function addVariableRoute($httpMethod, $routeData, $handler) { + private function addVariableRoute($httpMethod, $routeData, $handler) + { list($regex, $variables) = $this->buildRegexForRoute($routeData); if (isset($this->methodToRegexToRoutesMap[$httpMethod][$regex])) { @@ -87,7 +119,12 @@ private function addVariableRoute($httpMethod, $routeData, $handler) { ); } - private function buildRegexForRoute($routeData) { + /** + * @param mixed[] + * @return mixed[] + */ + private function buildRegexForRoute($routeData) + { $regex = ''; $variables = []; foreach ($routeData as $part) { @@ -118,14 +155,19 @@ private function buildRegexForRoute($routeData) { return [$regex, $variables]; } - private function regexHasCapturingGroups($regex) { + /** + * @param string + * @return bool + */ + 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( + return (bool) preg_match( '~ (?: \(\?\( diff --git a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Dispatcher.php b/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Dispatcher.php index ea98009bd264..4ae72a356b65 100644 --- a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Dispatcher.php +++ b/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Dispatcher.php @@ -2,7 +2,8 @@ namespace FastRoute; -interface Dispatcher { +interface Dispatcher +{ const NOT_FOUND = 0; const FOUND = 1; const METHOD_NOT_ALLOWED = 2; diff --git a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Dispatcher/CharCountBased.php b/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Dispatcher/CharCountBased.php index 22ba2406f1e8..ef1eec1345ea 100644 --- a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Dispatcher/CharCountBased.php +++ b/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Dispatcher/CharCountBased.php @@ -2,12 +2,15 @@ namespace FastRoute\Dispatcher; -class CharCountBased extends RegexBasedAbstract { - public function __construct($data) { +class CharCountBased extends RegexBasedAbstract +{ + public function __construct($data) + { list($this->staticRouteMap, $this->variableRouteData) = $data; } - protected function dispatchVariableRoute($routeData, $uri) { + protected function dispatchVariableRoute($routeData, $uri) + { foreach ($routeData as $data) { if (!preg_match($data['regex'], $uri . $data['suffix'], $matches)) { continue; diff --git a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Dispatcher/GroupCountBased.php b/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Dispatcher/GroupCountBased.php index 0abd32231309..493e7a94f08f 100644 --- a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Dispatcher/GroupCountBased.php +++ b/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Dispatcher/GroupCountBased.php @@ -2,12 +2,15 @@ namespace FastRoute\Dispatcher; -class GroupCountBased extends RegexBasedAbstract { - public function __construct($data) { +class GroupCountBased extends RegexBasedAbstract +{ + public function __construct($data) + { list($this->staticRouteMap, $this->variableRouteData) = $data; } - protected function dispatchVariableRoute($routeData, $uri) { + protected function dispatchVariableRoute($routeData, $uri) + { foreach ($routeData as $data) { if (!preg_match($data['regex'], $uri, $matches)) { continue; diff --git a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Dispatcher/GroupPosBased.php b/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Dispatcher/GroupPosBased.php index 32227d4944d2..498220ed6f7c 100644 --- a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Dispatcher/GroupPosBased.php +++ b/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Dispatcher/GroupPosBased.php @@ -2,12 +2,15 @@ namespace FastRoute\Dispatcher; -class GroupPosBased extends RegexBasedAbstract { - public function __construct($data) { +class GroupPosBased extends RegexBasedAbstract +{ + public function __construct($data) + { list($this->staticRouteMap, $this->variableRouteData) = $data; } - protected function dispatchVariableRoute($routeData, $uri) { + protected function dispatchVariableRoute($routeData, $uri) + { foreach ($routeData as $data) { if (!preg_match($data['regex'], $uri, $matches)) { continue; diff --git a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Dispatcher/MarkBased.php b/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Dispatcher/MarkBased.php index fefa71185711..22eb09ba575f 100644 --- a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Dispatcher/MarkBased.php +++ b/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Dispatcher/MarkBased.php @@ -2,12 +2,15 @@ namespace FastRoute\Dispatcher; -class MarkBased extends RegexBasedAbstract { - public function __construct($data) { +class MarkBased extends RegexBasedAbstract +{ + public function __construct($data) + { list($this->staticRouteMap, $this->variableRouteData) = $data; } - protected function dispatchVariableRoute($routeData, $uri) { + protected function dispatchVariableRoute($routeData, $uri) + { foreach ($routeData as $data) { if (!preg_match($data['regex'], $uri, $matches)) { continue; diff --git a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Dispatcher/RegexBasedAbstract.php b/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Dispatcher/RegexBasedAbstract.php index 8823b9b25280..206e879f7b25 100644 --- a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Dispatcher/RegexBasedAbstract.php +++ b/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Dispatcher/RegexBasedAbstract.php @@ -4,13 +4,21 @@ use FastRoute\Dispatcher; -abstract class RegexBasedAbstract implements Dispatcher { - protected $staticRouteMap; - protected $variableRouteData; +abstract class RegexBasedAbstract implements Dispatcher +{ + /** @var mixed[][] */ + protected $staticRouteMap = []; - protected abstract function dispatchVariableRoute($routeData, $uri); + /** @var mixed[] */ + protected $variableRouteData = []; - public function dispatch($httpMethod, $uri) { + /** + * @return mixed[] + */ + abstract protected function dispatchVariableRoute($routeData, $uri); + + public function dispatch($httpMethod, $uri) + { if (isset($this->staticRouteMap[$httpMethod][$uri])) { $handler = $this->staticRouteMap[$httpMethod][$uri]; return [self::FOUND, $handler, []]; @@ -73,8 +81,8 @@ public function dispatch($httpMethod, $uri) { // 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]; } + + return [self::NOT_FOUND]; } } diff --git a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Route.php b/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Route.php index d71ded18ad24..e1bf7dd97222 100644 --- a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Route.php +++ b/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Route.php @@ -2,10 +2,18 @@ namespace FastRoute; -class Route { +class Route +{ + /** @var string */ public $httpMethod; + + /** @var string */ public $regex; + + /** @var array */ public $variables; + + /** @var mixed */ public $handler; /** @@ -16,7 +24,8 @@ class Route { * @param string $regex * @param array $variables */ - public function __construct($httpMethod, $handler, $regex, $variables) { + public function __construct($httpMethod, $handler, $regex, $variables) + { $this->httpMethod = $httpMethod; $this->handler = $handler; $this->regex = $regex; @@ -30,9 +39,9 @@ public function __construct($httpMethod, $handler, $regex, $variables) { * * @return bool */ - public function matches($str) { + public function matches($str) + { $regex = '~^' . $this->regex . '$~'; return (bool) preg_match($regex, $str); } } - diff --git a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/RouteCollector.php b/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/RouteCollector.php index 4386bbf3aacc..c1c1762d8d3a 100644 --- a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/RouteCollector.php +++ b/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/RouteCollector.php @@ -2,9 +2,16 @@ namespace FastRoute; -class RouteCollector { - private $routeParser; - private $dataGenerator; +class RouteCollector +{ + /** @var RouteParser */ + protected $routeParser; + + /** @var DataGenerator */ + protected $dataGenerator; + + /** @var string */ + protected $currentGroupPrefix; /** * Constructs a route collector. @@ -12,9 +19,11 @@ class RouteCollector { * @param RouteParser $routeParser * @param DataGenerator $dataGenerator */ - public function __construct(RouteParser $routeParser, DataGenerator $dataGenerator) { + public function __construct(RouteParser $routeParser, DataGenerator $dataGenerator) + { $this->routeParser = $routeParser; $this->dataGenerator = $dataGenerator; + $this->currentGroupPrefix = ''; } /** @@ -26,7 +35,9 @@ public function __construct(RouteParser $routeParser, DataGenerator $dataGenerat * @param string $route * @param mixed $handler */ - public function addRoute($httpMethod, $route, $handler) { + public function addRoute($httpMethod, $route, $handler) + { + $route = $this->currentGroupPrefix . $route; $routeDatas = $this->routeParser->parse($route); foreach ((array) $httpMethod as $method) { foreach ($routeDatas as $routeData) { @@ -35,12 +46,107 @@ public function addRoute($httpMethod, $route, $handler) { } } + /** + * Create a route group with a common prefix. + * + * All routes created in the passed callback will have the given group prefix prepended. + * + * @param string $prefix + * @param callable $callback + */ + public function addGroup($prefix, callable $callback) + { + $previousGroupPrefix = $this->currentGroupPrefix; + $this->currentGroupPrefix = $previousGroupPrefix . $prefix; + $callback($this); + $this->currentGroupPrefix = $previousGroupPrefix; + } + + /** + * Adds a GET route to the collection + * + * This is simply an alias of $this->addRoute('GET', $route, $handler) + * + * @param string $route + * @param mixed $handler + */ + public function get($route, $handler) + { + $this->addRoute('GET', $route, $handler); + } + + /** + * Adds a POST route to the collection + * + * This is simply an alias of $this->addRoute('POST', $route, $handler) + * + * @param string $route + * @param mixed $handler + */ + public function post($route, $handler) + { + $this->addRoute('POST', $route, $handler); + } + + /** + * Adds a PUT route to the collection + * + * This is simply an alias of $this->addRoute('PUT', $route, $handler) + * + * @param string $route + * @param mixed $handler + */ + public function put($route, $handler) + { + $this->addRoute('PUT', $route, $handler); + } + + /** + * Adds a DELETE route to the collection + * + * This is simply an alias of $this->addRoute('DELETE', $route, $handler) + * + * @param string $route + * @param mixed $handler + */ + public function delete($route, $handler) + { + $this->addRoute('DELETE', $route, $handler); + } + + /** + * Adds a PATCH route to the collection + * + * This is simply an alias of $this->addRoute('PATCH', $route, $handler) + * + * @param string $route + * @param mixed $handler + */ + public function patch($route, $handler) + { + $this->addRoute('PATCH', $route, $handler); + } + + /** + * Adds a HEAD route to the collection + * + * This is simply an alias of $this->addRoute('HEAD', $route, $handler) + * + * @param string $route + * @param mixed $handler + */ + public function head($route, $handler) + { + $this->addRoute('HEAD', $route, $handler); + } + /** * Returns the collected route data, as provided by the data generator. * * @return array */ - public function getData() { + public function getData() + { return $this->dataGenerator->getData(); } } diff --git a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/RouteParser.php b/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/RouteParser.php index c089c3151632..6a7685cfed6c 100644 --- a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/RouteParser.php +++ b/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/RouteParser.php @@ -2,7 +2,8 @@ namespace FastRoute; -interface RouteParser { +interface RouteParser +{ /** * Parses a route string into multiple route data arrays. * @@ -29,7 +30,7 @@ interface RouteParser { * 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/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/RouteParser/Std.php b/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/RouteParser/Std.php index a6c21bdc613f..4fbdee129836 100644 --- a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/RouteParser/Std.php +++ b/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/RouteParser/Std.php @@ -10,7 +10,8 @@ * * "/user/{name}[/{id:[0-9]+}]" */ -class Std implements RouteParser { +class Std implements RouteParser +{ const VARIABLE_REGEX = <<<'REGEX' \{ \s* ([a-zA-Z_][a-zA-Z0-9_-]*) \s* @@ -21,7 +22,8 @@ class Std implements RouteParser { REGEX; const DEFAULT_DISPATCH_REGEX = '[^/]+'; - public function parse($route) { + public function parse($route) + { $routeWithoutClosingOptionals = rtrim($route, ']'); $numOptionals = strlen($route) - strlen($routeWithoutClosingOptionals); @@ -30,7 +32,7 @@ public function parse($route) { 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('Optional segments can only occur at the end of a route'); } throw new BadRouteException("Number of opening '[' and closing ']' does not match"); } @@ -39,7 +41,7 @@ public function parse($route) { $routeDatas = []; foreach ($segments as $n => $segment) { if ($segment === '' && $n !== 0) { - throw new BadRouteException("Empty optional part"); + throw new BadRouteException('Empty optional part'); } $currentRoute .= $segment; @@ -50,8 +52,12 @@ public function parse($route) { /** * Parses a route string that does not contain optional segments. + * + * @param string + * @return mixed[] */ - private function parsePlaceholders($route) { + private function parsePlaceholders($route) + { if (!preg_match_all( '~' . self::VARIABLE_REGEX . '~x', $route, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER @@ -72,7 +78,7 @@ private function parsePlaceholders($route) { $offset = $set[0][1] + strlen($set[0][0]); } - if ($offset != strlen($route)) { + if ($offset !== strlen($route)) { $routeData[] = substr($route, $offset); } diff --git a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/bootstrap.php b/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/bootstrap.php index add216c7d01f..0bce3a42071f 100644 --- a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/bootstrap.php +++ b/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/bootstrap.php @@ -4,7 +4,7 @@ require __DIR__ . '/functions.php'; -spl_autoload_register(function($class) { +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/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/functions.php b/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/functions.php index 3af67797b0b2..876a5d965c75 100644 --- a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/functions.php +++ b/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/functions.php @@ -9,7 +9,8 @@ * * @return Dispatcher */ - function simpleDispatcher(callable $routeDefinitionCallback, array $options = []) { + function simpleDispatcher(callable $routeDefinitionCallback, array $options = []) + { $options += [ 'routeParser' => 'FastRoute\\RouteParser\\Std', 'dataGenerator' => 'FastRoute\\DataGenerator\\GroupCountBased', @@ -32,7 +33,8 @@ function simpleDispatcher(callable $routeDefinitionCallback, array $options = [] * * @return Dispatcher */ - function cachedDispatcher(callable $routeDefinitionCallback, array $options = []) { + function cachedDispatcher(callable $routeDefinitionCallback, array $options = []) + { $options += [ 'routeParser' => 'FastRoute\\RouteParser\\Std', 'dataGenerator' => 'FastRoute\\DataGenerator\\GroupCountBased', @@ -60,10 +62,12 @@ function cachedDispatcher(callable $routeDefinitionCallback, array $options = [] /** @var RouteCollector $routeCollector */ $dispatchData = $routeCollector->getData(); - file_put_contents( - $options['cacheFile'], - ' $this->getDataGeneratorClass(), 'dispatcher' => $this->getDispatcherClass() @@ -29,7 +31,8 @@ private function generateDispatcherOptions() { /** * @dataProvider provideFoundDispatchCases */ - public function testFoundDispatches($method, $uri, $callback, $handler, $argDict) { + 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]); @@ -40,11 +43,12 @@ public function testFoundDispatches($method, $uri, $callback, $handler, $argDict /** * @dataProvider provideNotFoundDispatchCases */ - public function testNotFoundDispatches($method, $uri, $callback) { + 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->assertArrayNotHasKey(1, $routeInfo, + 'NOT_FOUND result must only contain a single element in the returned info array' ); $this->assertSame($dispatcher::NOT_FOUND, $routeInfo[0]); } @@ -52,11 +56,12 @@ public function testNotFoundDispatches($method, $uri, $callback) { /** * @dataProvider provideMethodNotAllowedDispatchCases */ - public function testMethodNotAllowedDispatches($method, $uri, $callback, $availableMethods) { + 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" + $this->assertArrayHasKey(1, $routeInfo, + 'METHOD_NOT_ALLOWED result must return an array of allowed methods at index 1' ); list($routedStatus, $methodArray) = $dispatcher->dispatch($method, $uri); @@ -68,8 +73,9 @@ public function testMethodNotAllowedDispatches($method, $uri, $callback, $availa * @expectedException \FastRoute\BadRouteException * @expectedExceptionMessage Cannot use the same placeholder "test" twice */ - public function testDuplicateVariableNameError() { - \FastRoute\simpleDispatcher(function(RouteCollector $r) { + public function testDuplicateVariableNameError() + { + \FastRoute\simpleDispatcher(function (RouteCollector $r) { $r->addRoute('GET', '/foo/{test}/{test:\d+}', 'handler0'); }, $this->generateDispatcherOptions()); } @@ -78,8 +84,9 @@ public function testDuplicateVariableNameError() { * @expectedException \FastRoute\BadRouteException * @expectedExceptionMessage Cannot register two routes matching "/user/([^/]+)" for method "GET" */ - public function testDuplicateVariableRoute() { - \FastRoute\simpleDispatcher(function(RouteCollector $r) { + 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()); @@ -89,8 +96,9 @@ public function testDuplicateVariableRoute() { * @expectedException \FastRoute\BadRouteException * @expectedExceptionMessage Cannot register two routes matching "/user" for method "GET" */ - public function testDuplicateStaticRoute() { - \FastRoute\simpleDispatcher(function(RouteCollector $r) { + public function testDuplicateStaticRoute() + { + \FastRoute\simpleDispatcher(function (RouteCollector $r) { $r->addRoute('GET', '/user', 'handler0'); $r->addRoute('GET', '/user', 'handler1'); }, $this->generateDispatcherOptions()); @@ -100,8 +108,9 @@ public function testDuplicateStaticRoute() { * @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) { + public function testShadowedStaticRoute() + { + \FastRoute\simpleDispatcher(function (RouteCollector $r) { $r->addRoute('GET', '/user/{name}', 'handler0'); $r->addRoute('GET', '/user/nikic', 'handler1'); }, $this->generateDispatcherOptions()); @@ -111,18 +120,20 @@ public function testShadowedStaticRoute() { * @expectedException \FastRoute\BadRouteException * @expectedExceptionMessage Regex "(en|de)" for parameter "lang" contains a capturing group */ - public function testCapturing() { - \FastRoute\simpleDispatcher(function(RouteCollector $r) { + public function testCapturing() + { + \FastRoute\simpleDispatcher(function (RouteCollector $r) { $r->addRoute('GET', '/{lang:(en|de)}', 'handler0'); }, $this->generateDispatcherOptions()); } - public function provideFoundDispatchCases() { + public function provideFoundDispatchCases() + { $cases = []; // 0 --------------------------------------------------------------------------------------> - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('GET', '/resource/123/456', 'handler0'); }; @@ -135,7 +146,7 @@ public function provideFoundDispatchCases() { // 1 --------------------------------------------------------------------------------------> - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('GET', '/handler0', 'handler0'); $r->addRoute('GET', '/handler1', 'handler1'); $r->addRoute('GET', '/handler2', 'handler2'); @@ -150,7 +161,7 @@ public function provideFoundDispatchCases() { // 2 --------------------------------------------------------------------------------------> - $callback = function(RouteCollector $r) { + $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'); @@ -198,11 +209,10 @@ public function provideFoundDispatchCases() { // 6 --------------------------------------------------------------------------------------> - $callback = function(RouteCollector $r) { + $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'; @@ -214,7 +224,7 @@ public function provideFoundDispatchCases() { // 7 ----- Test GET method fallback on HEAD route miss ------------------------------------> - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('GET', '/user/{name}', 'handler0'); $r->addRoute('GET', '/user/{name}/{id:[0-9]+}', 'handler1'); $r->addRoute('GET', '/static0', 'handler2'); @@ -264,7 +274,7 @@ public function provideFoundDispatchCases() { // 11 ---- More specified routes are not shadowed by less specific of another method ------> - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('GET', '/user/{name}', 'handler0'); $r->addRoute('POST', '/user/{name:[a-z]+}', 'handler1'); }; @@ -278,7 +288,7 @@ public function provideFoundDispatchCases() { // 12 ---- Handler of more specific routes is used, if it occurs first --------------------> - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('GET', '/user/{name}', 'handler0'); $r->addRoute('POST', '/user/{name:[a-z]+}', 'handler1'); $r->addRoute('POST', '/user/{name}', 'handler2'); @@ -293,7 +303,7 @@ public function provideFoundDispatchCases() { // 13 ---- Route with constant suffix -----------------------------------------------------> - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('GET', '/user/{name}', 'handler0'); $r->addRoute('GET', '/user/{name}/edit', 'handler1'); }; @@ -307,7 +317,7 @@ public function provideFoundDispatchCases() { // 14 ---- Handle multiple methods with the same handler ----------------------------------> - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute(['GET', 'POST'], '/user', 'handlerGetPost'); $r->addRoute(['DELETE'], '/user', 'handlerDelete'); $r->addRoute([], '/user', 'handlerNone'); @@ -318,53 +328,53 @@ public function provideFoundDispatchCases() { $cases[] = ['POST', '/user', $callback, 'handlerGetPost', $argDict]; $cases[] = ['DELETE', '/user', $callback, 'handlerDelete', $argDict]; - // 15 ---- + // 17 ---- - $callback = function(RouteCollector $r) { + $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 ---- + // 18 ---- - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('GET', '', 'handler0'); }; $cases[] = ['GET', '', $callback, 'handler0', []]; - // 17 ---- + // 19 ---- - $callback = function(RouteCollector $r) { + $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 ---- + // 20 ---- - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('HEAD', '/a', 'handler0'); $r->addRoute('GET', '/b', 'handler1'); }; $cases[] = ['HEAD', '/b', $callback, 'handler1', []]; - // 19 ---- + // 21 ---- - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('GET', '/foo', 'handler0'); $r->addRoute('HEAD', '/{bar}', 'handler1'); }; $cases[] = ['HEAD', '/foo', $callback, 'handler1', ['bar' => 'foo']]; - // 20 ---- + // 22 ---- - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('*', '/user', 'handler0'); $r->addRoute('*', '/{user}', 'handler1'); $r->addRoute('GET', '/user', 'handler2'); @@ -372,39 +382,49 @@ public function provideFoundDispatchCases() { $cases[] = ['GET', '/user', $callback, 'handler2', []]; - // 21 ---- + // 23 ---- - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('*', '/user', 'handler0'); $r->addRoute('GET', '/user', 'handler1'); }; $cases[] = ['POST', '/user', $callback, 'handler0', []]; - // 22 ---- + // 24 ---- $cases[] = ['HEAD', '/user', $callback, 'handler1', []]; - // 23 ---- + // 25 ---- - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('GET', '/{bar}', 'handler0'); $r->addRoute('*', '/foo', 'handler1'); }; $cases[] = ['GET', '/foo', $callback, 'handler0', ['bar' => 'foo']]; + // 26 ---- + + $callback = function(RouteCollector $r) { + $r->addRoute('GET', '/user', 'handler0'); + $r->addRoute('*', '/{foo:.*}', 'handler1'); + }; + + $cases[] = ['POST', '/bar', $callback, 'handler1', ['foo' => 'bar']]; + // x --------------------------------------------------------------------------------------> return $cases; } - public function provideNotFoundDispatchCases() { + public function provideNotFoundDispatchCases() + { $cases = []; // 0 --------------------------------------------------------------------------------------> - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('GET', '/resource/123/456', 'handler0'); }; @@ -431,7 +451,7 @@ public function provideNotFoundDispatchCases() { // 3 --------------------------------------------------------------------------------------> - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('GET', '/handler0', 'handler0'); $r->addRoute('GET', '/handler1', 'handler1'); $r->addRoute('GET', '/handler2', 'handler2'); @@ -444,7 +464,7 @@ public function provideNotFoundDispatchCases() { // 4 --------------------------------------------------------------------------------------> - $callback = function(RouteCollector $r) { + $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'); @@ -468,19 +488,20 @@ public function provideNotFoundDispatchCases() { // reuse callback from #5 $method = 'HEAD'; - $cases[] = array($method, $uri, $callback); + $cases[] = [$method, $uri, $callback]; // x --------------------------------------------------------------------------------------> return $cases; } - public function provideMethodNotAllowedDispatchCases() { + public function provideMethodNotAllowedDispatchCases() + { $cases = []; // 0 --------------------------------------------------------------------------------------> - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('GET', '/resource/123/456', 'handler0'); }; @@ -492,7 +513,7 @@ public function provideMethodNotAllowedDispatchCases() { // 1 --------------------------------------------------------------------------------------> - $callback = function(RouteCollector $r) { + $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'); @@ -507,7 +528,7 @@ public function provideMethodNotAllowedDispatchCases() { // 2 --------------------------------------------------------------------------------------> - $callback = function(RouteCollector $r) { + $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'); @@ -522,7 +543,7 @@ public function provideMethodNotAllowedDispatchCases() { // 3 --------------------------------------------------------------------------------------> - $callback = function(RouteCollector $r) { + $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'); @@ -536,7 +557,7 @@ public function provideMethodNotAllowedDispatchCases() { // 4 --------------------------------------------------------------------------------------> - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute(['GET', 'POST'], '/user', 'handlerGetPost'); $r->addRoute(['DELETE'], '/user', 'handlerDelete'); $r->addRoute([], '/user', 'handlerNone'); @@ -546,7 +567,7 @@ public function provideMethodNotAllowedDispatchCases() { // 5 - $callback = function(RouteCollector $r) { + $callback = function (RouteCollector $r) { $r->addRoute('POST', '/user.json', 'handler0'); $r->addRoute('GET', '/{entity}.json', 'handler1'); }; @@ -557,5 +578,4 @@ public function provideMethodNotAllowedDispatchCases() { return $cases; } - } diff --git a/samples/server/petstore/php-slim/vendor/nikic/fast-route/test/Dispatcher/GroupCountBasedTest.php b/samples/server/petstore/php-slim/vendor/nikic/fast-route/test/Dispatcher/GroupCountBasedTest.php index 74820fcaf989..f821ef56b93f 100644 --- a/samples/server/petstore/php-slim/vendor/nikic/fast-route/test/Dispatcher/GroupCountBasedTest.php +++ b/samples/server/petstore/php-slim/vendor/nikic/fast-route/test/Dispatcher/GroupCountBasedTest.php @@ -2,12 +2,15 @@ namespace FastRoute\Dispatcher; -class GroupCountBasedTest extends DispatcherTest { - protected function getDispatcherClass() { +class GroupCountBasedTest extends DispatcherTest +{ + protected function getDispatcherClass() + { return 'FastRoute\\Dispatcher\\GroupCountBased'; } - protected function getDataGeneratorClass() { + protected function getDataGeneratorClass() + { return 'FastRoute\\DataGenerator\\GroupCountBased'; } } diff --git a/samples/server/petstore/php-slim/vendor/nikic/fast-route/test/Dispatcher/GroupPosBasedTest.php b/samples/server/petstore/php-slim/vendor/nikic/fast-route/test/Dispatcher/GroupPosBasedTest.php index c3d4f8dbec36..b5c9567de805 100644 --- a/samples/server/petstore/php-slim/vendor/nikic/fast-route/test/Dispatcher/GroupPosBasedTest.php +++ b/samples/server/petstore/php-slim/vendor/nikic/fast-route/test/Dispatcher/GroupPosBasedTest.php @@ -2,12 +2,15 @@ namespace FastRoute\Dispatcher; -class GroupPosBasedTest extends DispatcherTest { - protected function getDispatcherClass() { +class GroupPosBasedTest extends DispatcherTest +{ + protected function getDispatcherClass() + { return 'FastRoute\\Dispatcher\\GroupPosBased'; } - protected function getDataGeneratorClass() { + protected function getDataGeneratorClass() + { return 'FastRoute\\DataGenerator\\GroupPosBased'; } } diff --git a/samples/server/petstore/php-slim/vendor/nikic/fast-route/test/Dispatcher/MarkBasedTest.php b/samples/server/petstore/php-slim/vendor/nikic/fast-route/test/Dispatcher/MarkBasedTest.php index 04b0af9bf86b..b3b27dd2fb11 100644 --- a/samples/server/petstore/php-slim/vendor/nikic/fast-route/test/Dispatcher/MarkBasedTest.php +++ b/samples/server/petstore/php-slim/vendor/nikic/fast-route/test/Dispatcher/MarkBasedTest.php @@ -2,19 +2,23 @@ namespace FastRoute\Dispatcher; -class MarkBasedTest extends DispatcherTest { - public function setUp() { +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() { + protected function getDispatcherClass() + { return 'FastRoute\\Dispatcher\\MarkBased'; } - protected function getDataGeneratorClass() { + protected function getDataGeneratorClass() + { return 'FastRoute\\DataGenerator\\MarkBased'; } } diff --git a/samples/server/petstore/php-slim/vendor/nikic/fast-route/test/HackTypechecker/HackTypecheckerTest.php b/samples/server/petstore/php-slim/vendor/nikic/fast-route/test/HackTypechecker/HackTypecheckerTest.php index 7bc6ebb310de..b6fc53f7702a 100644 --- a/samples/server/petstore/php-slim/vendor/nikic/fast-route/test/HackTypechecker/HackTypecheckerTest.php +++ b/samples/server/petstore/php-slim/vendor/nikic/fast-route/test/HackTypechecker/HackTypecheckerTest.php @@ -2,11 +2,16 @@ namespace FastRoute; -class HackTypecheckerTest extends \PhpUnit_Framework_TestCase { +use PHPUnit\Framework\TestCase; + +class HackTypecheckerTest extends TestCase +{ const SERVER_ALREADY_RUNNING_CODE = 77; - public function testTypechecks($recurse = true) { + + public function testTypechecks($recurse = true) + { if (!defined('HHVM_VERSION')) { - $this->markTestSkipped("HHVM only"); + $this->markTestSkipped('HHVM only'); } if (!version_compare(HHVM_VERSION, '3.9.0', '>=')) { $this->markTestSkipped('classname requires HHVM 3.9+'); @@ -15,17 +20,17 @@ public function testTypechecks($recurse = true) { // The typechecker recurses the whole tree, so it makes sure // that everything in fixtures/ is valid when this runs. - $output = array(); + $output = []; $exit_code = null; exec( - 'hh_server --check '.escapeshellarg(__DIR__.'/../../').' 2>&1', + '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" + 'Typechecker still running after running hh_client stop' ); // Server already running - 3.10 => 3.11 regression: // https://github.com/facebook/hhvm/issues/6646 diff --git a/samples/server/petstore/php-slim/vendor/nikic/fast-route/test/RouteParser/StdTest.php b/samples/server/petstore/php-slim/vendor/nikic/fast-route/test/RouteParser/StdTest.php index 41f194ba8b61..e13e4de61718 100644 --- a/samples/server/petstore/php-slim/vendor/nikic/fast-route/test/RouteParser/StdTest.php +++ b/samples/server/petstore/php-slim/vendor/nikic/fast-route/test/RouteParser/StdTest.php @@ -2,22 +2,28 @@ namespace FastRoute\RouteParser; -class StdTest extends \PhpUnit_Framework_TestCase { +use PHPUnit\Framework\TestCase; + +class StdTest extends TestCase +{ /** @dataProvider provideTestParse */ - public function testParse($routeString, $expectedRouteDatas) { + public function testParse($routeString, $expectedRouteDatas) + { $parser = new Std(); $routeDatas = $parser->parse($routeString); $this->assertSame($expectedRouteDatas, $routeDatas); } /** @dataProvider provideTestParseError */ - public function testParseError($routeString, $expectedExceptionMessage) { + public function testParseError($routeString, $expectedExceptionMessage) + { $parser = new Std(); $this->setExpectedException('FastRoute\\BadRouteException', $expectedExceptionMessage); $parser->parse($routeString); } - public function provideTestParse() { + public function provideTestParse() + { return [ [ '/test', @@ -112,7 +118,8 @@ public function provideTestParse() { ]; } - public function provideTestParseError() { + public function provideTestParseError() + { return [ [ '/test[opt', @@ -128,19 +135,19 @@ public function provideTestParseError() { ], [ '/test[]', - "Empty optional part" + 'Empty optional part' ], [ '/test[[opt]]', - "Empty optional part" + 'Empty optional part' ], [ '[[test]]', - "Empty optional part" + 'Empty optional part' ], [ '/test[/opt]/required', - "Optional segments can only occur at the end of a route" + 'Optional segments can only occur at the end of a route' ], ]; } diff --git a/samples/server/petstore/php-slim/vendor/nikic/fast-route/test/bootstrap.php b/samples/server/petstore/php-slim/vendor/nikic/fast-route/test/bootstrap.php index 27e6d4c8fbdc..3023f41e4659 100644 --- a/samples/server/petstore/php-slim/vendor/nikic/fast-route/test/bootstrap.php +++ b/samples/server/petstore/php-slim/vendor/nikic/fast-route/test/bootstrap.php @@ -2,7 +2,7 @@ require_once __DIR__ . '/../src/functions.php'; -spl_autoload_register(function($class) { +spl_autoload_register(function ($class) { if (strpos($class, 'FastRoute\\') === 0) { $dir = strcasecmp(substr($class, -4), 'Test') ? 'src/' : 'test/'; $name = substr($class, strlen('FastRoute')); diff --git a/samples/server/petstore/php-slim/vendor/pimple/pimple/.travis.yml b/samples/server/petstore/php-slim/vendor/pimple/pimple/.travis.yml index 5f8bb7c9f3b7..196f7fc19004 100644 --- a/samples/server/petstore/php-slim/vendor/pimple/pimple/.travis.yml +++ b/samples/server/petstore/php-slim/vendor/pimple/pimple/.travis.yml @@ -12,21 +12,29 @@ php: - 5.4 - 5.5 - 5.6 - - hhvm + - 7.0 + - 7.1 before_script: - composer self-update - - COMPOSER_ROOT_VERSION=dev-master composer dump-autoload + - COMPOSER_ROOT_VERSION=dev-master composer install - 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 + - if [ "$PIMPLE_EXT" == "yes" ]; then export SYMFONY_DEPRECATIONS_HELPER=weak; fi - cd ../.. - - phpunit + - ./vendor/bin/simple-phpunit matrix: - exclude: + include: - php: hhvm + dist: trusty + env: PIMPLE_EXT=no + exclude: + - php: 7.0 + env: PIMPLE_EXT=yes + - php: 7.1 env: PIMPLE_EXT=yes diff --git a/samples/server/petstore/php-slim/vendor/pimple/pimple/CHANGELOG b/samples/server/petstore/php-slim/vendor/pimple/pimple/CHANGELOG index cc679972ec76..ba56760c1f59 100644 --- a/samples/server/petstore/php-slim/vendor/pimple/pimple/CHANGELOG +++ b/samples/server/petstore/php-slim/vendor/pimple/pimple/CHANGELOG @@ -1,3 +1,27 @@ +* 3.2.3 (2017-XX-XX) + + * n/a + +* 3.2.2 (2017-07-23) + + * reverted extending a protected closure throws an exception (deprecated it instead) + +* 3.2.1 (2017-07-17) + + * fixed PHP error + +* 3.2.0 (2017-07-17) + + * added a PSR-11 service locator + * added a PSR-11 wrapper + * added ServiceIterator + * fixed extending a protected closure (now throws InvalidServiceIdentifierException) + +* 3.1.0 (2017-07-03) + + * deprecated the C extension + * added support for PSR-11 exceptions + * 3.0.2 (2015-09-11) * refactored the C extension diff --git a/samples/server/petstore/php-slim/vendor/pimple/pimple/README.rst b/samples/server/petstore/php-slim/vendor/pimple/pimple/README.rst index 93fb35a89b76..a03b6d3a4992 100644 --- a/samples/server/petstore/php-slim/vendor/pimple/pimple/README.rst +++ b/samples/server/petstore/php-slim/vendor/pimple/pimple/README.rst @@ -17,18 +17,7 @@ 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 + $ ./composer.phar require pimple/pimple "^3.0" Usage ----- @@ -119,7 +108,7 @@ If you change the ``session_storage`` service definition like below: }; You can now easily change the cookie name by overriding the -``session_storage_class`` parameter instead of redefining the service +``cookie_name`` parameter instead of redefining the service definition. Protecting Parameters @@ -198,4 +187,140 @@ raw access to this function, you can use the ``raw()`` method: $sessionFunction = $container->raw('session'); +PSR-11 compatibility +-------------------- + +For historical reasons, the ``Container`` class does not implement the PSR-11 +``ContainerInterface``. However, Pimple provides a helper class that will let +you decouple your code from the Pimple container class. + +The PSR-11 container class +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The ``Pimple\Psr11\Container`` class lets you access the content of an +underlying Pimple container using ``Psr\Container\ContainerInterface`` +methods: + +.. code-block:: php + + use Pimple\Container; + use Pimple\Psr11\Container as PsrContainer; + + $container = new Container(); + $container['service'] = function ($c) { + return new Service(); + }; + $psr11 = new PsrContainer($container); + + $controller = function (PsrContainer $container) { + $service = $container->get('service'); + }; + $controller($psr11); + +Using the PSR-11 ServiceLocator +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Sometimes, a service needs access to several other services without being sure +that all of them will actually be used. In those cases, you may want the +instantiation of the services to be lazy. + +The traditional solution is to inject the entire service container to get only +the services really needed. However, this is not recommended because it gives +services a too broad access to the rest of the application and it hides their +actual dependencies. + +The ``ServiceLocator`` is intended to solve this problem by giving access to a +set of predefined services while instantiating them only when actually needed. + +It also allows you to make your services available under a different name than +the one used to register them. For instance, you may want to use an object +that expects an instance of ``EventDispatcherInterface`` to be available under +the name ``event_dispatcher`` while your event dispatcher has been +registered under the name ``dispatcher``: + +.. code-block:: php + + use Monolog\Logger; + use Pimple\Psr11\ServiceLocator; + use Psr\Container\ContainerInterface; + use Symfony\Component\EventDispatcher\EventDispatcher; + + class MyService + { + /** + * "logger" must be an instance of Psr\Log\LoggerInterface + * "event_dispatcher" must be an instance of Symfony\Component\EventDispatcher\EventDispatcherInterface + */ + private $services; + + public function __construct(ContainerInterface $services) + { + $this->services = $services; + } + } + + $container['logger'] = function ($c) { + return new Monolog\Logger(); + }; + $container['dispatcher'] = function () { + return new EventDispatcher(); + }; + + $container['service'] = function ($c) { + $locator = new ServiceLocator($c, array('logger', 'event_dispatcher' => 'dispatcher')); + + return new MyService($locator); + }; + +Referencing a Collection of Services Lazily +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Passing a collection of services instances in an array may prove inefficient +if the class that consumes the collection only needs to iterate over it at a +later stage, when one of its method is called. It can also lead to problems +if there is a circular dependency between one of the services stored in the +collection and the class that consumes it. + +The ``ServiceIterator`` class helps you solve these issues. It receives a +list of service names during instantiation and will retrieve the services +when iterated over: + +.. code-block:: php + + use Pimple\Container; + use Pimple\ServiceIterator; + + class AuthorizationService + { + private $voters; + + public function __construct($voters) + { + $this->voters = $voters; + } + + public function canAccess($resource) + { + foreach ($this->voters as $voter) { + if (true === $voter->canAccess($resource) { + return true; + } + } + + return false; + } + } + + $container = new Container(); + + $container['voter1'] = function ($c) { + return new SomeVoter(); + } + $container['voter2'] = function ($c) { + return new SomeOtherVoter($c['auth']); + } + $container['auth'] = function ($c) { + return new AuthorizationService(new ServiceIterator($c, array('voter1', 'voter2')); + } + .. _Pimple 1.x documentation: https://github.com/silexphp/Pimple/tree/1.1 diff --git a/samples/server/petstore/php-slim/vendor/pimple/pimple/composer.json b/samples/server/petstore/php-slim/vendor/pimple/pimple/composer.json index a5268f161185..dabf190a9ade 100644 --- a/samples/server/petstore/php-slim/vendor/pimple/pimple/composer.json +++ b/samples/server/petstore/php-slim/vendor/pimple/pimple/composer.json @@ -12,14 +12,18 @@ } ], "require": { - "php": ">=5.3.0" + "php": ">=5.3.0", + "psr/container": "^1.0" + }, + "require-dev": { + "symfony/phpunit-bridge": "^3.2" }, "autoload": { "psr-0": { "Pimple": "src/" } }, "extra": { "branch-alias": { - "dev-master": "3.0.x-dev" + "dev-master": "3.2.x-dev" } } } diff --git a/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/config.m4 b/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/config.m4 index c9ba17ddbd58..3a6e9aaeb158 100644 --- a/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/config.m4 +++ b/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/config.m4 @@ -45,7 +45,7 @@ if test "$PHP_PIMPLE" != "no"; then 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 LIBSYMBOL=pimple # you most likely want to change this dnl PHP_CHECK_LIBRARY($LIBNAME,$LIBSYMBOL, dnl [ diff --git a/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/php_pimple.h b/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/php_pimple.h index 49431f08a846..eed7c1731d48 100644 --- a/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/php_pimple.h +++ b/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/php_pimple.h @@ -41,17 +41,31 @@ extern zend_module_entry pimple_module_entry; #include "TSRM.h" #endif -#define PIMPLE_VERSION "3.0.2" +#define PIMPLE_VERSION "3.2.3-DEV" + #define PIMPLE_NS "Pimple" +#define PSR_CONTAINER_NS "Psr\\Container" +#define PIMPLE_EXCEPTION_NS "Pimple\\Exception" #define PIMPLE_DEFAULT_ZVAL_CACHE_NUM 5 #define PIMPLE_DEFAULT_ZVAL_VALUES_NUM 10 +#define PIMPLE_DEPRECATE do { \ + int er = EG(error_reporting); \ + EG(error_reporting) = 0;\ + php_error(E_DEPRECATED, "The Pimple C extension is deprecated since version 3.1 and will be removed in 4.0."); \ + EG(error_reporting) = er; \ +} while (0); + zend_module_entry *get_module(void); PHP_MINIT_FUNCTION(pimple); PHP_MINFO_FUNCTION(pimple); +PHP_METHOD(FrozenServiceException, __construct); +PHP_METHOD(InvalidServiceIdentifierException, __construct); +PHP_METHOD(UnknownIdentifierException, __construct); + PHP_METHOD(Pimple, __construct); PHP_METHOD(Pimple, factory); PHP_METHOD(Pimple, protect); @@ -93,6 +107,8 @@ typedef struct _pimple_closure_object { static const char sensiolabs_logo[] = ""; +static void pimple_exception_call_parent_constructor(zval *this_ptr, const char *format, const char *arg1 TSRMLS_DC); + 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); diff --git a/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/pimple.c b/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/pimple.c index 821365bf1277..c80499b39956 100644 --- a/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/pimple.c +++ b/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/pimple.c @@ -40,6 +40,15 @@ #include "main/php_output.h" #include "SAPI.h" +static zend_class_entry *pimple_ce_PsrContainerInterface; +static zend_class_entry *pimple_ce_PsrContainerExceptionInterface; +static zend_class_entry *pimple_ce_PsrNotFoundExceptionInterface; + +static zend_class_entry *pimple_ce_ExpectedInvokableException; +static zend_class_entry *pimple_ce_FrozenServiceException; +static zend_class_entry *pimple_ce_InvalidServiceIdentifierException; +static zend_class_entry *pimple_ce_UnknownIdentifierException; + static zend_class_entry *pimple_ce; static zend_object_handlers pimple_object_handlers; static zend_class_entry *pimple_closure_ce; @@ -92,6 +101,63 @@ static zend_internal_function pimple_closure_invoker_function; } \ } while(0); + +/* Psr\Container\ContainerInterface */ +ZEND_BEGIN_ARG_INFO_EX(arginfo_pimple_PsrContainerInterface_get, 0, 0, 1) +ZEND_ARG_INFO(0, id) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_pimple_PsrContainerInterface_has, 0, 0, 1) +ZEND_ARG_INFO(0, id) +ZEND_END_ARG_INFO() + +static const zend_function_entry pimple_ce_PsrContainerInterface_functions[] = { + PHP_ABSTRACT_ME(ContainerInterface, get, arginfo_pimple_PsrContainerInterface_get) + PHP_ABSTRACT_ME(ContainerInterface, has, arginfo_pimple_PsrContainerInterface_has) + PHP_FE_END +}; + +/* Psr\Container\ContainerExceptionInterface */ +static const zend_function_entry pimple_ce_PsrContainerExceptionInterface_functions[] = { + PHP_FE_END +}; + +/* Psr\Container\NotFoundExceptionInterface */ +static const zend_function_entry pimple_ce_PsrNotFoundExceptionInterface_functions[] = { + PHP_FE_END +}; + +/* Pimple\Exception\FrozenServiceException */ +ZEND_BEGIN_ARG_INFO_EX(arginfo_FrozenServiceException___construct, 0, 0, 1) +ZEND_ARG_INFO(0, id) +ZEND_END_ARG_INFO() + +static const zend_function_entry pimple_ce_FrozenServiceException_functions[] = { + PHP_ME(FrozenServiceException, __construct, arginfo_FrozenServiceException___construct, ZEND_ACC_PUBLIC) + PHP_FE_END +}; + +/* Pimple\Exception\InvalidServiceIdentifierException */ +ZEND_BEGIN_ARG_INFO_EX(arginfo_InvalidServiceIdentifierException___construct, 0, 0, 1) +ZEND_ARG_INFO(0, id) +ZEND_END_ARG_INFO() + +static const zend_function_entry pimple_ce_InvalidServiceIdentifierException_functions[] = { + PHP_ME(InvalidServiceIdentifierException, __construct, arginfo_InvalidServiceIdentifierException___construct, ZEND_ACC_PUBLIC) + PHP_FE_END +}; + +/* Pimple\Exception\UnknownIdentifierException */ +ZEND_BEGIN_ARG_INFO_EX(arginfo_UnknownIdentifierException___construct, 0, 0, 1) +ZEND_ARG_INFO(0, id) +ZEND_END_ARG_INFO() + +static const zend_function_entry pimple_ce_UnknownIdentifierException_functions[] = { + PHP_ME(UnknownIdentifierException, __construct, arginfo_UnknownIdentifierException___construct, ZEND_ACC_PUBLIC) + PHP_FE_END +}; + +/* Pimple\Container */ ZEND_BEGIN_ARG_INFO_EX(arginfo___construct, 0, 0, 0) ZEND_ARG_ARRAY_INFO(0, value, 0) ZEND_END_ARG_INFO() @@ -138,10 +204,6 @@ 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) @@ -158,11 +220,54 @@ static const zend_function_entry pimple_ce_functions[] = { PHP_FE_END }; +/* Pimple\ServiceProviderInterface */ +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_serviceprovider_iface_ce_functions[] = { PHP_ABSTRACT_ME(ServiceProviderInterface, register, arginfo_serviceprovider_register) PHP_FE_END }; +/* parent::__construct(sprintf("Something with %s", $arg1)) */ +static void pimple_exception_call_parent_constructor(zval *this_ptr, const char *format, const char *arg1 TSRMLS_DC) +{ + zend_class_entry *ce = Z_OBJCE_P(this_ptr); + char *message = NULL; + int message_len; + zval *constructor_arg; + + message_len = spprintf(&message, 0, format, arg1); + ALLOC_INIT_ZVAL(constructor_arg); + ZVAL_STRINGL(constructor_arg, message, message_len, 1); + + zend_call_method_with_1_params(&this_ptr, ce, &ce->parent->constructor, "__construct", NULL, constructor_arg); + + efree(message); + zval_ptr_dtor(&constructor_arg); +} + +/** + * Pass a single string parameter to exception constructor and throw + */ +static void pimple_throw_exception_string(zend_class_entry *ce, const char *message, zend_uint message_len TSRMLS_DC) +{ + zval *exception, *param; + + ALLOC_INIT_ZVAL(exception); + object_init_ex(exception, ce); + + ALLOC_INIT_ZVAL(param); + ZVAL_STRINGL(param, message, message_len, 1); + + zend_call_method_with_1_params(&exception, ce, &ce->constructor, "__construct", NULL, param); + + zend_throw_exception_object(exception TSRMLS_CC); + + zval_ptr_dtor(¶m); +} + static void pimple_closure_free_object_storage(pimple_closure_object *obj TSRMLS_DC) { zend_object_std_dtor(&obj->zobj TSRMLS_CC); @@ -264,7 +369,7 @@ static void pimple_object_write_dimension(zval *object, zval *offset, zval *valu 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)); + pimple_throw_exception_string(pimple_ce_FrozenServiceException, Z_STRVAL_P(offset), Z_STRLEN_P(offset) TSRMLS_CC); 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) { @@ -284,7 +389,8 @@ static void pimple_object_write_dimension(zval *object, zval *offset, zval *valu 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); + convert_to_string(offset); + pimple_throw_exception_string(pimple_ce_FrozenServiceException, Z_STRVAL_P(offset), Z_STRLEN_P(offset) TSRMLS_CC); return; } if (zend_hash_index_update(&pimple_obj->values, index, (void *)&pimple_value, sizeof(pimple_bucket_value), NULL) == FAILURE) { @@ -385,7 +491,8 @@ static zval *pimple_object_read_dimension(zval *object, zval *offset, int type T 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)); + pimple_throw_exception_string(pimple_ce_UnknownIdentifierException, Z_STRVAL_P(offset), Z_STRLEN_P(offset) TSRMLS_CC); + return EG(uninitialized_zval_ptr); } break; @@ -482,6 +589,39 @@ static void pimple_bucket_dtor(pimple_bucket_value *bucket) pimple_free_bucket(bucket); } +PHP_METHOD(FrozenServiceException, __construct) +{ + char *id = NULL; + int id_len; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &id, &id_len) == FAILURE) { + return; + } + pimple_exception_call_parent_constructor(getThis(), "Cannot override frozen service \"%s\".", id TSRMLS_CC); +} + +PHP_METHOD(InvalidServiceIdentifierException, __construct) +{ + char *id = NULL; + int id_len; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &id, &id_len) == FAILURE) { + return; + } + pimple_exception_call_parent_constructor(getThis(), "Identifier \"%s\" does not contain an object definition.", id TSRMLS_CC); +} + +PHP_METHOD(UnknownIdentifierException, __construct) +{ + char *id = NULL; + int id_len; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &id, &id_len) == FAILURE) { + return; + } + pimple_exception_call_parent_constructor(getThis(), "Identifier \"%s\" is not defined.", id TSRMLS_CC); +} + PHP_METHOD(Pimple, protect) { zval *protected = NULL; @@ -494,7 +634,7 @@ PHP_METHOD(Pimple, protect) 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); + zend_throw_exception(pimple_ce_ExpectedInvokableException, "Callable is not a Closure or invokable object.", 0 TSRMLS_CC); return; } @@ -526,7 +666,7 @@ PHP_METHOD(Pimple, raw) 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)); + pimple_throw_exception_string(pimple_ce_UnknownIdentifierException, Z_STRVAL_P(offset), Z_STRLEN_P(offset) TSRMLS_CC); RETURN_NULL(); } break; @@ -571,13 +711,20 @@ PHP_METHOD(Pimple, extend) 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)); + pimple_throw_exception_string(pimple_ce_UnknownIdentifierException, Z_STRVAL_P(offset), Z_STRLEN_P(offset) TSRMLS_CC); 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)); + pimple_throw_exception_string(pimple_ce_InvalidServiceIdentifierException, Z_STRVAL_P(offset), Z_STRLEN_P(offset) TSRMLS_CC); RETURN_NULL(); } + if (zend_hash_index_exists(&pobj->protected, value->handle_num)) { + int er = EG(error_reporting); + EG(error_reporting) = 0; + php_error(E_DEPRECATED, "How Pimple behaves when extending protected closures will be fixed in Pimple 4. Are you sure \"%s\" should be protected?", Z_STRVAL_P(offset)); + EG(error_reporting) = er; + } break; case IS_DOUBLE: case IS_BOOL: @@ -588,13 +735,21 @@ PHP_METHOD(Pimple, extend) 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); + convert_to_string(offset); + pimple_throw_exception_string(pimple_ce_UnknownIdentifierException, Z_STRVAL_P(offset), Z_STRLEN_P(offset) TSRMLS_CC); 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); + convert_to_string(offset); + pimple_throw_exception_string(pimple_ce_InvalidServiceIdentifierException, Z_STRVAL_P(offset), Z_STRLEN_P(offset) TSRMLS_CC); RETURN_NULL(); } + if (zend_hash_index_exists(&pobj->protected, value->handle_num)) { + int er = EG(error_reporting); + EG(error_reporting) = 0; + php_error(E_DEPRECATED, "How Pimple behaves when extending protected closures will be fixed in Pimple 4. Are you sure \"%ld\" should be protected?", index); + EG(error_reporting) = er; + } break; case IS_NULL: default: @@ -603,7 +758,7 @@ PHP_METHOD(Pimple, extend) 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); + zend_throw_exception(pimple_ce_ExpectedInvokableException, "Extension service definition is not a Closure or invokable object.", 0 TSRMLS_CC); RETURN_NULL(); } pimple_free_bucket(&bucket); @@ -676,7 +831,7 @@ PHP_METHOD(Pimple, factory) 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); + zend_throw_exception(pimple_ce_ExpectedInvokableException, "Service definition is not a Closure or invokable object.", 0 TSRMLS_CC); return; } @@ -782,7 +937,13 @@ PHP_METHOD(Pimple, __construct) zend_uint str_length; ulong num_index; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|a!", &values) == FAILURE || !values) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|a!", &values) == FAILURE) { + return; + } + + PIMPLE_DEPRECATE + + if (!values) { return; } @@ -857,7 +1018,38 @@ PHP_METHOD(PimpleClosure, invoker) PHP_MINIT_FUNCTION(pimple) { + zend_class_entry tmp_ce_PsrContainerInterface, tmp_ce_PsrContainerExceptionInterface, tmp_ce_PsrNotFoundExceptionInterface; + zend_class_entry tmp_ce_ExpectedInvokableException, tmp_ce_FrozenServiceException, tmp_ce_InvalidServiceIdentifierException, tmp_ce_UnknownIdentifierException; zend_class_entry tmp_pimple_ce, tmp_pimple_closure_ce, tmp_pimple_serviceprovider_iface_ce; + + /* Psr\Container namespace */ + INIT_NS_CLASS_ENTRY(tmp_ce_PsrContainerInterface, PSR_CONTAINER_NS, "ContainerInterface", pimple_ce_PsrContainerInterface_functions); + INIT_NS_CLASS_ENTRY(tmp_ce_PsrContainerExceptionInterface, PSR_CONTAINER_NS, "ContainerExceptionInterface", pimple_ce_PsrContainerExceptionInterface_functions); + INIT_NS_CLASS_ENTRY(tmp_ce_PsrNotFoundExceptionInterface, PSR_CONTAINER_NS, "NotFoundExceptionInterface", pimple_ce_PsrNotFoundExceptionInterface_functions); + + pimple_ce_PsrContainerInterface = zend_register_internal_interface(&tmp_ce_PsrContainerInterface TSRMLS_CC); + pimple_ce_PsrContainerExceptionInterface = zend_register_internal_interface(&tmp_ce_PsrContainerExceptionInterface TSRMLS_CC); + pimple_ce_PsrNotFoundExceptionInterface = zend_register_internal_interface(&tmp_ce_PsrNotFoundExceptionInterface TSRMLS_CC); + + zend_class_implements(pimple_ce_PsrNotFoundExceptionInterface TSRMLS_CC, 1, pimple_ce_PsrContainerExceptionInterface); + + /* Pimple\Exception namespace */ + INIT_NS_CLASS_ENTRY(tmp_ce_ExpectedInvokableException, PIMPLE_EXCEPTION_NS, "ExpectedInvokableException", NULL); + INIT_NS_CLASS_ENTRY(tmp_ce_FrozenServiceException, PIMPLE_EXCEPTION_NS, "FrozenServiceException", pimple_ce_FrozenServiceException_functions); + INIT_NS_CLASS_ENTRY(tmp_ce_InvalidServiceIdentifierException, PIMPLE_EXCEPTION_NS, "InvalidServiceIdentifierException", pimple_ce_InvalidServiceIdentifierException_functions); + INIT_NS_CLASS_ENTRY(tmp_ce_UnknownIdentifierException, PIMPLE_EXCEPTION_NS, "UnknownIdentifierException", pimple_ce_UnknownIdentifierException_functions); + + pimple_ce_ExpectedInvokableException = zend_register_internal_class_ex(&tmp_ce_ExpectedInvokableException, spl_ce_InvalidArgumentException, NULL TSRMLS_CC); + pimple_ce_FrozenServiceException = zend_register_internal_class_ex(&tmp_ce_FrozenServiceException, spl_ce_RuntimeException, NULL TSRMLS_CC); + pimple_ce_InvalidServiceIdentifierException = zend_register_internal_class_ex(&tmp_ce_InvalidServiceIdentifierException, spl_ce_InvalidArgumentException, NULL TSRMLS_CC); + pimple_ce_UnknownIdentifierException = zend_register_internal_class_ex(&tmp_ce_UnknownIdentifierException, spl_ce_InvalidArgumentException, NULL TSRMLS_CC); + + zend_class_implements(pimple_ce_ExpectedInvokableException TSRMLS_CC, 1, pimple_ce_PsrContainerExceptionInterface); + zend_class_implements(pimple_ce_FrozenServiceException TSRMLS_CC, 1, pimple_ce_PsrContainerExceptionInterface); + zend_class_implements(pimple_ce_InvalidServiceIdentifierException TSRMLS_CC, 1, pimple_ce_PsrContainerExceptionInterface); + zend_class_implements(pimple_ce_UnknownIdentifierException TSRMLS_CC, 1, pimple_ce_PsrNotFoundExceptionInterface); + + /* Pimple namespace */ 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); diff --git a/samples/server/petstore/php-slim/vendor/pimple/pimple/src/Pimple/Container.php b/samples/server/petstore/php-slim/vendor/pimple/pimple/src/Pimple/Container.php index c976431e99a8..707b92b82c13 100644 --- a/samples/server/petstore/php-slim/vendor/pimple/pimple/src/Pimple/Container.php +++ b/samples/server/petstore/php-slim/vendor/pimple/pimple/src/Pimple/Container.php @@ -26,10 +26,15 @@ namespace Pimple; +use Pimple\Exception\ExpectedInvokableException; +use Pimple\Exception\FrozenServiceException; +use Pimple\Exception\InvalidServiceIdentifierException; +use Pimple\Exception\UnknownIdentifierException; + /** * Container main class. * - * @author Fabien Potencier + * @author Fabien Potencier */ class Container implements \ArrayAccess { @@ -41,11 +46,11 @@ class Container implements \ArrayAccess private $keys = array(); /** - * Instantiate the container. + * Instantiates the container. * * Objects and parameters can be passed as argument to the constructor. * - * @param array $values The parameters or objects. + * @param array $values The parameters or objects */ public function __construct(array $values = array()) { @@ -69,12 +74,12 @@ public function __construct(array $values = array()) * @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 + * @throws FrozenServiceException 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)); + throw new FrozenServiceException($id); } $this->values[$id] = $value; @@ -88,19 +93,19 @@ public function offsetSet($id, $value) * * @return mixed The value of the parameter or an object * - * @throws \InvalidArgumentException if the identifier is not defined + * @throws UnknownIdentifierException 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)); + throw new UnknownIdentifierException($id); } if ( isset($this->raw[$id]) - || !is_object($this->values[$id]) + || !\is_object($this->values[$id]) || isset($this->protected[$this->values[$id]]) - || !method_exists($this->values[$id], '__invoke') + || !\method_exists($this->values[$id], '__invoke') ) { return $this->values[$id]; } @@ -138,7 +143,7 @@ public function offsetExists($id) public function offsetUnset($id) { if (isset($this->keys[$id])) { - if (is_object($this->values[$id])) { + if (\is_object($this->values[$id])) { unset($this->factories[$this->values[$id]], $this->protected[$this->values[$id]]); } @@ -153,12 +158,12 @@ public function offsetUnset($id) * * @return callable The passed callable * - * @throws \InvalidArgumentException Service definition has to be a closure of an invokable object + * @throws ExpectedInvokableException Service definition has to be a closure or an invokable object */ public function factory($callable) { - if (!method_exists($callable, '__invoke')) { - throw new \InvalidArgumentException('Service definition is not a Closure or invokable object.'); + if (!\method_exists($callable, '__invoke')) { + throw new ExpectedInvokableException('Service definition is not a Closure or invokable object.'); } $this->factories->attach($callable); @@ -175,12 +180,12 @@ public function factory($callable) * * @return callable The passed callable * - * @throws \InvalidArgumentException Service definition has to be a closure of an invokable object + * @throws ExpectedInvokableException Service definition has to be a closure or an invokable object */ public function protect($callable) { - if (!method_exists($callable, '__invoke')) { - throw new \InvalidArgumentException('Callable is not a Closure or invokable object.'); + if (!\method_exists($callable, '__invoke')) { + throw new ExpectedInvokableException('Callable is not a Closure or invokable object.'); } $this->protected->attach($callable); @@ -195,12 +200,12 @@ public function protect($callable) * * @return mixed The value of the parameter or the closure defining an object * - * @throws \InvalidArgumentException if the identifier is not defined + * @throws UnknownIdentifierException 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)); + throw new UnknownIdentifierException($id); } if (isset($this->raw[$id])) { @@ -221,20 +226,31 @@ public function raw($id) * * @return callable The wrapped callable * - * @throws \InvalidArgumentException if the identifier is not defined or not a service definition + * @throws UnknownIdentifierException If the identifier is not defined + * @throws FrozenServiceException If the service is frozen + * @throws InvalidServiceIdentifierException If the identifier belongs to a parameter + * @throws ExpectedInvokableException If the extension callable is not a closure or an invokable object */ public function extend($id, $callable) { if (!isset($this->keys[$id])) { - throw new \InvalidArgumentException(sprintf('Identifier "%s" is not defined.', $id)); + throw new UnknownIdentifierException($id); + } + + if (isset($this->frozen[$id])) { + throw new FrozenServiceException($id); + } + + if (!\is_object($this->values[$id]) || !\method_exists($this->values[$id], '__invoke')) { + throw new InvalidServiceIdentifierException($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 (isset($this->protected[$this->values[$id]])) { + @\trigger_error(\sprintf('How Pimple behaves when extending protected closures will be fixed in Pimple 4. Are you sure "%s" should be protected?', $id), \E_USER_DEPRECATED); } - if (!is_object($callable) || !method_exists($callable, '__invoke')) { - throw new \InvalidArgumentException('Extension service definition is not a Closure or invokable object.'); + if (!\is_object($callable) || !\method_exists($callable, '__invoke')) { + throw new ExpectedInvokableException('Extension service definition is not a Closure or invokable object.'); } $factory = $this->values[$id]; @@ -258,7 +274,7 @@ public function extend($id, $callable) */ public function keys() { - return array_keys($this->values); + return \array_keys($this->values); } /** diff --git a/samples/server/petstore/php-slim/vendor/pimple/pimple/src/Pimple/Tests/PimpleTest.php b/samples/server/petstore/php-slim/vendor/pimple/pimple/src/Pimple/Tests/PimpleTest.php index 918f620d8841..acb66e000261 100644 --- a/samples/server/petstore/php-slim/vendor/pimple/pimple/src/Pimple/Tests/PimpleTest.php +++ b/samples/server/petstore/php-slim/vendor/pimple/pimple/src/Pimple/Tests/PimpleTest.php @@ -29,7 +29,7 @@ use Pimple\Container; /** - * @author Igor Wiedler + * @author Igor Wiedler */ class PimpleTest extends \PHPUnit_Framework_TestCase { @@ -106,7 +106,7 @@ public function testConstructorInjection() } /** - * @expectedException \InvalidArgumentException + * @expectedException \Pimple\Exception\UnknownIdentifierException * @expectedExceptionMessage Identifier "foo" is not defined. */ public function testOffsetGetValidatesKeyIsPresent() @@ -115,6 +115,17 @@ public function testOffsetGetValidatesKeyIsPresent() echo $pimple['foo']; } + /** + * @group legacy + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage Identifier "foo" is not defined. + */ + public function testLegacyOffsetGetValidatesKeyIsPresent() + { + $pimple = new Container(); + echo $pimple['foo']; + } + public function testOffsetGetHonorsNullValues() { $pimple = new Container(); @@ -187,11 +198,11 @@ public function testRawHonorsNullValues() public function testFluentRegister() { $pimple = new Container(); - $this->assertSame($pimple, $pimple->register($this->getMock('Pimple\ServiceProviderInterface'))); + $this->assertSame($pimple, $pimple->register($this->getMockBuilder('Pimple\ServiceProviderInterface')->getMock())); } /** - * @expectedException \InvalidArgumentException + * @expectedException \Pimple\Exception\UnknownIdentifierException * @expectedExceptionMessage Identifier "foo" is not defined. */ public function testRawValidatesKeyIsPresent() @@ -200,6 +211,17 @@ public function testRawValidatesKeyIsPresent() $pimple->raw('foo'); } + /** + * @group legacy + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage Identifier "foo" is not defined. + */ + public function testLegacyRawValidatesKeyIsPresent() + { + $pimple = new Container(); + $pimple->raw('foo'); + } + /** * @dataProvider serviceDefinitionProvider */ @@ -251,7 +273,7 @@ public function testExtendDoesNotLeakWithFactories() } /** - * @expectedException \InvalidArgumentException + * @expectedException \Pimple\Exception\UnknownIdentifierException * @expectedExceptionMessage Identifier "foo" is not defined. */ public function testExtendValidatesKeyIsPresent() @@ -260,6 +282,17 @@ public function testExtendValidatesKeyIsPresent() $pimple->extend('foo', function () {}); } + /** + * @group legacy + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage Identifier "foo" is not defined. + */ + public function testLegacyExtendValidatesKeyIsPresent() + { + $pimple = new Container(); + $pimple->extend('foo', function () {}); + } + public function testKeys() { $pimple = new Container(); @@ -289,7 +322,7 @@ public function settingNonInvokableObjectShouldTreatItAsParameter() /** * @dataProvider badServiceDefinitionProvider - * @expectedException \InvalidArgumentException + * @expectedException \Pimple\Exception\ExpectedInvokableException * @expectedExceptionMessage Service definition is not a Closure or invokable object. */ public function testFactoryFailsForInvalidServiceDefinitions($service) @@ -299,8 +332,20 @@ public function testFactoryFailsForInvalidServiceDefinitions($service) } /** + * @group legacy * @dataProvider badServiceDefinitionProvider * @expectedException \InvalidArgumentException + * @expectedExceptionMessage Service definition is not a Closure or invokable object. + */ + public function testLegacyFactoryFailsForInvalidServiceDefinitions($service) + { + $pimple = new Container(); + $pimple->factory($service); + } + + /** + * @dataProvider badServiceDefinitionProvider + * @expectedException \Pimple\Exception\ExpectedInvokableException * @expectedExceptionMessage Callable is not a Closure or invokable object. */ public function testProtectFailsForInvalidServiceDefinitions($service) @@ -310,8 +355,20 @@ public function testProtectFailsForInvalidServiceDefinitions($service) } /** + * @group legacy * @dataProvider badServiceDefinitionProvider * @expectedException \InvalidArgumentException + * @expectedExceptionMessage Callable is not a Closure or invokable object. + */ + public function testLegacyProtectFailsForInvalidServiceDefinitions($service) + { + $pimple = new Container(); + $pimple->protect($service); + } + + /** + * @dataProvider badServiceDefinitionProvider + * @expectedException \Pimple\Exception\InvalidServiceIdentifierException * @expectedExceptionMessage Identifier "foo" does not contain an object definition. */ public function testExtendFailsForKeysNotContainingServiceDefinitions($service) @@ -322,8 +379,39 @@ public function testExtendFailsForKeysNotContainingServiceDefinitions($service) } /** + * @group legacy * @dataProvider badServiceDefinitionProvider * @expectedException \InvalidArgumentException + * @expectedExceptionMessage Identifier "foo" does not contain an object definition. + */ + public function testLegacyExtendFailsForKeysNotContainingServiceDefinitions($service) + { + $pimple = new Container(); + $pimple['foo'] = $service; + $pimple->extend('foo', function () {}); + } + + /** + * @group legacy + * @expectedDeprecation How Pimple behaves when extending protected closures will be fixed in Pimple 4. Are you sure "foo" should be protected? + */ + public function testExtendingProtectedClosureDeprecation() + { + $pimple = new Container(); + $pimple['foo'] = $pimple->protect(function () { + return 'bar'; + }); + + $pimple->extend('foo', function ($value) { + return $value.'-baz'; + }); + + $this->assertSame('bar-baz', $pimple['foo']); + } + + /** + * @dataProvider badServiceDefinitionProvider + * @expectedException \Pimple\Exception\ExpectedInvokableException * @expectedExceptionMessage Extension service definition is not a Closure or invokable object. */ public function testExtendFailsForInvalidServiceDefinitions($service) @@ -333,6 +421,49 @@ public function testExtendFailsForInvalidServiceDefinitions($service) $pimple->extend('foo', $service); } + /** + * @group legacy + * @dataProvider badServiceDefinitionProvider + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage Extension service definition is not a Closure or invokable object. + */ + public function testLegacyExtendFailsForInvalidServiceDefinitions($service) + { + $pimple = new Container(); + $pimple['foo'] = function () {}; + $pimple->extend('foo', $service); + } + + /** + * @expectedException \Pimple\Exception\FrozenServiceException + * @expectedExceptionMessage Cannot override frozen service "foo". + */ + public function testExtendFailsIfFrozenServiceIsNonInvokable() + { + $pimple = new Container(); + $pimple['foo'] = function () { + return new Fixtures\NonInvokable(); + }; + $foo = $pimple['foo']; + + $pimple->extend('foo', function () {}); + } + + /** + * @expectedException \Pimple\Exception\FrozenServiceException + * @expectedExceptionMessage Cannot override frozen service "foo". + */ + public function testExtendFailsIfFrozenServiceIsInvokable() + { + $pimple = new Container(); + $pimple['foo'] = function () { + return new Fixtures\Invokable(); + }; + $foo = $pimple['foo']; + + $pimple->extend('foo', function () {}); + } + /** * Provider for invalid service definitions. */ @@ -375,7 +506,7 @@ public function testDefiningNewServiceAfterFreeze() } /** - * @expectedException \RuntimeException + * @expectedException \Pimple\Exception\FrozenServiceException * @expectedExceptionMessage Cannot override frozen service "foo". */ public function testOverridingServiceAfterFreeze() @@ -391,6 +522,24 @@ public function testOverridingServiceAfterFreeze() }; } + /** + * @group legacy + * @expectedException \RuntimeException + * @expectedExceptionMessage Cannot override frozen service "foo". + */ + public function testLegacyOverridingServiceAfterFreeze() + { + $pimple = new Container(); + $pimple['foo'] = function () { + return 'foo'; + }; + $foo = $pimple['foo']; + + $pimple['foo'] = function () { + return 'bar'; + }; + } + public function testRemovingServiceAfterFreeze() { $pimple = new Container(); diff --git a/samples/server/petstore/php-slim/vendor/psr/http-message/composer.json b/samples/server/petstore/php-slim/vendor/psr/http-message/composer.json index 4774b6126276..b0d2937a03a5 100644 --- a/samples/server/petstore/php-slim/vendor/psr/http-message/composer.json +++ b/samples/server/petstore/php-slim/vendor/psr/http-message/composer.json @@ -2,6 +2,7 @@ "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": [ { diff --git a/samples/server/petstore/php-slim/vendor/psr/http-message/src/MessageInterface.php b/samples/server/petstore/php-slim/vendor/psr/http-message/src/MessageInterface.php index 8f67a050e8cf..dd46e5ec81ee 100644 --- a/samples/server/petstore/php-slim/vendor/psr/http-message/src/MessageInterface.php +++ b/samples/server/petstore/php-slim/vendor/psr/http-message/src/MessageInterface.php @@ -36,7 +36,7 @@ public function getProtocolVersion(); * new protocol version. * * @param string $version HTTP protocol version - * @return self + * @return static */ public function withProtocolVersion($version); @@ -61,7 +61,7 @@ public function withProtocolVersion($version); * 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 + * @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. */ @@ -126,7 +126,7 @@ public function getHeaderLine($name); * * @param string $name Case-insensitive header field name. * @param string|string[] $value Header value(s). - * @return self + * @return static * @throws \InvalidArgumentException for invalid header names or values. */ public function withHeader($name, $value); @@ -144,7 +144,7 @@ public function withHeader($name, $value); * * @param string $name Case-insensitive header field name to add. * @param string|string[] $value Header value(s). - * @return self + * @return static * @throws \InvalidArgumentException for invalid header names or values. */ public function withAddedHeader($name, $value); @@ -159,7 +159,7 @@ public function withAddedHeader($name, $value); * the named header. * * @param string $name Case-insensitive header field name to remove. - * @return self + * @return static */ public function withoutHeader($name); @@ -180,7 +180,7 @@ public function getBody(); * new body stream. * * @param StreamInterface $body Body. - * @return self + * @return static * @throws \InvalidArgumentException When the body is not valid. */ public function withBody(StreamInterface $body); diff --git a/samples/server/petstore/php-slim/vendor/psr/http-message/src/RequestInterface.php b/samples/server/petstore/php-slim/vendor/psr/http-message/src/RequestInterface.php index 75c802e2927d..a96d4fd63667 100644 --- a/samples/server/petstore/php-slim/vendor/psr/http-message/src/RequestInterface.php +++ b/samples/server/petstore/php-slim/vendor/psr/http-message/src/RequestInterface.php @@ -53,10 +53,10 @@ public function getRequestTarget(); * 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 + * @link http://tools.ietf.org/html/rfc7230#section-5.3 (for the various * request-target forms allowed in request messages) * @param mixed $requestTarget - * @return self + * @return static */ public function withRequestTarget($requestTarget); @@ -79,7 +79,7 @@ public function getMethod(); * changed request method. * * @param string $method Case-sensitive method. - * @return self + * @return static * @throws \InvalidArgumentException for invalid HTTP methods. */ public function withMethod($method); @@ -107,7 +107,7 @@ public function getUri(); * 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 + * - 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 @@ -123,7 +123,7 @@ public function getUri(); * @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 + * @return static */ public function withUri(UriInterface $uri, $preserveHost = false); } diff --git a/samples/server/petstore/php-slim/vendor/psr/http-message/src/ResponseInterface.php b/samples/server/petstore/php-slim/vendor/psr/http-message/src/ResponseInterface.php index 6724809e3ac0..c306514e6bbd 100644 --- a/samples/server/petstore/php-slim/vendor/psr/http-message/src/ResponseInterface.php +++ b/samples/server/petstore/php-slim/vendor/psr/http-message/src/ResponseInterface.php @@ -46,7 +46,7 @@ public function getStatusCode(); * @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 + * @return static * @throws \InvalidArgumentException For invalid status code arguments. */ public function withStatus($code, $reasonPhrase = ''); diff --git a/samples/server/petstore/php-slim/vendor/psr/http-message/src/ServerRequestInterface.php b/samples/server/petstore/php-slim/vendor/psr/http-message/src/ServerRequestInterface.php index 916e0658d370..02512340ad85 100644 --- a/samples/server/petstore/php-slim/vendor/psr/http-message/src/ServerRequestInterface.php +++ b/samples/server/petstore/php-slim/vendor/psr/http-message/src/ServerRequestInterface.php @@ -80,7 +80,7 @@ public function getCookieParams(); * updated cookie values. * * @param array $cookies Array of key/value pairs representing cookies. - * @return self + * @return static */ public function withCookieParams(array $cookies); @@ -118,7 +118,7 @@ public function getQueryParams(); * * @param array $query Array of query string arguments, typically from * $_GET. - * @return self + * @return static */ public function withQueryParams(array $query); @@ -143,8 +143,8 @@ public function getUploadedFiles(); * immutability of the message, and MUST return an instance that has the * updated body parameters. * - * @param array An array tree of UploadedFileInterface instances. - * @return self + * @param array $uploadedFiles An array tree of UploadedFileInterface instances. + * @return static * @throws \InvalidArgumentException if an invalid structure is provided. */ public function withUploadedFiles(array $uploadedFiles); @@ -190,7 +190,7 @@ public function getParsedBody(); * * @param null|array|object $data The deserialized body data. This will * typically be in an array or object. - * @return self + * @return static * @throws \InvalidArgumentException if an unsupported argument type is * provided. */ @@ -239,7 +239,7 @@ public function getAttribute($name, $default = null); * @see getAttributes() * @param string $name The attribute name. * @param mixed $value The value of the attribute. - * @return self + * @return static */ public function withAttribute($name, $value); @@ -255,7 +255,7 @@ public function withAttribute($name, $value); * * @see getAttributes() * @param string $name The attribute name. - * @return self + * @return static */ public function withoutAttribute($name); } diff --git a/samples/server/petstore/php-slim/vendor/psr/http-message/src/UploadedFileInterface.php b/samples/server/petstore/php-slim/vendor/psr/http-message/src/UploadedFileInterface.php index 5ad288d2be35..f8a6901e0144 100644 --- a/samples/server/petstore/php-slim/vendor/psr/http-message/src/UploadedFileInterface.php +++ b/samples/server/petstore/php-slim/vendor/psr/http-message/src/UploadedFileInterface.php @@ -58,7 +58,7 @@ public function getStream(); * @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 \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. */ diff --git a/samples/server/petstore/php-slim/vendor/psr/http-message/src/UriInterface.php b/samples/server/petstore/php-slim/vendor/psr/http-message/src/UriInterface.php index 1ff5bf01dded..9d7ab9eae8f2 100644 --- a/samples/server/petstore/php-slim/vendor/psr/http-message/src/UriInterface.php +++ b/samples/server/petstore/php-slim/vendor/psr/http-message/src/UriInterface.php @@ -185,7 +185,7 @@ public function getFragment(); * 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. + * @return static A new instance with the specified scheme. * @throws \InvalidArgumentException for invalid or unsupported schemes. */ public function withScheme($scheme); @@ -202,7 +202,7 @@ public function withScheme($scheme); * * @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. + * @return static A new instance with the specified user information. */ public function withUserInfo($user, $password = null); @@ -215,7 +215,7 @@ public function withUserInfo($user, $password = null); * 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. + * @return static A new instance with the specified host. * @throws \InvalidArgumentException for invalid hostnames. */ public function withHost($host); @@ -234,7 +234,7 @@ public function withHost($host); * * @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. + * @return static A new instance with the specified port. * @throws \InvalidArgumentException for invalid ports. */ public function withPort($port); @@ -258,7 +258,7 @@ public function withPort($port); * 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. + * @return static A new instance with the specified path. * @throws \InvalidArgumentException for invalid paths. */ public function withPath($path); @@ -275,7 +275,7 @@ public function withPath($path); * 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. + * @return static A new instance with the specified query string. * @throws \InvalidArgumentException for invalid query strings. */ public function withQuery($query); @@ -292,7 +292,7 @@ public function withQuery($query); * 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. + * @return static A new instance with the specified fragment. */ public function withFragment($fragment); diff --git a/samples/server/petstore/php-slim/vendor/slim/slim/CONTRIBUTING.md b/samples/server/petstore/php-slim/vendor/slim/slim/CONTRIBUTING.md deleted file mode 100644 index 9bbb6b17ca2c..000000000000 --- a/samples/server/petstore/php-slim/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/samples/server/petstore/php-slim/vendor/slim/slim/LICENSE.md b/samples/server/petstore/php-slim/vendor/slim/slim/LICENSE.md index 0875f84f9057..682c21dc7a47 100644 --- a/samples/server/petstore/php-slim/vendor/slim/slim/LICENSE.md +++ b/samples/server/petstore/php-slim/vendor/slim/slim/LICENSE.md @@ -1,4 +1,4 @@ -Copyright (c) 2011-2016 Josh Lockhart +Copyright (c) 2011-2017 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 diff --git a/samples/server/petstore/php-slim/vendor/slim/slim/README.md b/samples/server/petstore/php-slim/vendor/slim/slim/README.md deleted file mode 100644 index d20f3939d1c4..000000000000 --- a/samples/server/petstore/php-slim/vendor/slim/slim/README.md +++ /dev/null @@ -1,84 +0,0 @@ -# Slim Framework - -[![Build Status](https://travis-ci.org/slimphp/Slim.svg?branch=develop)](https://travis-ci.org/slimphp/Slim) -[![Coverage Status](https://coveralls.io/repos/slimphp/Slim/badge.svg)](https://coveralls.io/r/slimphp/Slim) -[![Total Downloads](https://poser.pugx.org/slim/slim/downloads)](https://packagist.org/packages/slim/slim) -[![License](https://poser.pugx.org/slim/slim/license)](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 -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/samples/server/petstore/php-slim/vendor/slim/slim/Slim/App.php b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/App.php index 639d9b9b4709..ba2aef40695f 100644 --- a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/App.php +++ b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/App.php @@ -1,21 +1,23 @@ withHeader('Location', (string)$to)->withStatus($status); + }; + + return $this->get($from, $handler); + } + /** * Route Groups * @@ -292,10 +307,31 @@ public function group($pattern, $callable) */ public function run($silent = false) { - $request = $this->container->get('request'); $response = $this->container->get('response'); - $response = $this->process($request, $response); + try { + ob_start(); + $response = $this->process($this->container->get('request'), $response); + } catch (InvalidMethodException $e) { + $response = $this->processInvalidMethod($e->getRequest(), $response); + } finally { + $output = ob_get_clean(); + } + + if (!empty($output) && $response->getBody()->isWritable()) { + $outputBuffering = $this->container->get('settings')['outputBuffering']; + if ($outputBuffering === 'prepend') { + // prepend output buffer content + $body = new Http\Body(fopen('php://temp', 'r+')); + $body->write($output . $response->getBody()); + $response = $response->withBody($body); + } elseif ($outputBuffering === 'append') { + // append output buffer content + $response->getBody()->write($output); + } + } + + $response = $this->finalize($response); if (!$silent) { $this->respond($response); @@ -304,6 +340,39 @@ public function run($silent = false) return $response; } + /** + * Pull route info for a request with a bad method to decide whether to + * return a not-found error (default) or a bad-method error, then run + * the handler for that error, returning the resulting response. + * + * Used for cases where an incoming request has an unrecognized method, + * rather than throwing an exception and not catching it all the way up. + * + * @param ServerRequestInterface $request + * @param ResponseInterface $response + * @return ResponseInterface + */ + protected function processInvalidMethod(ServerRequestInterface $request, ResponseInterface $response) + { + $router = $this->container->get('router'); + if (is_callable([$request->getUri(), 'getBasePath']) && is_callable([$router, 'setBasePath'])) { + $router->setBasePath($request->getUri()->getBasePath()); + } + + $request = $this->dispatchRouterAndPrepareRoute($request, $router); + $routeInfo = $request->getAttribute('routeInfo', [RouterInterface::DISPATCH_STATUS => Dispatcher::NOT_FOUND]); + + if ($routeInfo[RouterInterface::DISPATCH_STATUS] === Dispatcher::METHOD_NOT_ALLOWED) { + return $this->handleException( + new MethodNotAllowedException($request, $response, $routeInfo[RouterInterface::ALLOWED_METHODS]), + $request, + $response + ); + } + + return $this->handleException(new NotFoundException($request, $response), $request, $response); + } + /** * Process a request * @@ -341,13 +410,11 @@ public function process(ServerRequestInterface $request, ResponseInterface $resp $response = $this->handlePhpError($e, $request, $response); } - $response = $this->finalize($response); - return $response; } /** - * Send the response the client + * Send the response to the client * * @param ResponseInterface $response */ @@ -355,6 +422,16 @@ public function respond(ResponseInterface $response) { // Send response if (!headers_sent()) { + // Headers + foreach ($response->getHeaders() as $name => $values) { + foreach ($values as $value) { + header(sprintf('%s: %s', $name, $value), false); + } + } + + // Set the status _after_ the headers, because of PHP's "helpful" behavior with location headers. + // See https://github.com/slimphp/Slim/issues/1730 + // Status header(sprintf( 'HTTP/%s %s %s', @@ -362,13 +439,6 @@ public function respond(ResponseInterface $response) $response->getStatusCode(), $response->getReasonPhrase() )); - - // Headers - foreach ($response->getHeaders() as $name => $values) { - foreach ($values as $value) { - header(sprintf('%s: %s', $name, $value), false); - } - } } // Body @@ -391,9 +461,9 @@ public function respond(ResponseInterface $response) while ($amountToRead > 0 && !$body->eof()) { $data = $body->read(min($chunkSize, $amountToRead)); echo $data; - + $amountToRead -= strlen($data); - + if (connection_status() != CONNECTION_NORMAL) { break; } @@ -597,7 +667,7 @@ protected function handleException(Exception $e, ServerRequestInterface $request $params = [$e->getRequest(), $e->getResponse(), $e->getAllowedMethods()]; } elseif ($e instanceof NotFoundException) { $handler = 'notFoundHandler'; - $params = [$e->getRequest(), $e->getResponse()]; + $params = [$e->getRequest(), $e->getResponse(), $e]; } elseif ($e instanceof SlimException) { // This is a Stop exception and contains the response return $e->getResponse(); diff --git a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/CallableResolver.php b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/CallableResolver.php index 705a9f207fe0..2211a3291878 100644 --- a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/CallableResolver.php +++ b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/CallableResolver.php @@ -1,15 +1,15 @@ 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_string($toResolve)) { + $this->assertCallable($toResolve); } - if (!is_callable($resolved)) { - throw new RuntimeException(sprintf('%s is not resolvable', $toResolve)); + // check for slim callable as "class:method" + if (preg_match(self::CALLABLE_PATTERN, $toResolve, $matches)) { + $resolved = $this->resolveCallable($matches[1], $matches[2]); + $this->assertCallable($resolved); + + return $resolved; } + $resolved = $this->resolveCallable($toResolve); + $this->assertCallable($resolved); + return $resolved; } + + /** + * Check if string is something in the DIC + * that's callable or is a class name which has an __invoke() method. + * + * @param string $class + * @param string $method + * @return callable + * + * @throws \RuntimeException if the callable does not exist + */ + protected function resolveCallable($class, $method = '__invoke') + { + if ($this->container->has($class)) { + return [$this->container->get($class), $method]; + } + + if (!class_exists($class)) { + throw new RuntimeException(sprintf('Callable %s does not exist', $class)); + } + + return [new $class($this->container), $method]; + } + + /** + * @param Callable $callable + * + * @throws \RuntimeException if the callable is not resolvable + */ + protected function assertCallable($callable) + { + if (!is_callable($callable)) { + throw new RuntimeException(sprintf( + '%s is not resolvable', + is_array($callable) || is_object($callable) ? json_encode($callable) : $callable + )); + } + } } diff --git a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/CallableResolverAwareTrait.php b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/CallableResolverAwareTrait.php index f7ff485282d2..ffb4eb28a439 100644 --- a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/CallableResolverAwareTrait.php +++ b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/CallableResolverAwareTrait.php @@ -1,15 +1,15 @@ $value) { - $this->set($key, $value); - } + $this->replace($items); } /******************************************************************************** @@ -68,7 +66,7 @@ public function get($key, $default = null) } /** - * Add item to collection + * 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 */ diff --git a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Container.php b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Container.php index c97f2b3fdf44..1f713ac4eabb 100644 --- a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Container.php +++ b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Container.php @@ -1,9 +1,9 @@ get('settings')['routerCacheFile'])) { $routerCacheFile = $container->get('settings')['routerCacheFile']; } - - return (new Router)->setCacheFile($routerCacheFile); + + + $router = (new Router)->setCacheFile($routerCacheFile); + if (method_exists($router, 'setContainer')) { + $router->setContainer($container); + } + + return $router; }; } @@ -147,7 +152,9 @@ public function register($container) * @return callable */ $container['errorHandler'] = function ($container) { - return new Error($container->get('settings')['displayErrorDetails']); + return new Error( + $container->get('settings')['displayErrorDetails'] + ); }; } diff --git a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/DeferredCallable.php b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/DeferredCallable.php index def58ab23b36..22887c0fce63 100644 --- a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/DeferredCallable.php +++ b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/DeferredCallable.php @@ -1,10 +1,16 @@ renderHtmlErrorMessage($exception); break; - + default: throw new UnexpectedValueException('Cannot render unknown content type ' . $contentType); } @@ -81,7 +81,7 @@ protected function renderHtmlErrorMessage(\Exception $exception) while ($exception = $exception->getPrevious()) { $html .= '

Previous exception

'; - $html .= $this->renderHtmlException($exception); + $html .= $this->renderHtmlExceptionOrError($exception); } } else { $html = '

A website error has occurred. Sorry for the temporary inconvenience.

'; @@ -103,12 +103,30 @@ protected function renderHtmlErrorMessage(\Exception $exception) /** * Render exception as HTML. * + * Provided for backwards compatibility; use renderHtmlExceptionOrError(). + * * @param \Exception $exception * * @return string */ protected function renderHtmlException(\Exception $exception) { + return $this->renderHtmlExceptionOrError($exception); + } + + /** + * Render exception or error as HTML. + * + * @param \Exception|\Error $exception + * + * @return string + */ + protected function renderHtmlExceptionOrError($exception) + { + if (!$exception instanceof \Exception && !$exception instanceof \Error) { + throw new \RuntimeException("Unexpected type. Expected Exception or Error."); + } + $html = sprintf('
Type: %s
', get_class($exception)); if (($code = $exception->getCode())) { diff --git a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Handlers/NotAllowed.php b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Handlers/NotAllowed.php index 3442f20bc528..345f0ff8c42f 100644 --- a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Handlers/NotAllowed.php +++ b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Handlers/NotAllowed.php @@ -1,9 +1,9 @@ getMethod() === 'OPTIONS') { $status = 200; $contentType = 'text/plain'; - $output = $this->renderPlainNotAllowedMessage($methods); + $output = $this->renderPlainOptionsMessage($methods); } else { $status = 405; $contentType = $this->determineContentType($request); @@ -70,12 +70,12 @@ public function __invoke(ServerRequestInterface $request, ResponseInterface $res } /** - * Render PLAIN not allowed message + * Render PLAIN message for OPTIONS response * * @param array $methods * @return string */ - protected function renderPlainNotAllowedMessage($methods) + protected function renderPlainOptionsMessage($methods) { $allow = implode(', ', $methods); diff --git a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Handlers/NotFound.php b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Handlers/NotFound.php index ab1d47a4575d..b3330321ff38 100644 --- a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Handlers/NotFound.php +++ b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Handlers/NotFound.php @@ -1,9 +1,9 @@ determineContentType($request); - switch ($contentType) { - case 'application/json': - $output = $this->renderJsonNotFoundOutput(); - break; + if ($request->getMethod() === 'OPTIONS') { + $contentType = 'text/plain'; + $output = $this->renderPlainNotFoundOutput(); + } else { + $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/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); + 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+')); @@ -59,6 +64,16 @@ public function __invoke(ServerRequestInterface $request, ResponseInterface $res ->withBody($body); } + /** + * Render plain not found message + * + * @return ResponseInterface + */ + protected function renderPlainNotFoundOutput() + { + return 'Not found'; + } + /** * Return a response for application/json content not found * diff --git a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Handlers/PhpError.php b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Handlers/PhpError.php index 0122ddb07852..3ecce30cfaf0 100644 --- a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Handlers/PhpError.php +++ b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Handlers/PhpError.php @@ -1,9 +1,9 @@ null, 'expires' => null, 'secure' => false, - 'httponly' => false + 'httponly' => false, + 'samesite' => null ]; /** @@ -141,7 +142,7 @@ protected function toHeader($name, array $properties) if (isset($properties['secure']) && $properties['secure']) { $result .= '; secure'; } - + if (isset($properties['hostonly']) && $properties['hostonly']) { $result .= '; HostOnly'; } @@ -150,6 +151,11 @@ protected function toHeader($name, array $properties) $result .= '; HttpOnly'; } + if (isset($properties['samesite']) && in_array(strtolower($properties['samesite']), ['lax', 'strict'], true)) { + // While strtolower is needed for correct comparison, the RFC doesn't care about case + $result .= '; SameSite=' . $properties['samesite']; + } + return $result; } @@ -174,7 +180,7 @@ public static function parseHeader($header) } $header = rtrim($header, "\r\n"); - $pieces = preg_split('@\s*[;,]\s*@', $header); + $pieces = preg_split('@[;]\s*@', $header); $cookies = []; foreach ($pieces as $cookie) { diff --git a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/Environment.php b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/Environment.php index a106fa8b8770..cd452fcff97e 100644 --- a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/Environment.php +++ b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/Environment.php @@ -1,9 +1,9 @@ 'HTTP/1.1', 'REQUEST_METHOD' => 'GET', + 'REQUEST_SCHEME' => $defscheme, 'SCRIPT_NAME' => '', 'REQUEST_URI' => '', 'QUERY_STRING' => '', 'SERVER_NAME' => 'localhost', - 'SERVER_PORT' => 80, + 'SERVER_PORT' => $defport, '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', diff --git a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/Headers.php b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/Headers.php index 4aa7a5e4de01..ef50f84b6015 100644 --- a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/Headers.php +++ b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/Headers.php @@ -1,9 +1,9 @@ get('HTTP_AUTHORIZATION'); - if (null === $authorization && is_callable('getallheaders')) { + if (empty($authorization) && is_callable('getallheaders')) { $headers = getallheaders(); $headers = array_change_key_case($headers, CASE_LOWER); if (isset($headers['authorization'])) { diff --git a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/Message.php b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/Message.php index d0e832d695f1..9195fb5b70fa 100644 --- a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/Message.php +++ b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/Message.php @@ -1,9 +1,9 @@ true, + '1.1' => true, + '2.0' => true, + '2' => true, + ]; + /** * Headers * @@ -86,13 +98,11 @@ public function getProtocolVersion() */ public function withProtocolVersion($version) { - static $valid = [ - '1.0' => true, - '1.1' => true, - '2.0' => true, - ]; - if (!isset($valid[$version])) { - throw new InvalidArgumentException('Invalid HTTP version. Must be one of: 1.0, 1.1, 2.0'); + 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; diff --git a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/Request.php b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/Request.php index 7d5b185dcd83..3bda649b3353 100644 --- a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/Request.php +++ b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/Request.php @@ -1,9 +1,9 @@ 1, @@ -131,7 +133,7 @@ class Request extends Message implements ServerRequestInterface * * @param Environment $environment The Slim application Environment * - * @return self + * @return static */ public static function createFromEnvironment(Environment $environment) { @@ -166,6 +168,7 @@ public static function createFromEnvironment(Environment $environment) * @param array $serverParams The server environment variables * @param StreamInterface $body The request body object * @param array $uploadedFiles The request uploadedFiles collection + * @throws InvalidMethodException on invalid HTTP method */ public function __construct( $method, @@ -176,7 +179,12 @@ public function __construct( StreamInterface $body, array $uploadedFiles = [] ) { - $this->originalMethod = $this->filterMethod($method); + try { + $this->originalMethod = $this->filterMethod($method); + } catch (InvalidMethodException $e) { + $this->originalMethod = $method; + } + $this->uri = $uri; $this->headers = $headers; $this->cookies = $cookies; @@ -189,25 +197,43 @@ public function __construct( $this->protocolVersion = str_replace('HTTP/', '', $serverParams['SERVER_PROTOCOL']); } - if (!$this->headers->has('Host') || $this->uri->getHost() !== '') { - $this->headers->set('Host', $this->uri->getHost()); + if (!$this->headers->has('Host') && $this->uri->getHost() !== '') { + $port = $this->uri->getPort() ? ":{$this->uri->getPort()}" : ''; + + $this->headers->set('Host', $this->uri->getHost() . $port); } $this->registerMediaTypeParser('application/json', function ($input) { - return json_decode($input, true); + $result = json_decode($input, true); + if (!is_array($result)) { + return null; + } + return $result; }); $this->registerMediaTypeParser('application/xml', function ($input) { $backup = libxml_disable_entity_loader(true); + $backup_errors = libxml_use_internal_errors(true); $result = simplexml_load_string($input); libxml_disable_entity_loader($backup); + libxml_clear_errors(); + libxml_use_internal_errors($backup_errors); + if ($result === false) { + return null; + } return $result; }); $this->registerMediaTypeParser('text/xml', function ($input) { $backup = libxml_disable_entity_loader(true); + $backup_errors = libxml_use_internal_errors(true); $result = simplexml_load_string($input); libxml_disable_entity_loader($backup); + libxml_clear_errors(); + libxml_use_internal_errors($backup_errors); + if ($result === false) { + return null; + } return $result; }); @@ -215,6 +241,11 @@ public function __construct( parse_str($input, $data); return $data; }); + + // if the request had an invalid method, we can throw it now + if (isset($e) && $e instanceof InvalidMethodException) { + throw $e; + } } /** @@ -248,12 +279,9 @@ public function getMethod() 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']); + $overrideMethod = $this->filterMethod($this->getParsedBodyParam('_METHOD')); + if ($overrideMethod !== null) { + $this->method = $overrideMethod; } if ($this->getBody()->eof()) { @@ -289,7 +317,7 @@ public function getOriginalMethod() * changed request method. * * @param string $method Case-sensitive method. - * @return self + * @return static * @throws \InvalidArgumentException for invalid HTTP methods. */ public function withMethod($method) @@ -323,11 +351,8 @@ protected function filterMethod($method) } $method = strtoupper($method); - if (!isset($this->validMethods[$method])) { - throw new InvalidArgumentException(sprintf( - 'Unsupported HTTP method "%s" provided', - $method - )); + if (preg_match("/^[!#$%&'*+.^_`|~0-9a-z-]+$/i", $method) !== 1) { + throw new InvalidMethodException($this, $method); } return $method; @@ -500,7 +525,7 @@ public function getRequestTarget() * @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 + * @return static * @throws InvalidArgumentException if the request target is invalid */ public function withRequestTarget($requestTarget) @@ -558,7 +583,7 @@ public function getUri() * @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 + * @return static */ public function withUri(UriInterface $uri, $preserveHost = false) { @@ -570,7 +595,7 @@ public function withUri(UriInterface $uri, $preserveHost = false) $clone->headers->set('Host', $uri->getHost()); } } else { - if ($this->uri->getHost() !== '' && (!$this->hasHeader('Host') || $this->getHeader('Host') === null)) { + if ($uri->getHost() !== '' && (!$this->hasHeader('Host') || $this->getHeaderLine('Host') === '')) { $clone->headers->set('Host', $uri->getHost()); } } @@ -684,6 +709,27 @@ 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 $key 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. * @@ -699,7 +745,7 @@ public function getCookieParams() * updated cookie values. * * @param array $cookies Array of key/value pairs representing cookies. - * @return self + * @return static */ public function withCookieParams(array $cookies) { @@ -760,7 +806,7 @@ public function getQueryParams() * * @param array $query Array of query string arguments, typically from * $_GET. - * @return self + * @return static */ public function withQueryParams(array $query) { @@ -799,7 +845,7 @@ public function getUploadedFiles() * updated body parameters. * * @param array $uploadedFiles An array tree of UploadedFileInterface instances. - * @return self + * @return static * @throws \InvalidArgumentException if an invalid structure is provided. */ public function withUploadedFiles(array $uploadedFiles) @@ -828,6 +874,22 @@ public function getServerParams() return $this->serverParams; } + /** + * Retrieve a server parameter. + * + * Note: This method is not part of the PSR-7 standard. + * + * @param string $key + * @param mixed $default + * @return mixed + */ + public function getServerParam($key, $default = null) + { + $serverParams = $this->getServerParams(); + + return isset($serverParams[$key]) ? $serverParams[$key] : $default; + } + /******************************************************************************* * Attributes ******************************************************************************/ @@ -881,7 +943,7 @@ public function getAttribute($name, $default = null) * @see getAttributes() * @param string $name The attribute name. * @param mixed $value The value of the attribute. - * @return self + * @return static */ public function withAttribute($name, $value) { @@ -904,7 +966,7 @@ public function withAttribute($name, $value) * updated attributes. * * @param array $attributes New attributes - * @return self + * @return static */ public function withAttributes(array $attributes) { @@ -926,7 +988,7 @@ public function withAttributes(array $attributes) * * @see getAttributes() * @param string $name The attribute name. - * @return self + * @return static */ public function withoutAttribute($name) { @@ -1014,7 +1076,7 @@ public function getParsedBody() * * @param null|array|object $data The deserialized body data. This will * typically be in an array or object. - * @return self + * @return static * @throws \InvalidArgumentException if an unsupported argument type is * provided. */ @@ -1035,7 +1097,7 @@ public function withParsedBody($data) * * Note: This method is not part of the PSR-7 standard. * - * @return self + * @return $this */ public function reparseBody() { @@ -1097,10 +1159,10 @@ public function getParam($key, $default = null) * * Note: This method is not part of the PSR-7 standard. * - * @param $key - * @param null $default + * @param string $key + * @param mixed $default * - * @return null + * @return mixed */ public function getParsedBodyParam($key, $default = null) { @@ -1120,10 +1182,10 @@ public function getParsedBodyParam($key, $default = null) * * Note: This method is not part of the PSR-7 standard. * - * @param $key - * @param null $default + * @param string $key + * @param mixed $default * - * @return null + * @return mixed */ public function getQueryParam($key, $default = null) { @@ -1137,13 +1199,14 @@ public function getQueryParam($key, $default = null) } /** - * Fetch assocative array of body and query string parameters. + * Fetch associative array of body and query string parameters. * * Note: This method is not part of the PSR-7 standard. * - * @return array + * @param array|null $only list the keys to retrieve. + * @return array|null */ - public function getParams() + public function getParams(array $only = null) { $params = $this->getQueryParams(); $postParams = $this->getParsedBody(); @@ -1151,6 +1214,16 @@ public function getParams() $params = array_merge($params, (array)$postParams); } + if ($only) { + $onlyParams = []; + foreach ($only as $key) { + if (array_key_exists($key, $params)) { + $onlyParams[$key] = $params[$key]; + } + } + return $onlyParams; + } + return $params; } } diff --git a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/RequestBody.php b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/RequestBody.php index 2345fe4354c7..50887fddc23b 100644 --- a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/RequestBody.php +++ b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/RequestBody.php @@ -1,9 +1,9 @@ 'Requested Range Not Satisfiable', 417 => 'Expectation Failed', 418 => 'I\'m a teapot', + 421 => 'Misdirected Request', 422 => 'Unprocessable Entity', 423 => 'Locked', 424 => 'Failed Dependency', @@ -98,7 +99,9 @@ class Response extends Message implements ResponseInterface 428 => 'Precondition Required', 429 => 'Too Many Requests', 431 => 'Request Header Fields Too Large', + 444 => 'Connection Closed Without Response', 451 => 'Unavailable For Legal Reasons', + 499 => 'Client Closed Request', //Server Error 5xx 500 => 'Internal Server Error', 501 => 'Not Implemented', @@ -111,8 +114,16 @@ class Response extends Message implements ResponseInterface 508 => 'Loop Detected', 510 => 'Not Extended', 511 => 'Network Authentication Required', + 599 => 'Network Connect Timeout Error', ]; + /** + * EOL characters used for HTTP response. + * + * @var string + */ + const EOL = "\r\n"; + /** * Create new HTTP response. * @@ -172,7 +183,7 @@ public function getStatusCode() * @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 + * @return static * @throws \InvalidArgumentException For invalid status code arguments. */ public function withStatus($code, $reasonPhrase = '') @@ -238,6 +249,34 @@ public function getReasonPhrase() return ''; } + /******************************************************************************* + * Headers + ******************************************************************************/ + + /** + * Return an instance with the provided value replacing the specified header. + * + * If a Location header is set and the status code is 200, then set the status + * code to 302 to mimic what PHP does. See https://github.com/slimphp/Slim/issues/1730 + * + * @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); + + if ($clone->getStatusCode() === 200 && strtolower($name) === 'location') { + $clone = $clone->withStatus(302); + } + + return $clone; + } + + /******************************************************************************* * Body ******************************************************************************/ @@ -250,7 +289,7 @@ public function getReasonPhrase() * Proxies to the underlying stream and writes the provided data to it. * * @param string $data - * @return self + * @return $this */ public function write($data) { @@ -273,7 +312,7 @@ public function write($data) * * @param string|UriInterface $url The redirect destination. * @param int|null $status The redirect HTTP status code. - * @return self + * @return static */ public function withRedirect($url, $status = null) { @@ -302,20 +341,19 @@ public function withRedirect($url, $status = null) * @param int $status The HTTP status code. * @param int $encodingOptions Json encoding options * @throws \RuntimeException - * @return self + * @return static */ public function withJson($data, $status = null, $encodingOptions = 0) { - $body = $this->getBody(); - $body->rewind(); - $body->write($json = json_encode($data, $encodingOptions)); + $response = $this->withBody(new Body(fopen('php://temp', 'r+'))); + $response->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'); + $responseWithJson = $response->withHeader('Content-Type', 'application/json;charset=utf-8'); if (isset($status)) { return $responseWithJson->withStatus($status); } @@ -458,11 +496,11 @@ public function __toString() $this->getStatusCode(), $this->getReasonPhrase() ); - $output .= PHP_EOL; + $output .= Response::EOL; foreach ($this->getHeaders() as $name => $values) { - $output .= sprintf('%s: %s', $name, $this->getHeaderLine($name)) . PHP_EOL; + $output .= sprintf('%s: %s', $name, $this->getHeaderLine($name)) . Response::EOL; } - $output .= PHP_EOL; + $output .= Response::EOL; $output .= (string)$this->getBody(); return $output; diff --git a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/Stream.php b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/Stream.php index 97de9ac0090a..27c7a7645bf6 100644 --- a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/Stream.php +++ b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/Stream.php @@ -1,9 +1,9 @@ writable = null; $this->seekable = null; $this->size = null; + $this->isPipe = null; return $oldResource; } @@ -196,7 +211,11 @@ public function __toString() public function close() { if ($this->isAttached() === true) { - fclose($this->stream); + if ($this->isPipe()) { + pclose($this->stream); + } else { + fclose($this->stream); + } } $this->detach(); @@ -211,7 +230,7 @@ public function getSize() { if (!$this->size && $this->isAttached() === true) { $stats = fstat($this->stream); - $this->size = isset($stats['size']) ? $stats['size'] : null; + $this->size = isset($stats['size']) && !$this->isPipe() ? $stats['size'] : null; } return $this->size; @@ -226,7 +245,7 @@ public function getSize() */ public function tell() { - if (!$this->isAttached() || ($position = ftell($this->stream)) === false) { + if (!$this->isAttached() || ($position = ftell($this->stream)) === false || $this->isPipe()) { throw new RuntimeException('Could not get the position of the pointer in stream'); } @@ -251,13 +270,17 @@ public function eof() public function isReadable() { if ($this->readable === null) { - $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; + 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; + } } } } @@ -300,7 +323,7 @@ public function isSeekable() $this->seekable = false; if ($this->isAttached()) { $meta = $this->getMetadata(); - $this->seekable = $meta['seekable']; + $this->seekable = !$this->isPipe() && $meta['seekable']; } } @@ -406,4 +429,22 @@ public function getContents() 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/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/UploadedFile.php b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/UploadedFile.php index ff970277c7c7..ae5dfb65e593 100644 --- a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/UploadedFile.php +++ b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/UploadedFile.php @@ -1,9 +1,9 @@ 0; + if (!$targetIsStream && !is_writable(dirname($targetPath))) { throw new InvalidArgumentException('Upload target path is not writable'); } - $targetIsStream = strpos($targetPath, '://') > 0; if ($targetIsStream) { if (!copy($this->file, $targetPath)) { throw new RuntimeException(sprintf('Error moving uploaded file %1s to %2s', $this->name, $targetPath)); diff --git a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/Uri.php b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/Uri.php index 27b1d0d59389..fb0f04b5c3e9 100644 --- a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/Uri.php +++ b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/Uri.php @@ -1,9 +1,9 @@ get('QUERY_STRING', ''); + if ($queryString === '') { + $queryString = parse_url('http://example.com' . $env->get('REQUEST_URI'), PHP_URL_QUERY); + } // Fragment $fragment = ''; @@ -375,12 +378,33 @@ public function getUserInfo() public function withUserInfo($user, $password = null) { $clone = clone $this; - $clone->user = $user; - $clone->password = $password ? $password : ''; + $clone->user = $this->filterUserInfo($user); + if ($clone->user) { + $clone->password = $password ? $this->filterUserInfo($password) : ''; + } else { + $clone->password = ''; + } return $clone; } + /** + * Filters the user info string. + * + * @param string $query The raw uri query string. + * @return string The percent-encoded query string. + */ + protected function filterUserInfo($query) + { + return preg_replace_callback( + '/(?:[^a-zA-Z0-9_\-\.~!\$&\'\(\)\*\+,;=]+|%(?![A-Fa-f0-9]{2}))/u', + function ($match) { + return rawurlencode($match[0]); + }, + $query + ); + } + /** * Retrieve the host component of the URI. * diff --git a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Interfaces/CallableResolverInterface.php b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Interfaces/CallableResolverInterface.php index 9bde59ac97a7..17d81dbe84ea 100644 --- a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Interfaces/CallableResolverInterface.php +++ b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Interfaces/CallableResolverInterface.php @@ -1,9 +1,9 @@ stack)) { + if (is_null($this->tip)) { $this->seedMiddlewareStack(); } - $next = $this->stack->top(); - $this->stack[] = function (ServerRequestInterface $req, ResponseInterface $res) use ($callable, $next) { - $result = call_user_func($callable, $req, $res, $next); + $next = $this->tip; + $this->tip = function ( + ServerRequestInterface $request, + ResponseInterface $response + ) use ( + $callable, + $next + ) { + $result = call_user_func($callable, $request, $response, $next); if ($result instanceof ResponseInterface === false) { throw new UnexpectedValueException( 'Middleware must return instance of \Psr\Http\Message\ResponseInterface' @@ -86,35 +89,33 @@ protected function addMiddleware(callable $callable) */ protected function seedMiddlewareStack(callable $kernel = null) { - if (!is_null($this->stack)) { + if (!is_null($this->tip)) { 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; + $this->tip = $kernel; } /** * Call middleware stack * - * @param ServerRequestInterface $req A request object - * @param ResponseInterface $res A response object + * @param ServerRequestInterface $request A request object + * @param ResponseInterface $response A response object * * @return ResponseInterface */ - public function callMiddlewareStack(ServerRequestInterface $req, ResponseInterface $res) + public function callMiddlewareStack(ServerRequestInterface $request, ResponseInterface $response) { - if (is_null($this->stack)) { + if (is_null($this->tip)) { $this->seedMiddlewareStack(); } /** @var callable $start */ - $start = $this->stack->top(); + $start = $this->tip; $this->middlewareLock = true; - $resp = $start($req, $res); + $response = $start($request, $response); $this->middlewareLock = false; - return $resp; + return $response; } } diff --git a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Routable.php b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Routable.php index 4a6759fac469..c912db433a14 100644 --- a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Routable.php +++ b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Routable.php @@ -1,14 +1,14 @@ middleware[] = new DeferredCallable($callable, $this->container); return $this; } - + /** * Set the route pattern * - * @set string + * @param string $newPattern */ public function setPattern($newPattern) { diff --git a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Route.php b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Route.php index 3cb4a0e28b4a..fa8be4e44688 100644 --- a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Route.php +++ b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Route.php @@ -1,14 +1,13 @@ methods = $methods; + $this->methods = is_string($methods) ? [$methods] : $methods; $this->pattern = $pattern; $this->callable = $callable; $this->groups = $groups; @@ -120,6 +126,16 @@ public function getCallable() return $this->callable; } + /** + * This method enables you to override the Route's callable + * + * @param string|\Closure $callable + */ + public function setCallable($callable) + { + $this->callable = $callable; + } + /** * Get route methods * @@ -246,7 +262,7 @@ public function getArguments() * Retrieve a specific route argument * * @param string $name - * @param mixed $default + * @param string|null $default * * @return mixed */ @@ -316,19 +332,7 @@ public function __invoke(ServerRequestInterface $request, ResponseInterface $res /** @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; - } - } + $newResponse = $handler($this->callable, $request, $response, $this->arguments); if ($newResponse instanceof ResponseInterface) { // if route callback returns a ResponseInterface, then use it @@ -340,18 +344,6 @@ public function __invoke(ServerRequestInterface $request, ResponseInterface $res } } - 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/samples/server/petstore/php-slim/vendor/slim/slim/Slim/RouteGroup.php b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/RouteGroup.php index a0cdf4d47d8d..8260bbd6c760 100644 --- a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/RouteGroup.php +++ b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/RouteGroup.php @@ -1,9 +1,9 @@ bindTo($app); } - $callable(); + $callable($app); } } diff --git a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Router.php b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Router.php index b9d5d132ab2f..83116288c68c 100644 --- a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Router.php +++ b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Router.php @@ -1,21 +1,21 @@ container = $container; + } + /** * Add route * @@ -153,7 +168,7 @@ public function map($methods, $pattern, $handler) $methods = array_map("strtoupper", $methods); // Add route - $route = new Route($methods, $pattern, $handler, $this->routeGroups, $this->routeCounter); + $route = $this->createRoute($methods, $pattern, $handler); $this->routes[$route->getIdentifier()] = $route; $this->routeCounter++; @@ -179,6 +194,25 @@ public function dispatch(ServerRequestInterface $request) ); } + /** + * Create a new Route object + * + * @param string[] $methods Array of HTTP methods + * @param string $pattern The route pattern + * @param callable $callable The route callable + * + * @return \Slim\Interfaces\RouteInterface + */ + protected function createRoute($methods, $pattern, $callable) + { + $route = new Route($methods, $pattern, $callable, $this->routeGroups, $this->routeCounter); + if (!empty($this->container)) { + $route->setContainer($this->container); + } + + return $route; + } + /** * @return \FastRoute\Dispatcher */ @@ -244,7 +278,7 @@ public function getNamedRoute($name) } throw new RuntimeException('Named route does not exist for name: ' . $name); } - + /** * Remove named route * diff --git a/samples/server/petstore/php-slim/vendor/slim/slim/composer.json b/samples/server/petstore/php-slim/vendor/slim/slim/composer.json index 808eb9d38577..554a838a95d5 100644 --- a/samples/server/petstore/php-slim/vendor/slim/slim/composer.json +++ b/samples/server/petstore/php-slim/vendor/slim/slim/composer.json @@ -3,7 +3,7 @@ "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", + "homepage": "https://slimframework.com", "license": "MIT", "authors": [ { @@ -32,7 +32,8 @@ "pimple/pimple": "^3.0", "psr/http-message": "^1.0", "nikic/fast-route": "^1.0", - "container-interop/container-interop": "^1.1" + "container-interop/container-interop": "^1.2", + "psr/container": "^1.0" }, "require-dev": { "squizlabs/php_codesniffer": "^2.5", diff --git a/samples/server/petstore/php-slim/vendor/slim/slim/example/.htaccess b/samples/server/petstore/php-slim/vendor/slim/slim/example/.htaccess deleted file mode 100644 index 0784bd22014a..000000000000 --- a/samples/server/petstore/php-slim/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/samples/server/petstore/php-slim/vendor/slim/slim/example/README.md b/samples/server/petstore/php-slim/vendor/slim/slim/example/README.md deleted file mode 100644 index e4fb35982c25..000000000000 --- a/samples/server/petstore/php-slim/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/samples/server/petstore/php-slim/vendor/slim/slim/example/index.php b/samples/server/petstore/php-slim/vendor/slim/slim/example/index.php deleted file mode 100644 index ef895f83f93b..000000000000 --- a/samples/server/petstore/php-slim/vendor/slim/slim/example/index.php +++ /dev/null @@ -1,45 +0,0 @@ -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(); From c5f928a510f4e42c7af128256a5ef97d5025b444 Mon Sep 17 00:00:00 2001 From: Yuriy Belenko Date: Thu, 21 Jun 2018 23:31:40 +0500 Subject: [PATCH 11/11] [Slim] Proper .gitignore added to PhpSlimServerCodegen. Vendor folder with all dependencies removed to keep repo more clean. --- .../languages/PhpSlimServerCodegen.java | 1 + .../src/main/resources/slim/.gitignore | 6 + .../petstore-security-test/slim/.gitignore | 6 + .../slim/vendor/autoload.php | 7 - .../slim/vendor/composer/ClassLoader.php | 445 ------ .../slim/vendor/composer/LICENSE | 21 - .../vendor/composer/autoload_classmap.php | 9 - .../slim/vendor/composer/autoload_files.php | 10 - .../vendor/composer/autoload_namespaces.php | 10 - .../slim/vendor/composer/autoload_psr4.php | 14 - .../slim/vendor/composer/autoload_real.php | 70 - .../slim/vendor/composer/installed.json | 311 ----- .../container-interop/.gitignore | 3 - .../container-interop/LICENSE | 20 - .../container-interop/README.md | 148 -- .../container-interop/composer.json | 15 - .../docs/ContainerInterface-meta.md | 114 -- .../docs/ContainerInterface.md | 158 --- .../docs/Delegate-lookup-meta.md | 259 ---- .../container-interop/docs/Delegate-lookup.md | 60 - .../docs/images/interoperating_containers.png | Bin 25738 -> 0 bytes .../docs/images/priority.png | Bin 16252 -> 0 bytes .../docs/images/side_by_side_containers.png | Bin 16265 -> 0 bytes .../Interop/Container/ContainerInterface.php | 15 - .../Exception/ContainerException.php | 15 - .../Container/Exception/NotFoundException.php | 15 - .../slim/vendor/nikic/fast-route/.hhconfig | 1 - .../slim/vendor/nikic/fast-route/.travis.yml | 20 - .../vendor/nikic/fast-route/FastRoute.hhi | 126 -- .../slim/vendor/nikic/fast-route/LICENSE | 31 - .../slim/vendor/nikic/fast-route/README.md | 313 ----- .../vendor/nikic/fast-route/composer.json | 24 - .../slim/vendor/nikic/fast-route/phpunit.xml | 24 - .../fast-route/src/BadRouteException.php | 7 - .../nikic/fast-route/src/DataGenerator.php | 26 - .../src/DataGenerator/CharCountBased.php | 31 - .../src/DataGenerator/GroupCountBased.php | 30 - .../src/DataGenerator/GroupPosBased.php | 27 - .../src/DataGenerator/MarkBased.php | 27 - .../src/DataGenerator/RegexBasedAbstract.php | 186 --- .../nikic/fast-route/src/Dispatcher.php | 26 - .../src/Dispatcher/CharCountBased.php | 31 - .../src/Dispatcher/GroupCountBased.php | 31 - .../src/Dispatcher/GroupPosBased.php | 33 - .../fast-route/src/Dispatcher/MarkBased.php | 31 - .../src/Dispatcher/RegexBasedAbstract.php | 88 -- .../vendor/nikic/fast-route/src/Route.php | 47 - .../nikic/fast-route/src/RouteCollector.php | 152 -- .../nikic/fast-route/src/RouteParser.php | 37 - .../nikic/fast-route/src/RouteParser/Std.php | 87 -- .../vendor/nikic/fast-route/src/bootstrap.php | 12 - .../vendor/nikic/fast-route/src/functions.php | 74 - .../test/Dispatcher/CharCountBasedTest.php | 16 - .../test/Dispatcher/DispatcherTest.php | 581 -------- .../test/Dispatcher/GroupCountBasedTest.php | 16 - .../test/Dispatcher/GroupPosBasedTest.php | 16 - .../test/Dispatcher/MarkBasedTest.php | 24 - .../HackTypechecker/HackTypecheckerTest.php | 44 - .../HackTypechecker/fixtures/all_options.php | 29 - .../fixtures/empty_options.php | 11 - .../HackTypechecker/fixtures/no_options.php | 11 - .../fast-route/test/RouteParser/StdTest.php | 154 --- .../nikic/fast-route/test/bootstrap.php | 11 - .../slim/vendor/pimple/pimple/.gitignore | 3 - .../slim/vendor/pimple/pimple/.travis.yml | 40 - .../slim/vendor/pimple/pimple/CHANGELOG | 59 - .../slim/vendor/pimple/pimple/LICENSE | 19 - .../slim/vendor/pimple/pimple/README.rst | 326 ----- .../slim/vendor/pimple/pimple/composer.json | 29 - .../pimple/pimple/ext/pimple/.gitignore | 30 - .../vendor/pimple/pimple/ext/pimple/README.md | 12 - .../vendor/pimple/pimple/ext/pimple/config.m4 | 63 - .../pimple/pimple/ext/pimple/config.w32 | 13 - .../pimple/pimple/ext/pimple/php_pimple.h | 137 -- .../vendor/pimple/pimple/ext/pimple/pimple.c | 1114 --------------- .../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 - .../pimple/pimple/src/Pimple/Container.php | 298 ---- .../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 | 589 -------- .../slim/vendor/psr/http-message/LICENSE | 19 - .../slim/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 -- .../psr/http-message/src/UriInterface.php | 323 ----- .../slim/vendor/slim/slim/LICENSE.md | 19 - .../slim/vendor/slim/slim/Slim/App.php | 714 ---------- .../slim/slim/Slim/CallableResolver.php | 110 -- .../slim/Slim/CallableResolverAwareTrait.php | 47 - .../slim/vendor/slim/slim/Slim/Collection.php | 202 --- .../slim/vendor/slim/slim/Slim/Container.php | 179 --- .../slim/Slim/DefaultServicesProvider.php | 211 --- .../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 | 224 --- .../slim/slim/Slim/Handlers/NotAllowed.php | 147 -- .../slim/slim/Slim/Handlers/NotFound.php | 141 -- .../slim/slim/Slim/Handlers/PhpError.php | 205 --- .../Handlers/Strategies/RequestResponse.php | 43 - .../Strategies/RequestResponseArgs.php | 42 - .../slim/vendor/slim/slim/Slim/Http/Body.php | 22 - .../vendor/slim/slim/Slim/Http/Cookies.php | 201 --- .../slim/slim/Slim/Http/Environment.php | 63 - .../vendor/slim/slim/Slim/Http/Headers.php | 222 --- .../vendor/slim/slim/Slim/Http/Message.php | 305 ---- .../vendor/slim/slim/Slim/Http/Request.php | 1229 ----------------- .../slim/slim/Slim/Http/RequestBody.php | 27 - .../vendor/slim/slim/Slim/Http/Response.php | 508 ------- .../vendor/slim/slim/Slim/Http/Stream.php | 450 ------ .../slim/slim/Slim/Http/UploadedFile.php | 327 ----- .../slim/vendor/slim/slim/Slim/Http/Uri.php | 845 ------------ .../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 | 140 -- .../slim/Slim/Interfaces/RouterInterface.php | 111 -- .../slim/slim/Slim/MiddlewareAwareTrait.php | 121 -- .../slim/vendor/slim/slim/Slim/Routable.php | 106 -- .../slim/vendor/slim/slim/Slim/Route.php | 349 ----- .../slim/vendor/slim/slim/Slim/RouteGroup.php | 47 - .../slim/vendor/slim/slim/Slim/Router.php | 455 ------ .../slim/vendor/slim/slim/composer.json | 58 - samples/server/petstore/php-slim/.gitignore | 6 + .../petstore/php-slim/vendor/autoload.php | 7 - .../php-slim/vendor/composer/ClassLoader.php | 445 ------ .../vendor/composer/autoload_classmap.php | 9 - .../vendor/composer/autoload_files.php | 10 - .../vendor/composer/autoload_namespaces.php | 10 - .../vendor/composer/autoload_psr4.php | 14 - .../vendor/composer/autoload_real.php | 70 - .../php-slim/vendor/composer/installed.json | 311 ----- .../container-interop/.gitignore | 3 - .../container-interop/README.md | 148 -- .../container-interop/composer.json | 15 - .../docs/ContainerInterface-meta.md | 114 -- .../docs/ContainerInterface.md | 158 --- .../docs/Delegate-lookup-meta.md | 259 ---- .../container-interop/docs/Delegate-lookup.md | 60 - .../docs/images/interoperating_containers.png | Bin 25738 -> 0 bytes .../docs/images/priority.png | Bin 16252 -> 0 bytes .../docs/images/side_by_side_containers.png | Bin 16265 -> 0 bytes .../Interop/Container/ContainerInterface.php | 15 - .../Exception/ContainerException.php | 15 - .../Container/Exception/NotFoundException.php | 15 - .../vendor/nikic/fast-route/.hhconfig | 1 - .../vendor/nikic/fast-route/.travis.yml | 20 - .../vendor/nikic/fast-route/FastRoute.hhi | 126 -- .../vendor/nikic/fast-route/README.md | 313 ----- .../vendor/nikic/fast-route/composer.json | 24 - .../vendor/nikic/fast-route/phpunit.xml | 24 - .../fast-route/src/BadRouteException.php | 7 - .../nikic/fast-route/src/DataGenerator.php | 26 - .../src/DataGenerator/CharCountBased.php | 31 - .../src/DataGenerator/GroupCountBased.php | 30 - .../src/DataGenerator/GroupPosBased.php | 27 - .../src/DataGenerator/MarkBased.php | 27 - .../src/DataGenerator/RegexBasedAbstract.php | 186 --- .../nikic/fast-route/src/Dispatcher.php | 26 - .../src/Dispatcher/CharCountBased.php | 31 - .../src/Dispatcher/GroupCountBased.php | 31 - .../src/Dispatcher/GroupPosBased.php | 33 - .../fast-route/src/Dispatcher/MarkBased.php | 31 - .../src/Dispatcher/RegexBasedAbstract.php | 88 -- .../vendor/nikic/fast-route/src/Route.php | 47 - .../nikic/fast-route/src/RouteCollector.php | 152 -- .../nikic/fast-route/src/RouteParser.php | 37 - .../nikic/fast-route/src/RouteParser/Std.php | 87 -- .../vendor/nikic/fast-route/src/bootstrap.php | 12 - .../vendor/nikic/fast-route/src/functions.php | 74 - .../test/Dispatcher/CharCountBasedTest.php | 16 - .../test/Dispatcher/DispatcherTest.php | 581 -------- .../test/Dispatcher/GroupCountBasedTest.php | 16 - .../test/Dispatcher/GroupPosBasedTest.php | 16 - .../test/Dispatcher/MarkBasedTest.php | 24 - .../HackTypechecker/HackTypecheckerTest.php | 44 - .../HackTypechecker/fixtures/all_options.php | 29 - .../fixtures/empty_options.php | 11 - .../HackTypechecker/fixtures/no_options.php | 11 - .../fast-route/test/RouteParser/StdTest.php | 154 --- .../nikic/fast-route/test/bootstrap.php | 11 - .../php-slim/vendor/pimple/pimple/.gitignore | 3 - .../php-slim/vendor/pimple/pimple/.travis.yml | 40 - .../php-slim/vendor/pimple/pimple/CHANGELOG | 59 - .../php-slim/vendor/pimple/pimple/README.rst | 326 ----- .../vendor/pimple/pimple/composer.json | 29 - .../pimple/pimple/ext/pimple/.gitignore | 30 - .../vendor/pimple/pimple/ext/pimple/README.md | 12 - .../vendor/pimple/pimple/ext/pimple/config.m4 | 63 - .../pimple/pimple/ext/pimple/config.w32 | 13 - .../pimple/pimple/ext/pimple/php_pimple.h | 137 -- .../vendor/pimple/pimple/ext/pimple/pimple.c | 1114 --------------- .../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 - .../pimple/pimple/src/Pimple/Container.php | 298 ---- .../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 | 589 -------- .../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 -- .../psr/http-message/src/UriInterface.php | 323 ----- .../php-slim/vendor/slim/slim/LICENSE.md | 19 - .../php-slim/vendor/slim/slim/Slim/App.php | 714 ---------- .../slim/slim/Slim/CallableResolver.php | 110 -- .../slim/Slim/CallableResolverAwareTrait.php | 47 - .../vendor/slim/slim/Slim/Collection.php | 202 --- .../vendor/slim/slim/Slim/Container.php | 179 --- .../slim/Slim/DefaultServicesProvider.php | 211 --- .../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 | 224 --- .../slim/slim/Slim/Handlers/NotAllowed.php | 147 -- .../slim/slim/Slim/Handlers/NotFound.php | 141 -- .../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 | 201 --- .../slim/slim/Slim/Http/Environment.php | 63 - .../vendor/slim/slim/Slim/Http/Headers.php | 222 --- .../vendor/slim/slim/Slim/Http/Message.php | 305 ---- .../vendor/slim/slim/Slim/Http/Request.php | 1229 ----------------- .../slim/slim/Slim/Http/RequestBody.php | 27 - .../vendor/slim/slim/Slim/Http/Response.php | 508 ------- .../vendor/slim/slim/Slim/Http/Stream.php | 450 ------ .../slim/slim/Slim/Http/UploadedFile.php | 327 ----- .../vendor/slim/slim/Slim/Http/Uri.php | 845 ------------ .../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 | 140 -- .../slim/Slim/Interfaces/RouterInterface.php | 111 -- .../slim/slim/Slim/MiddlewareAwareTrait.php | 121 -- .../vendor/slim/slim/Slim/Routable.php | 106 -- .../php-slim/vendor/slim/slim/Slim/Route.php | 349 ----- .../vendor/slim/slim/Slim/RouteGroup.php | 47 - .../php-slim/vendor/slim/slim/Slim/Router.php | 455 ------ .../php-slim/vendor/slim/slim/composer.json | 58 - 321 files changed, 19 insertions(+), 35118 deletions(-) create mode 100644 modules/openapi-generator/src/main/resources/slim/.gitignore create mode 100644 samples/server/petstore-security-test/slim/.gitignore delete mode 100644 samples/server/petstore-security-test/slim/vendor/autoload.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/composer/ClassLoader.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/composer/LICENSE delete mode 100644 samples/server/petstore-security-test/slim/vendor/composer/autoload_classmap.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/composer/autoload_files.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/composer/autoload_namespaces.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/composer/autoload_psr4.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/composer/autoload_real.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/composer/installed.json delete mode 100644 samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/.gitignore delete mode 100644 samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/LICENSE delete mode 100644 samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/README.md delete mode 100644 samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/composer.json delete mode 100644 samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/docs/ContainerInterface-meta.md delete mode 100644 samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/docs/ContainerInterface.md delete mode 100644 samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/docs/Delegate-lookup-meta.md delete mode 100644 samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/docs/Delegate-lookup.md delete mode 100644 samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/docs/images/interoperating_containers.png delete mode 100644 samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/docs/images/priority.png delete mode 100644 samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/docs/images/side_by_side_containers.png delete mode 100644 samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/src/Interop/Container/ContainerInterface.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/src/Interop/Container/Exception/ContainerException.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/src/Interop/Container/Exception/NotFoundException.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/nikic/fast-route/.hhconfig delete mode 100644 samples/server/petstore-security-test/slim/vendor/nikic/fast-route/.travis.yml delete mode 100644 samples/server/petstore-security-test/slim/vendor/nikic/fast-route/FastRoute.hhi delete mode 100644 samples/server/petstore-security-test/slim/vendor/nikic/fast-route/LICENSE delete mode 100644 samples/server/petstore-security-test/slim/vendor/nikic/fast-route/README.md delete mode 100644 samples/server/petstore-security-test/slim/vendor/nikic/fast-route/composer.json delete mode 100644 samples/server/petstore-security-test/slim/vendor/nikic/fast-route/phpunit.xml delete mode 100644 samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/BadRouteException.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/DataGenerator.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/DataGenerator/CharCountBased.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/DataGenerator/GroupCountBased.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/DataGenerator/GroupPosBased.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/DataGenerator/MarkBased.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Dispatcher.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Dispatcher/CharCountBased.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Dispatcher/GroupCountBased.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Dispatcher/GroupPosBased.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Dispatcher/MarkBased.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Dispatcher/RegexBasedAbstract.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Route.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/RouteCollector.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/RouteParser.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/RouteParser/Std.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/bootstrap.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/functions.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/Dispatcher/CharCountBasedTest.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/Dispatcher/DispatcherTest.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/Dispatcher/GroupCountBasedTest.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/Dispatcher/GroupPosBasedTest.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/Dispatcher/MarkBasedTest.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/HackTypechecker/HackTypecheckerTest.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/HackTypechecker/fixtures/all_options.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/HackTypechecker/fixtures/empty_options.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/HackTypechecker/fixtures/no_options.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/RouteParser/StdTest.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/bootstrap.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/pimple/pimple/.gitignore delete mode 100644 samples/server/petstore-security-test/slim/vendor/pimple/pimple/.travis.yml delete mode 100644 samples/server/petstore-security-test/slim/vendor/pimple/pimple/CHANGELOG delete mode 100644 samples/server/petstore-security-test/slim/vendor/pimple/pimple/LICENSE delete mode 100644 samples/server/petstore-security-test/slim/vendor/pimple/pimple/README.rst delete mode 100644 samples/server/petstore-security-test/slim/vendor/pimple/pimple/composer.json delete mode 100644 samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/.gitignore delete mode 100644 samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/README.md delete mode 100644 samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/config.m4 delete mode 100644 samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/config.w32 delete mode 100644 samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/php_pimple.h delete mode 100644 samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/pimple.c delete mode 100644 samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/pimple_compat.h delete mode 100644 samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/001.phpt delete mode 100644 samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/002.phpt delete mode 100644 samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/003.phpt delete mode 100644 samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/004.phpt delete mode 100644 samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/005.phpt delete mode 100644 samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/006.phpt delete mode 100644 samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/007.phpt delete mode 100644 samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/008.phpt delete mode 100644 samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/009.phpt delete mode 100644 samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/010.phpt delete mode 100644 samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/011.phpt delete mode 100644 samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/012.phpt delete mode 100644 samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/013.phpt delete mode 100644 samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/014.phpt delete mode 100644 samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/015.phpt delete mode 100644 samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/016.phpt delete mode 100644 samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/017.phpt delete mode 100644 samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/017_1.phpt delete mode 100644 samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/018.phpt delete mode 100644 samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/019.phpt delete mode 100644 samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/bench.phpb delete mode 100644 samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/bench_shared.phpb delete mode 100644 samples/server/petstore-security-test/slim/vendor/pimple/pimple/phpunit.xml.dist delete mode 100644 samples/server/petstore-security-test/slim/vendor/pimple/pimple/src/Pimple/Container.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/pimple/pimple/src/Pimple/ServiceProviderInterface.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/pimple/pimple/src/Pimple/Tests/Fixtures/Invokable.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/pimple/pimple/src/Pimple/Tests/Fixtures/NonInvokable.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/pimple/pimple/src/Pimple/Tests/Fixtures/PimpleServiceProvider.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/pimple/pimple/src/Pimple/Tests/Fixtures/Service.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/pimple/pimple/src/Pimple/Tests/PimpleServiceProviderInterfaceTest.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/pimple/pimple/src/Pimple/Tests/PimpleTest.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/psr/http-message/LICENSE delete mode 100644 samples/server/petstore-security-test/slim/vendor/psr/http-message/README.md delete mode 100644 samples/server/petstore-security-test/slim/vendor/psr/http-message/composer.json delete mode 100644 samples/server/petstore-security-test/slim/vendor/psr/http-message/src/MessageInterface.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/psr/http-message/src/RequestInterface.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/psr/http-message/src/ResponseInterface.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/psr/http-message/src/ServerRequestInterface.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/psr/http-message/src/StreamInterface.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/psr/http-message/src/UploadedFileInterface.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/psr/http-message/src/UriInterface.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/slim/slim/LICENSE.md delete mode 100644 samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/App.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/CallableResolver.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/CallableResolverAwareTrait.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Collection.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Container.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/DefaultServicesProvider.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/DeferredCallable.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Exception/ContainerException.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Exception/ContainerValueNotFoundException.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Exception/MethodNotAllowedException.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Exception/NotFoundException.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Exception/SlimException.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Handlers/AbstractError.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Handlers/AbstractHandler.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Handlers/Error.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Handlers/NotAllowed.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Handlers/NotFound.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Handlers/PhpError.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Handlers/Strategies/RequestResponse.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Handlers/Strategies/RequestResponseArgs.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/Body.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/Cookies.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/Environment.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/Headers.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/Message.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/Request.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/RequestBody.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/Response.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/Stream.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/UploadedFile.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/Uri.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Interfaces/CallableResolverInterface.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Interfaces/CollectionInterface.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Interfaces/Http/CookiesInterface.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Interfaces/Http/EnvironmentInterface.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Interfaces/Http/HeadersInterface.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Interfaces/InvocationStrategyInterface.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Interfaces/RouteGroupInterface.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Interfaces/RouteInterface.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Interfaces/RouterInterface.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/MiddlewareAwareTrait.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Routable.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Route.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/RouteGroup.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Router.php delete mode 100644 samples/server/petstore-security-test/slim/vendor/slim/slim/composer.json create mode 100644 samples/server/petstore/php-slim/.gitignore delete mode 100644 samples/server/petstore/php-slim/vendor/autoload.php delete mode 100644 samples/server/petstore/php-slim/vendor/composer/ClassLoader.php delete mode 100644 samples/server/petstore/php-slim/vendor/composer/autoload_classmap.php delete mode 100644 samples/server/petstore/php-slim/vendor/composer/autoload_files.php delete mode 100644 samples/server/petstore/php-slim/vendor/composer/autoload_namespaces.php delete mode 100644 samples/server/petstore/php-slim/vendor/composer/autoload_psr4.php delete mode 100644 samples/server/petstore/php-slim/vendor/composer/autoload_real.php delete mode 100644 samples/server/petstore/php-slim/vendor/composer/installed.json delete mode 100644 samples/server/petstore/php-slim/vendor/container-interop/container-interop/.gitignore delete mode 100644 samples/server/petstore/php-slim/vendor/container-interop/container-interop/README.md delete mode 100644 samples/server/petstore/php-slim/vendor/container-interop/container-interop/composer.json delete mode 100644 samples/server/petstore/php-slim/vendor/container-interop/container-interop/docs/ContainerInterface-meta.md delete mode 100644 samples/server/petstore/php-slim/vendor/container-interop/container-interop/docs/ContainerInterface.md delete mode 100644 samples/server/petstore/php-slim/vendor/container-interop/container-interop/docs/Delegate-lookup-meta.md delete mode 100644 samples/server/petstore/php-slim/vendor/container-interop/container-interop/docs/Delegate-lookup.md delete mode 100644 samples/server/petstore/php-slim/vendor/container-interop/container-interop/docs/images/interoperating_containers.png delete mode 100644 samples/server/petstore/php-slim/vendor/container-interop/container-interop/docs/images/priority.png delete mode 100644 samples/server/petstore/php-slim/vendor/container-interop/container-interop/docs/images/side_by_side_containers.png delete mode 100644 samples/server/petstore/php-slim/vendor/container-interop/container-interop/src/Interop/Container/ContainerInterface.php delete mode 100644 samples/server/petstore/php-slim/vendor/container-interop/container-interop/src/Interop/Container/Exception/ContainerException.php delete mode 100644 samples/server/petstore/php-slim/vendor/container-interop/container-interop/src/Interop/Container/Exception/NotFoundException.php delete mode 100644 samples/server/petstore/php-slim/vendor/nikic/fast-route/.hhconfig delete mode 100644 samples/server/petstore/php-slim/vendor/nikic/fast-route/.travis.yml delete mode 100644 samples/server/petstore/php-slim/vendor/nikic/fast-route/FastRoute.hhi delete mode 100644 samples/server/petstore/php-slim/vendor/nikic/fast-route/README.md delete mode 100644 samples/server/petstore/php-slim/vendor/nikic/fast-route/composer.json delete mode 100644 samples/server/petstore/php-slim/vendor/nikic/fast-route/phpunit.xml delete mode 100644 samples/server/petstore/php-slim/vendor/nikic/fast-route/src/BadRouteException.php delete mode 100644 samples/server/petstore/php-slim/vendor/nikic/fast-route/src/DataGenerator.php delete mode 100644 samples/server/petstore/php-slim/vendor/nikic/fast-route/src/DataGenerator/CharCountBased.php delete mode 100644 samples/server/petstore/php-slim/vendor/nikic/fast-route/src/DataGenerator/GroupCountBased.php delete mode 100644 samples/server/petstore/php-slim/vendor/nikic/fast-route/src/DataGenerator/GroupPosBased.php delete mode 100644 samples/server/petstore/php-slim/vendor/nikic/fast-route/src/DataGenerator/MarkBased.php delete mode 100644 samples/server/petstore/php-slim/vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php delete mode 100644 samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Dispatcher.php delete mode 100644 samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Dispatcher/CharCountBased.php delete mode 100644 samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Dispatcher/GroupCountBased.php delete mode 100644 samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Dispatcher/GroupPosBased.php delete mode 100644 samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Dispatcher/MarkBased.php delete mode 100644 samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Dispatcher/RegexBasedAbstract.php delete mode 100644 samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Route.php delete mode 100644 samples/server/petstore/php-slim/vendor/nikic/fast-route/src/RouteCollector.php delete mode 100644 samples/server/petstore/php-slim/vendor/nikic/fast-route/src/RouteParser.php delete mode 100644 samples/server/petstore/php-slim/vendor/nikic/fast-route/src/RouteParser/Std.php delete mode 100644 samples/server/petstore/php-slim/vendor/nikic/fast-route/src/bootstrap.php delete mode 100644 samples/server/petstore/php-slim/vendor/nikic/fast-route/src/functions.php delete mode 100644 samples/server/petstore/php-slim/vendor/nikic/fast-route/test/Dispatcher/CharCountBasedTest.php delete mode 100644 samples/server/petstore/php-slim/vendor/nikic/fast-route/test/Dispatcher/DispatcherTest.php delete mode 100644 samples/server/petstore/php-slim/vendor/nikic/fast-route/test/Dispatcher/GroupCountBasedTest.php delete mode 100644 samples/server/petstore/php-slim/vendor/nikic/fast-route/test/Dispatcher/GroupPosBasedTest.php delete mode 100644 samples/server/petstore/php-slim/vendor/nikic/fast-route/test/Dispatcher/MarkBasedTest.php delete mode 100644 samples/server/petstore/php-slim/vendor/nikic/fast-route/test/HackTypechecker/HackTypecheckerTest.php delete mode 100644 samples/server/petstore/php-slim/vendor/nikic/fast-route/test/HackTypechecker/fixtures/all_options.php delete mode 100644 samples/server/petstore/php-slim/vendor/nikic/fast-route/test/HackTypechecker/fixtures/empty_options.php delete mode 100644 samples/server/petstore/php-slim/vendor/nikic/fast-route/test/HackTypechecker/fixtures/no_options.php delete mode 100644 samples/server/petstore/php-slim/vendor/nikic/fast-route/test/RouteParser/StdTest.php delete mode 100644 samples/server/petstore/php-slim/vendor/nikic/fast-route/test/bootstrap.php delete mode 100644 samples/server/petstore/php-slim/vendor/pimple/pimple/.gitignore delete mode 100644 samples/server/petstore/php-slim/vendor/pimple/pimple/.travis.yml delete mode 100644 samples/server/petstore/php-slim/vendor/pimple/pimple/CHANGELOG delete mode 100644 samples/server/petstore/php-slim/vendor/pimple/pimple/README.rst delete mode 100644 samples/server/petstore/php-slim/vendor/pimple/pimple/composer.json delete mode 100644 samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/.gitignore delete mode 100644 samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/README.md delete mode 100644 samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/config.m4 delete mode 100644 samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/config.w32 delete mode 100644 samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/php_pimple.h delete mode 100644 samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/pimple.c delete mode 100644 samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/pimple_compat.h delete mode 100644 samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/001.phpt delete mode 100644 samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/002.phpt delete mode 100644 samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/003.phpt delete mode 100644 samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/004.phpt delete mode 100644 samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/005.phpt delete mode 100644 samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/006.phpt delete mode 100644 samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/007.phpt delete mode 100644 samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/008.phpt delete mode 100644 samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/009.phpt delete mode 100644 samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/010.phpt delete mode 100644 samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/011.phpt delete mode 100644 samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/012.phpt delete mode 100644 samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/013.phpt delete mode 100644 samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/014.phpt delete mode 100644 samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/015.phpt delete mode 100644 samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/016.phpt delete mode 100644 samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/017.phpt delete mode 100644 samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/017_1.phpt delete mode 100644 samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/018.phpt delete mode 100644 samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/019.phpt delete mode 100644 samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/bench.phpb delete mode 100644 samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/bench_shared.phpb delete mode 100644 samples/server/petstore/php-slim/vendor/pimple/pimple/phpunit.xml.dist delete mode 100644 samples/server/petstore/php-slim/vendor/pimple/pimple/src/Pimple/Container.php delete mode 100644 samples/server/petstore/php-slim/vendor/pimple/pimple/src/Pimple/ServiceProviderInterface.php delete mode 100644 samples/server/petstore/php-slim/vendor/pimple/pimple/src/Pimple/Tests/Fixtures/Invokable.php delete mode 100644 samples/server/petstore/php-slim/vendor/pimple/pimple/src/Pimple/Tests/Fixtures/NonInvokable.php delete mode 100644 samples/server/petstore/php-slim/vendor/pimple/pimple/src/Pimple/Tests/Fixtures/PimpleServiceProvider.php delete mode 100644 samples/server/petstore/php-slim/vendor/pimple/pimple/src/Pimple/Tests/Fixtures/Service.php delete mode 100644 samples/server/petstore/php-slim/vendor/pimple/pimple/src/Pimple/Tests/PimpleServiceProviderInterfaceTest.php delete mode 100644 samples/server/petstore/php-slim/vendor/pimple/pimple/src/Pimple/Tests/PimpleTest.php delete mode 100644 samples/server/petstore/php-slim/vendor/psr/http-message/README.md delete mode 100644 samples/server/petstore/php-slim/vendor/psr/http-message/composer.json delete mode 100644 samples/server/petstore/php-slim/vendor/psr/http-message/src/MessageInterface.php delete mode 100644 samples/server/petstore/php-slim/vendor/psr/http-message/src/RequestInterface.php delete mode 100644 samples/server/petstore/php-slim/vendor/psr/http-message/src/ResponseInterface.php delete mode 100644 samples/server/petstore/php-slim/vendor/psr/http-message/src/ServerRequestInterface.php delete mode 100644 samples/server/petstore/php-slim/vendor/psr/http-message/src/StreamInterface.php delete mode 100644 samples/server/petstore/php-slim/vendor/psr/http-message/src/UploadedFileInterface.php delete mode 100644 samples/server/petstore/php-slim/vendor/psr/http-message/src/UriInterface.php delete mode 100644 samples/server/petstore/php-slim/vendor/slim/slim/LICENSE.md delete mode 100644 samples/server/petstore/php-slim/vendor/slim/slim/Slim/App.php delete mode 100644 samples/server/petstore/php-slim/vendor/slim/slim/Slim/CallableResolver.php delete mode 100644 samples/server/petstore/php-slim/vendor/slim/slim/Slim/CallableResolverAwareTrait.php delete mode 100644 samples/server/petstore/php-slim/vendor/slim/slim/Slim/Collection.php delete mode 100644 samples/server/petstore/php-slim/vendor/slim/slim/Slim/Container.php delete mode 100644 samples/server/petstore/php-slim/vendor/slim/slim/Slim/DefaultServicesProvider.php delete mode 100644 samples/server/petstore/php-slim/vendor/slim/slim/Slim/DeferredCallable.php delete mode 100644 samples/server/petstore/php-slim/vendor/slim/slim/Slim/Exception/ContainerException.php delete mode 100644 samples/server/petstore/php-slim/vendor/slim/slim/Slim/Exception/ContainerValueNotFoundException.php delete mode 100644 samples/server/petstore/php-slim/vendor/slim/slim/Slim/Exception/MethodNotAllowedException.php delete mode 100644 samples/server/petstore/php-slim/vendor/slim/slim/Slim/Exception/NotFoundException.php delete mode 100644 samples/server/petstore/php-slim/vendor/slim/slim/Slim/Exception/SlimException.php delete mode 100644 samples/server/petstore/php-slim/vendor/slim/slim/Slim/Handlers/AbstractError.php delete mode 100644 samples/server/petstore/php-slim/vendor/slim/slim/Slim/Handlers/AbstractHandler.php delete mode 100644 samples/server/petstore/php-slim/vendor/slim/slim/Slim/Handlers/Error.php delete mode 100644 samples/server/petstore/php-slim/vendor/slim/slim/Slim/Handlers/NotAllowed.php delete mode 100644 samples/server/petstore/php-slim/vendor/slim/slim/Slim/Handlers/NotFound.php delete mode 100644 samples/server/petstore/php-slim/vendor/slim/slim/Slim/Handlers/PhpError.php delete mode 100644 samples/server/petstore/php-slim/vendor/slim/slim/Slim/Handlers/Strategies/RequestResponse.php delete mode 100644 samples/server/petstore/php-slim/vendor/slim/slim/Slim/Handlers/Strategies/RequestResponseArgs.php delete mode 100644 samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/Body.php delete mode 100644 samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/Cookies.php delete mode 100644 samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/Environment.php delete mode 100644 samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/Headers.php delete mode 100644 samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/Message.php delete mode 100644 samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/Request.php delete mode 100644 samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/RequestBody.php delete mode 100644 samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/Response.php delete mode 100644 samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/Stream.php delete mode 100644 samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/UploadedFile.php delete mode 100644 samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/Uri.php delete mode 100644 samples/server/petstore/php-slim/vendor/slim/slim/Slim/Interfaces/CallableResolverInterface.php delete mode 100644 samples/server/petstore/php-slim/vendor/slim/slim/Slim/Interfaces/CollectionInterface.php delete mode 100644 samples/server/petstore/php-slim/vendor/slim/slim/Slim/Interfaces/Http/CookiesInterface.php delete mode 100644 samples/server/petstore/php-slim/vendor/slim/slim/Slim/Interfaces/Http/EnvironmentInterface.php delete mode 100644 samples/server/petstore/php-slim/vendor/slim/slim/Slim/Interfaces/Http/HeadersInterface.php delete mode 100644 samples/server/petstore/php-slim/vendor/slim/slim/Slim/Interfaces/InvocationStrategyInterface.php delete mode 100644 samples/server/petstore/php-slim/vendor/slim/slim/Slim/Interfaces/RouteGroupInterface.php delete mode 100644 samples/server/petstore/php-slim/vendor/slim/slim/Slim/Interfaces/RouteInterface.php delete mode 100644 samples/server/petstore/php-slim/vendor/slim/slim/Slim/Interfaces/RouterInterface.php delete mode 100644 samples/server/petstore/php-slim/vendor/slim/slim/Slim/MiddlewareAwareTrait.php delete mode 100644 samples/server/petstore/php-slim/vendor/slim/slim/Slim/Routable.php delete mode 100644 samples/server/petstore/php-slim/vendor/slim/slim/Slim/Route.php delete mode 100644 samples/server/petstore/php-slim/vendor/slim/slim/Slim/RouteGroup.php delete mode 100644 samples/server/petstore/php-slim/vendor/slim/slim/Slim/Router.php delete mode 100644 samples/server/petstore/php-slim/vendor/slim/slim/composer.json diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpSlimServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpSlimServerCodegen.java index 584e3760e0c9..465dcd1bc8ce 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpSlimServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpSlimServerCodegen.java @@ -121,6 +121,7 @@ public PhpSlimServerCodegen() { supportingFiles.add(new SupportingFile("composer.json", packagePath.replace('/', File.separatorChar), "composer.json")); supportingFiles.add(new SupportingFile("index.mustache", packagePath.replace('/', File.separatorChar), "index.php")); supportingFiles.add(new SupportingFile(".htaccess", packagePath.replace('/', File.separatorChar), ".htaccess")); + supportingFiles.add(new SupportingFile(".gitignore", packagePath.replace('/', File.separatorChar), ".gitignore")); } @Override diff --git a/modules/openapi-generator/src/main/resources/slim/.gitignore b/modules/openapi-generator/src/main/resources/slim/.gitignore new file mode 100644 index 000000000000..9ff0a17ae5c9 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/slim/.gitignore @@ -0,0 +1,6 @@ +composer.phar +/vendor/ + +# Commit your application's lock file https://getcomposer.org/doc/01-basic-usage.md#commit-your-composer-lock-file-to-version-control +# You may choose to ignore a library lock file http://getcomposer.org/doc/02-libraries.md#lock-file +composer.lock \ No newline at end of file diff --git a/samples/server/petstore-security-test/slim/.gitignore b/samples/server/petstore-security-test/slim/.gitignore new file mode 100644 index 000000000000..9ff0a17ae5c9 --- /dev/null +++ b/samples/server/petstore-security-test/slim/.gitignore @@ -0,0 +1,6 @@ +composer.phar +/vendor/ + +# Commit your application's lock file https://getcomposer.org/doc/01-basic-usage.md#commit-your-composer-lock-file-to-version-control +# You may choose to ignore a library lock file http://getcomposer.org/doc/02-libraries.md#lock-file +composer.lock \ No newline at end of file diff --git a/samples/server/petstore-security-test/slim/vendor/autoload.php b/samples/server/petstore-security-test/slim/vendor/autoload.php deleted file mode 100644 index 0caa48f7f05b..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/autoload.php +++ /dev/null @@ -1,7 +0,0 @@ - - * Jordi Boggiano - * - * 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 - * @author Jordi Boggiano - * @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(); - private $apcuPrefix; - - 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; - } - - /** - * APCu prefix to use to cache found/not-found classes, if the extension is enabled. - * - * @param string|null $apcuPrefix - */ - public function setApcuPrefix($apcuPrefix) - { - $this->apcuPrefix = function_exists('apcu_fetch') && ini_get('apc.enabled') ? $apcuPrefix : null; - } - - /** - * The APCu prefix in use, or null if APCu caching is not enabled. - * - * @return string|null - */ - public function getApcuPrefix() - { - return $this->apcuPrefix; - } - - /** - * 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) - { - // class map lookup - if (isset($this->classMap[$class])) { - return $this->classMap[$class]; - } - if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { - return false; - } - if (null !== $this->apcuPrefix) { - $file = apcu_fetch($this->apcuPrefix.$class, $hit); - if ($hit) { - return $file; - } - } - - $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 (null !== $this->apcuPrefix) { - apcu_add($this->apcuPrefix.$class, $file); - } - - 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])) { - $subPath = $class; - while (false !== $lastPos = strrpos($subPath, '\\')) { - $subPath = substr($subPath, 0, $lastPos); - $search = $subPath.'\\'; - if (isset($this->prefixDirsPsr4[$search])) { - $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); - foreach ($this->prefixDirsPsr4[$search] as $dir) { - if (file_exists($file = $dir . $pathEnd)) { - 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/samples/server/petstore-security-test/slim/vendor/composer/LICENSE b/samples/server/petstore-security-test/slim/vendor/composer/LICENSE deleted file mode 100644 index f27399a042d9..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/composer/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ - -Copyright (c) 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/samples/server/petstore-security-test/slim/vendor/composer/autoload_classmap.php b/samples/server/petstore-security-test/slim/vendor/composer/autoload_classmap.php deleted file mode 100644 index 7a91153b0d8e..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/composer/autoload_classmap.php +++ /dev/null @@ -1,9 +0,0 @@ - $vendorDir . '/nikic/fast-route/src/functions.php', -); diff --git a/samples/server/petstore-security-test/slim/vendor/composer/autoload_namespaces.php b/samples/server/petstore-security-test/slim/vendor/composer/autoload_namespaces.php deleted file mode 100644 index c3cd02297dec..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/composer/autoload_namespaces.php +++ /dev/null @@ -1,10 +0,0 @@ - array($vendorDir . '/pimple/pimple/src'), -); diff --git a/samples/server/petstore-security-test/slim/vendor/composer/autoload_psr4.php b/samples/server/petstore-security-test/slim/vendor/composer/autoload_psr4.php deleted file mode 100644 index 9c0b4719520a..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/composer/autoload_psr4.php +++ /dev/null @@ -1,14 +0,0 @@ - array($vendorDir . '/slim/slim/Slim'), - 'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src'), - 'Psr\\Container\\' => array($vendorDir . '/psr/container/src'), - 'Interop\\Container\\' => array($vendorDir . '/container-interop/container-interop/src/Interop/Container'), - 'FastRoute\\' => array($vendorDir . '/nikic/fast-route/src'), -); diff --git a/samples/server/petstore-security-test/slim/vendor/composer/autoload_real.php b/samples/server/petstore-security-test/slim/vendor/composer/autoload_real.php deleted file mode 100644 index 1aea141f3598..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/composer/autoload_real.php +++ /dev/null @@ -1,70 +0,0 @@ -= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); - if ($useStaticLoader) { - require_once __DIR__ . '/autoload_static.php'; - - call_user_func(\Composer\Autoload\ComposerStaticInita7ca9e6d69dc1fe934d8e0e81434a295::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\ComposerStaticInita7ca9e6d69dc1fe934d8e0e81434a295::$files; - } else { - $includeFiles = require __DIR__ . '/autoload_files.php'; - } - foreach ($includeFiles as $fileIdentifier => $file) { - composerRequirea7ca9e6d69dc1fe934d8e0e81434a295($fileIdentifier, $file); - } - - return $loader; - } -} - -function composerRequirea7ca9e6d69dc1fe934d8e0e81434a295($fileIdentifier, $file) -{ - if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { - require $file; - - $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; - } -} diff --git a/samples/server/petstore-security-test/slim/vendor/composer/installed.json b/samples/server/petstore-security-test/slim/vendor/composer/installed.json deleted file mode 100644 index f5c5dff605b8..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/composer/installed.json +++ /dev/null @@ -1,311 +0,0 @@ -[ - { - "name": "container-interop/container-interop", - "version": "1.2.0", - "version_normalized": "1.2.0.0", - "source": { - "type": "git", - "url": "https://github.com/container-interop/container-interop.git", - "reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/container-interop/container-interop/zipball/79cbf1341c22ec75643d841642dd5d6acd83bdb8", - "reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8", - "shasum": "" - }, - "require": { - "psr/container": "^1.0" - }, - "time": "2017-02-14T19:40:03+00:00", - "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.)", - "homepage": "https://github.com/container-interop/container-interop" - }, - { - "name": "nikic/fast-route", - "version": "v1.3.0", - "version_normalized": "1.3.0.0", - "source": { - "type": "git", - "url": "https://github.com/nikic/FastRoute.git", - "reference": "181d480e08d9476e61381e04a71b34dc0432e812" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nikic/FastRoute/zipball/181d480e08d9476e61381e04a71b34dc0432e812", - "reference": "181d480e08d9476e61381e04a71b34dc0432e812", - "shasum": "" - }, - "require": { - "php": ">=5.4.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35|~5.7" - }, - "time": "2018-02-13T20:26:39+00:00", - "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": "pimple/pimple", - "version": "v3.2.3", - "version_normalized": "3.2.3.0", - "source": { - "type": "git", - "url": "https://github.com/silexphp/Pimple.git", - "reference": "9e403941ef9d65d20cba7d54e29fe906db42cf32" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/silexphp/Pimple/zipball/9e403941ef9d65d20cba7d54e29fe906db42cf32", - "reference": "9e403941ef9d65d20cba7d54e29fe906db42cf32", - "shasum": "" - }, - "require": { - "php": ">=5.3.0", - "psr/container": "^1.0" - }, - "require-dev": { - "symfony/phpunit-bridge": "^3.2" - }, - "time": "2018-01-21T07:42:36+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.2.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": "psr/container", - "version": "1.0.0", - "version_normalized": "1.0.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", - "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "time": "2017-02-14T16:28:37+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Psr\\Container\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", - "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" - ] - }, - { - "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-06T14:39:51+00:00", - "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": "slim/slim", - "version": "3.10.0", - "version_normalized": "3.10.0.0", - "source": { - "type": "git", - "url": "https://github.com/slimphp/Slim.git", - "reference": "d8aabeacc3688b25e2f2dd2db91df91ec6fdd748" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/slimphp/Slim/zipball/d8aabeacc3688b25e2f2dd2db91df91ec6fdd748", - "reference": "d8aabeacc3688b25e2f2dd2db91df91ec6fdd748", - "shasum": "" - }, - "require": { - "container-interop/container-interop": "^1.2", - "nikic/fast-route": "^1.0", - "php": ">=5.5.0", - "pimple/pimple": "^3.0", - "psr/container": "^1.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": "2018-04-19T19:29:08+00:00", - "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": "https://slimframework.com", - "keywords": [ - "api", - "framework", - "micro", - "router" - ] - } -] diff --git a/samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/.gitignore b/samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/.gitignore deleted file mode 100644 index b2395aa05541..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -composer.lock -composer.phar -/vendor/ diff --git a/samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/LICENSE b/samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/LICENSE deleted file mode 100644 index 7671d9020f64..000000000000 --- a/samples/server/petstore-security-test/slim/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/samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/README.md b/samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/README.md deleted file mode 100644 index cdd7a44c8ee8..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/README.md +++ /dev/null @@ -1,148 +0,0 @@ -# Container Interoperability - -[![Latest Stable Version](https://poser.pugx.org/container-interop/container-interop/v/stable.png)](https://packagist.org/packages/container-interop/container-interop) -[![Total Downloads](https://poser.pugx.org/container-interop/container-interop/downloads.svg)](https://packagist.org/packages/container-interop/container-interop) - -## Deprecation warning! - -Starting Feb. 13th 2017, container-interop is officially deprecated in favor of [PSR-11](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-11-container.md). -Container-interop has been the test-bed of PSR-11. From v1.2, container-interop directly extends PSR-11 interfaces. -Therefore, all containers implementing container-interop are now *de-facto* compatible with PSR-11. - -- Projects implementing container-interop interfaces are encouraged to directly implement PSR-11 interfaces instead. -- Projects consuming container-interop interfaces are very strongly encouraged to directly type-hint on PSR-11 interfaces, in order to be compatible with PSR-11 containers that are not compatible with container-interop. - -Regarding the delegate lookup feature, that is present in container-interop and not in PSR-11, the feature is actually a design pattern. It is therefore not deprecated. Documentation regarding this design pattern will be migrated from this repository into a separate website in the future. - -## About - -*container-interop* tries to identify and standardize features in *container* objects (service locators, -dependency injection containers, etc.) to achieve interoperability. - -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 -composer require container-interop/container-interop -``` - -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): Adapters for - Aura.Di, Laravel, Nette DI, Pimple, Symfony DI, ZF2 Service manager, ZF2 - Dependency injection and any container using `ArrayAccess` -- [Aura.Di](https://github.com/auraphp/Aura.Di) -- [auryn-container-interop](https://github.com/elazar/auryn-container-interop) -- [Burlap](https://github.com/codeeverything/burlap) -- [Chernozem](https://github.com/pyrsmk/Chernozem) -- [Data Manager](https://github.com/chrismichaels84/data-manager) -- [Disco](https://github.com/bitexpert/disco) -- [InDI](https://github.com/idealogica/indi) -- [League/Container](http://container.thephpleague.com/) -- [Mouf](http://mouf-php.com) -- [Njasm Container](https://github.com/njasm/container) -- [PHP-DI](http://php-di.org) -- [Picotainer](https://github.com/thecodingmachine/picotainer) -- [PimpleInterop](https://github.com/moufmouf/pimple-interop) -- [Pimple3-ContainerInterop](https://github.com/Sam-Burns/pimple3-containerinterop) (using Pimple v3) -- [SitePoint Container](https://github.com/sitepoint/Container) -- [Thruster Container](https://github.com/ThrusterIO/container) (PHP7 only) -- [Ultra-Lite Container](https://github.com/ultra-lite/container) -- [Unbox](https://github.com/mindplay-dk/unbox) -- [XStatic](https://github.com/jeremeamia/xstatic) -- [Zend\ServiceManager](https://github.com/zendframework/zend-servicemanager) -- [Zit](https://github.com/inxilpro/Zit) - -### Projects implementing the *delegate lookup* feature - -- [Aura.Di](https://github.com/auraphp/Aura.Di) -- [Burlap](https://github.com/codeeverything/burlap) -- [Chernozem](https://github.com/pyrsmk/Chernozem) -- [InDI](https://github.com/idealogica/indi) -- [League/Container](http://container.thephpleague.com/) -- [Mouf](http://mouf-php.com) -- [Picotainer](https://github.com/thecodingmachine/picotainer) -- [PHP-DI](http://php-di.org) -- [PimpleInterop](https://github.com/moufmouf/pimple-interop) -- [Ultra-Lite Container](https://github.com/ultra-lite/container) - -### Middlewares implementing `ContainerInterface` - -- [Alias-Container](https://github.com/thecodingmachine/alias-container): add - aliases support to any container -- [Prefixer-Container](https://github.com/thecodingmachine/prefixer-container): - dynamically prefix identifiers -- [Lazy-Container](https://github.com/snapshotpl/lazy-container): lazy services - -### Projects using `ContainerInterface` - -The list below contains only a sample of all the projects consuming `ContainerInterface`. For a more complete list have a look [here](http://packanalyst.com/class?q=Interop%5CContainer%5CContainerInterface). - -| | Downloads | -| --- | --- | -| [Adroit](https://github.com/bitexpert/adroit) | ![](https://img.shields.io/packagist/dt/bitexpert/adroit.svg) | -| [Behat](https://github.com/Behat/Behat/pull/974) | ![](https://img.shields.io/packagist/dt/behat/behat.svg) | -| [blast-facades](https://github.com/phpthinktank/blast-facades): Minimize complexity and represent dependencies as facades. | ![](https://img.shields.io/packagist/dt/blast/facades.svg) | -| [interop.silex.di](https://github.com/thecodingmachine/interop.silex.di): an extension to [Silex](http://silex.sensiolabs.org/) that adds support for any *container-interop* compatible container | ![](https://img.shields.io/packagist/dt/mouf/interop.silex.di.svg) | -| [mindplay/walkway](https://github.com/mindplay-dk/walkway): a modular request router | ![](https://img.shields.io/packagist/dt/mindplay/walkway.svg) | -| [mindplay/middleman](https://github.com/mindplay-dk/middleman): minimalist PSR-7 middleware dispatcher | ![](https://img.shields.io/packagist/dt/mindplay/middleman.svg) | -| [PHP-DI/Invoker](https://github.com/PHP-DI/Invoker): extensible and configurable invoker/dispatcher | ![](https://img.shields.io/packagist/dt/php-di/invoker.svg) | -| [Prophiler](https://github.com/fabfuel/prophiler) | ![](https://img.shields.io/packagist/dt/fabfuel/prophiler.svg) | -| [Silly](https://github.com/mnapoli/silly): CLI micro-framework | ![](https://img.shields.io/packagist/dt/mnapoli/silly.svg) | -| [Slim v3](https://github.com/slimphp/Slim) | ![](https://img.shields.io/packagist/dt/slim/slim.svg) | -| [Splash](http://mouf-php.com/packages/mouf/mvc.splash-common/version/8.0-dev/README.md) | ![](https://img.shields.io/packagist/dt/mouf/mvc.splash-common.svg) | -| [Woohoo Labs. Harmony](https://github.com/woohoolabs/harmony): a flexible micro-framework | ![](https://img.shields.io/packagist/dt/woohoolabs/harmony.svg) | -| [zend-expressive](https://github.com/zendframework/zend-expressive) | ![](https://img.shields.io/packagist/dt/zendframework/zend-expressive.svg) | - - -## 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/samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/composer.json b/samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/composer.json deleted file mode 100644 index 855f766723a0..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/composer.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "container-interop/container-interop", - "type": "library", - "description": "Promoting the interoperability of container objects (DIC, SL, etc.)", - "homepage": "https://github.com/container-interop/container-interop", - "license": "MIT", - "autoload": { - "psr-4": { - "Interop\\Container\\": "src/Interop/Container/" - } - }, - "require": { - "psr/container": "^1.0" - } -} diff --git a/samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/docs/ContainerInterface-meta.md b/samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/docs/ContainerInterface-meta.md deleted file mode 100644 index 59f3d5599faf..000000000000 --- a/samples/server/petstore-security-test/slim/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 have 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/samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/docs/ContainerInterface.md b/samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/docs/ContainerInterface.md deleted file mode 100644 index bda973d6fce1..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/docs/ContainerInterface.md +++ /dev/null @@ -1,158 +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 dependency injection-related library or framework. -Users of dependency injections containers (DIC) are referred 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. - `has($id)` returning true does not mean that `get($id)` will not throw an exception. - It does however mean that `get($id)` will not throw a `NotFoundException`. - -### 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 -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/samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/docs/Delegate-lookup.md b/samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/docs/Delegate-lookup.md deleted file mode 100644 index f64a8f785a84..000000000000 --- a/samples/server/petstore-security-test/slim/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 referred 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/samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/docs/images/interoperating_containers.png b/samples/server/petstore-security-test/slim/vendor/container-interop/container-interop/docs/images/interoperating_containers.png deleted file mode 100644 index 1d3fdd0ddbea28d77c08cfb65834ec11357be5fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25738 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 lDg62tY5@ou6EsiaCMAN!E;xV!uGoVl#pK=; - } - - 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, - ?'dataGenerator' => classname, - ?'dispatcher' => classname, - ?'routeCollector' => classname, - ) $options = shape()): Dispatcher; - - function cachedDispatcher( - (function(RouteCollector): void) $routeDefinitionCallback, - shape( - ?'routeParser' => classname, - ?'dataGenerator' => classname, - ?'dispatcher' => classname, - ?'routeCollector' => classname, - ?'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 $regexToRoutesMap): array; - } - - class GroupCountBased extends RegexBasedAbstract { - protected function getApproxChunkSize(): int; - protected function processChunk(array $regexToRoutesMap): array; - } - - class GroupPosBased extends RegexBasedAbstract { - protected function getApproxChunkSize(): int; - protected function processChunk(array $regexToRoutesMap): array; - } - - class MarkBased extends RegexBasedAbstract { - protected function getApproxChunkSize(): int; - protected function processChunk(array $regexToRoutesMap): array; - } -} - -namespace FastRoute\Dispatcher { - abstract class RegexBasedAbstract implements \FastRoute\Dispatcher { - protected abstract function dispatchVariableRoute(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 $routeData, string $uri): array; - } - - class GroupCountBased extends RegexBasedAbstract { - public function __construct(array $data); - protected function dispatchVariableRoute(array $routeData, string $uri): array; - } - - class CharCountBased extends RegexBasedAbstract { - public function __construct(array $data); - protected function dispatchVariableRoute(array $routeData, string $uri): array; - } - - class MarkBased extends RegexBasedAbstract { - public function __construct(array $data); - protected function dispatchVariableRoute(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; - } -} diff --git a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/LICENSE b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/LICENSE deleted file mode 100644 index 478e7641e93d..000000000000 --- a/samples/server/petstore-security-test/slim/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/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/README.md b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/README.md deleted file mode 100644 index 91bd4664e031..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/README.md +++ /dev/null @@ -1,313 +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 -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. - -#### Shorcut methods for common request methods - -For the `GET`, `POST`, `PUT`, `PATCH`, `DELETE` and `HEAD` request methods shortcut methods are available. For example: - -```php -$r->get('/get-route', 'get_handler'); -$r->post('/post-route', 'post_handler'); -``` - -Is equivalent to: - -```php -$r->addRoute('GET', '/get-route', 'get_handler'); -$r->addRoute('POST', '/post-route', 'post_handler'); -``` - -#### Route Groups - -Additionally, you can specify routes inside of a group. All routes defined inside a group will have a common prefix. - -For example, defining your routes as: - -```php -$r->addGroup('/admin', function (RouteCollector $r) { - $r->addRoute('GET', '/do-something', 'handler'); - $r->addRoute('GET', '/do-another-thing', 'handler'); - $r->addRoute('GET', '/do-something-else', 'handler'); -}); -``` - -Will have the same result as: - - ```php -$r->addRoute('GET', '/admin/do-something', 'handler'); -$r->addRoute('GET', '/admin/do-another-thing', 'handler'); -$r->addRoute('GET', '/admin/do-something-else', 'handler'); - ``` - -Nested groups are also supported, in which case the prefixes of all the nested groups are combined. - -### 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 -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 - '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/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/composer.json b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/composer.json deleted file mode 100644 index fb446a2abfbc..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/composer.json +++ /dev/null @@ -1,24 +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" - } - ], - "autoload": { - "psr-4": { - "FastRoute\\": "src/" - }, - "files": ["src/functions.php"] - }, - "require": { - "php": ">=5.4.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35|~5.7" - } -} diff --git a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/phpunit.xml b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/phpunit.xml deleted file mode 100644 index 3c807b6acbcd..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/phpunit.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - ./test/ - - - - - - ./src/ - - - diff --git a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/BadRouteException.php b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/BadRouteException.php deleted file mode 100644 index 62262ec66f66..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/BadRouteException.php +++ /dev/null @@ -1,7 +0,0 @@ - $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/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/DataGenerator/GroupCountBased.php b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/DataGenerator/GroupCountBased.php deleted file mode 100644 index 54d9a05e20b6..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/DataGenerator/GroupCountBased.php +++ /dev/null @@ -1,30 +0,0 @@ - $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/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/DataGenerator/GroupPosBased.php b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/DataGenerator/GroupPosBased.php deleted file mode 100644 index fc4dc0aff639..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/DataGenerator/GroupPosBased.php +++ /dev/null @@ -1,27 +0,0 @@ - $route) { - $regexes[] = $regex; - $routeMap[$offset] = [$route->handler, $route->variables]; - - $offset += count($route->variables); - } - - $regex = '~^(?:' . implode('|', $regexes) . ')$~'; - return ['regex' => $regex, 'routeMap' => $routeMap]; - } -} diff --git a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/DataGenerator/MarkBased.php b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/DataGenerator/MarkBased.php deleted file mode 100644 index 0aebed9a1614..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/DataGenerator/MarkBased.php +++ /dev/null @@ -1,27 +0,0 @@ - $route) { - $regexes[] = $regex . '(*MARK:' . $markName . ')'; - $routeMap[$markName] = [$route->handler, $route->variables]; - - ++$markName; - } - - $regex = '~^(?|' . implode('|', $regexes) . ')$~'; - return ['regex' => $regex, 'routeMap' => $routeMap]; - } -} diff --git a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php deleted file mode 100644 index 645729059925..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php +++ /dev/null @@ -1,186 +0,0 @@ -isStaticRoute($routeData)) { - $this->addStaticRoute($httpMethod, $routeData, $handler); - } else { - $this->addVariableRoute($httpMethod, $routeData, $handler); - } - } - - /** - * @return mixed[] - */ - public function getData() - { - if (empty($this->methodToRegexToRoutesMap)) { - return [$this->staticRoutes, []]; - } - - return [$this->staticRoutes, $this->generateVariableRouteData()]; - } - - /** - * @return mixed[] - */ - 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; - } - - /** - * @param int - * @return int - */ - private function computeChunkSize($count) - { - $numParts = max(1, round($count / $this->getApproxChunkSize())); - return (int) ceil($count / $numParts); - } - - /** - * @param mixed[] - * @return bool - */ - 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 - ); - } - - /** - * @param mixed[] - * @return mixed[] - */ - 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]; - } - - /** - * @param string - * @return bool - */ - 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 (bool) preg_match( - '~ - (?: - \(\?\( - | \[ [^\]\\\\]* (?: \\\\ . [^\]\\\\]* )* \] - | \\\\ . - ) (*SKIP)(*FAIL) | - \( - (?! - \? (?! <(?![!=]) | P< | \' ) - | \* - ) - ~x', - $regex - ); - } -} diff --git a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Dispatcher.php b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Dispatcher.php deleted file mode 100644 index 4ae72a356b65..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Dispatcher.php +++ /dev/null @@ -1,26 +0,0 @@ - 'value', ...]] - * - * @param string $httpMethod - * @param string $uri - * - * @return array - */ - public function dispatch($httpMethod, $uri); -} diff --git a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Dispatcher/CharCountBased.php b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Dispatcher/CharCountBased.php deleted file mode 100644 index ef1eec1345ea..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Dispatcher/CharCountBased.php +++ /dev/null @@ -1,31 +0,0 @@ -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/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Dispatcher/GroupCountBased.php b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Dispatcher/GroupCountBased.php deleted file mode 100644 index 493e7a94f08f..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Dispatcher/GroupCountBased.php +++ /dev/null @@ -1,31 +0,0 @@ -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/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Dispatcher/GroupPosBased.php b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Dispatcher/GroupPosBased.php deleted file mode 100644 index 498220ed6f7c..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Dispatcher/GroupPosBased.php +++ /dev/null @@ -1,33 +0,0 @@ -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/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Dispatcher/MarkBased.php b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Dispatcher/MarkBased.php deleted file mode 100644 index 22eb09ba575f..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Dispatcher/MarkBased.php +++ /dev/null @@ -1,31 +0,0 @@ -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/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Dispatcher/RegexBasedAbstract.php b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Dispatcher/RegexBasedAbstract.php deleted file mode 100644 index 206e879f7b25..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Dispatcher/RegexBasedAbstract.php +++ /dev/null @@ -1,88 +0,0 @@ -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]; - } - - return [self::NOT_FOUND]; - } -} diff --git a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Route.php b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Route.php deleted file mode 100644 index e1bf7dd97222..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/Route.php +++ /dev/null @@ -1,47 +0,0 @@ -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/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/RouteCollector.php b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/RouteCollector.php deleted file mode 100644 index c1c1762d8d3a..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/RouteCollector.php +++ /dev/null @@ -1,152 +0,0 @@ -routeParser = $routeParser; - $this->dataGenerator = $dataGenerator; - $this->currentGroupPrefix = ''; - } - - /** - * 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) - { - $route = $this->currentGroupPrefix . $route; - $routeDatas = $this->routeParser->parse($route); - foreach ((array) $httpMethod as $method) { - foreach ($routeDatas as $routeData) { - $this->dataGenerator->addRoute($method, $routeData, $handler); - } - } - } - - /** - * Create a route group with a common prefix. - * - * All routes created in the passed callback will have the given group prefix prepended. - * - * @param string $prefix - * @param callable $callback - */ - public function addGroup($prefix, callable $callback) - { - $previousGroupPrefix = $this->currentGroupPrefix; - $this->currentGroupPrefix = $previousGroupPrefix . $prefix; - $callback($this); - $this->currentGroupPrefix = $previousGroupPrefix; - } - - /** - * Adds a GET route to the collection - * - * This is simply an alias of $this->addRoute('GET', $route, $handler) - * - * @param string $route - * @param mixed $handler - */ - public function get($route, $handler) - { - $this->addRoute('GET', $route, $handler); - } - - /** - * Adds a POST route to the collection - * - * This is simply an alias of $this->addRoute('POST', $route, $handler) - * - * @param string $route - * @param mixed $handler - */ - public function post($route, $handler) - { - $this->addRoute('POST', $route, $handler); - } - - /** - * Adds a PUT route to the collection - * - * This is simply an alias of $this->addRoute('PUT', $route, $handler) - * - * @param string $route - * @param mixed $handler - */ - public function put($route, $handler) - { - $this->addRoute('PUT', $route, $handler); - } - - /** - * Adds a DELETE route to the collection - * - * This is simply an alias of $this->addRoute('DELETE', $route, $handler) - * - * @param string $route - * @param mixed $handler - */ - public function delete($route, $handler) - { - $this->addRoute('DELETE', $route, $handler); - } - - /** - * Adds a PATCH route to the collection - * - * This is simply an alias of $this->addRoute('PATCH', $route, $handler) - * - * @param string $route - * @param mixed $handler - */ - public function patch($route, $handler) - { - $this->addRoute('PATCH', $route, $handler); - } - - /** - * Adds a HEAD route to the collection - * - * This is simply an alias of $this->addRoute('HEAD', $route, $handler) - * - * @param string $route - * @param mixed $handler - */ - public function head($route, $handler) - { - $this->addRoute('HEAD', $route, $handler); - } - - /** - * Returns the collected route data, as provided by the data generator. - * - * @return array - */ - public function getData() - { - return $this->dataGenerator->getData(); - } -} diff --git a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/RouteParser.php b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/RouteParser.php deleted file mode 100644 index 6a7685cfed6c..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/RouteParser.php +++ /dev/null @@ -1,37 +0,0 @@ - $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. - * - * @param string - * @return mixed[] - */ - 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/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/bootstrap.php b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/bootstrap.php deleted file mode 100644 index 0bce3a42071f..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/src/bootstrap.php +++ /dev/null @@ -1,12 +0,0 @@ - '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(); - if (!$options['cacheDisabled']) { - file_put_contents( - $options['cacheFile'], - ' $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->assertArrayNotHasKey(1, $routeInfo, - '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->assertArrayHasKey(1, $routeInfo, - '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]; - - // 17 ---- - - $callback = function (RouteCollector $r) { - $r->addRoute('POST', '/user.json', 'handler0'); - $r->addRoute('GET', '/{entity}.json', 'handler1'); - }; - - $cases[] = ['GET', '/user.json', $callback, 'handler1', ['entity' => 'user']]; - - // 18 ---- - - $callback = function (RouteCollector $r) { - $r->addRoute('GET', '', 'handler0'); - }; - - $cases[] = ['GET', '', $callback, 'handler0', []]; - - // 19 ---- - - $callback = function (RouteCollector $r) { - $r->addRoute('HEAD', '/a/{foo}', 'handler0'); - $r->addRoute('GET', '/b/{foo}', 'handler1'); - }; - - $cases[] = ['HEAD', '/b/bar', $callback, 'handler1', ['foo' => 'bar']]; - - // 20 ---- - - $callback = function (RouteCollector $r) { - $r->addRoute('HEAD', '/a', 'handler0'); - $r->addRoute('GET', '/b', 'handler1'); - }; - - $cases[] = ['HEAD', '/b', $callback, 'handler1', []]; - - // 21 ---- - - $callback = function (RouteCollector $r) { - $r->addRoute('GET', '/foo', 'handler0'); - $r->addRoute('HEAD', '/{bar}', 'handler1'); - }; - - $cases[] = ['HEAD', '/foo', $callback, 'handler1', ['bar' => 'foo']]; - - // 22 ---- - - $callback = function (RouteCollector $r) { - $r->addRoute('*', '/user', 'handler0'); - $r->addRoute('*', '/{user}', 'handler1'); - $r->addRoute('GET', '/user', 'handler2'); - }; - - $cases[] = ['GET', '/user', $callback, 'handler2', []]; - - // 23 ---- - - $callback = function (RouteCollector $r) { - $r->addRoute('*', '/user', 'handler0'); - $r->addRoute('GET', '/user', 'handler1'); - }; - - $cases[] = ['POST', '/user', $callback, 'handler0', []]; - - // 24 ---- - - $cases[] = ['HEAD', '/user', $callback, 'handler1', []]; - - // 25 ---- - - $callback = function (RouteCollector $r) { - $r->addRoute('GET', '/{bar}', 'handler0'); - $r->addRoute('*', '/foo', 'handler1'); - }; - - $cases[] = ['GET', '/foo', $callback, 'handler0', ['bar' => 'foo']]; - - // 26 ---- - - $callback = function(RouteCollector $r) { - $r->addRoute('GET', '/user', 'handler0'); - $r->addRoute('*', '/{foo:.*}', 'handler1'); - }; - - $cases[] = ['POST', '/bar', $callback, 'handler1', ['foo' => 'bar']]; - - // 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[] = [$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/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/Dispatcher/GroupCountBasedTest.php b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/Dispatcher/GroupCountBasedTest.php deleted file mode 100644 index f821ef56b93f..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/Dispatcher/GroupCountBasedTest.php +++ /dev/null @@ -1,16 +0,0 @@ -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/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/HackTypechecker/HackTypecheckerTest.php b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/HackTypechecker/HackTypecheckerTest.php deleted file mode 100644 index b6fc53f7702a..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/HackTypechecker/HackTypecheckerTest.php +++ /dev/null @@ -1,44 +0,0 @@ -markTestSkipped('HHVM only'); - } - if (!version_compare(HHVM_VERSION, '3.9.0', '>=')) { - $this->markTestSkipped('classname requires HHVM 3.9+'); - } - - // The typechecker recurses the whole tree, so it makes sure - // that everything in fixtures/ is valid when this runs. - - $output = []; - $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/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/HackTypechecker/fixtures/all_options.php b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/HackTypechecker/fixtures/all_options.php deleted file mode 100644 index 05a9af231b4a..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/HackTypechecker/fixtures/all_options.php +++ /dev/null @@ -1,29 +0,0 @@ - {}, - 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/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/HackTypechecker/fixtures/empty_options.php b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/HackTypechecker/fixtures/empty_options.php deleted file mode 100644 index 61eb54190d9e..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/HackTypechecker/fixtures/empty_options.php +++ /dev/null @@ -1,11 +0,0 @@ - {}, shape()); -} - -function empty_options_cached(): \FastRoute\Dispatcher { - return \FastRoute\cachedDispatcher($collector ==> {}, shape()); -} diff --git a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/HackTypechecker/fixtures/no_options.php b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/HackTypechecker/fixtures/no_options.php deleted file mode 100644 index 44b5422f583e..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/HackTypechecker/fixtures/no_options.php +++ /dev/null @@ -1,11 +0,0 @@ - {}); -} - -function no_options_cached(): \FastRoute\Dispatcher { - return \FastRoute\cachedDispatcher($collector ==> {}); -} diff --git a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/RouteParser/StdTest.php b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/RouteParser/StdTest.php deleted file mode 100644 index e13e4de61718..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/RouteParser/StdTest.php +++ /dev/null @@ -1,154 +0,0 @@ -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/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/bootstrap.php b/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/bootstrap.php deleted file mode 100644 index 3023f41e4659..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/nikic/fast-route/test/bootstrap.php +++ /dev/null @@ -1,11 +0,0 @@ -> `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 - - if [ "$PIMPLE_EXT" == "yes" ]; then export SYMFONY_DEPRECATIONS_HELPER=weak; fi - - cd ../.. - - ./vendor/bin/simple-phpunit - -matrix: - include: - - php: hhvm - dist: trusty - env: PIMPLE_EXT=no - exclude: - - php: 7.0 - env: PIMPLE_EXT=yes - - php: 7.1 - env: PIMPLE_EXT=yes diff --git a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/CHANGELOG b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/CHANGELOG deleted file mode 100644 index ba56760c1f59..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/CHANGELOG +++ /dev/null @@ -1,59 +0,0 @@ -* 3.2.3 (2017-XX-XX) - - * n/a - -* 3.2.2 (2017-07-23) - - * reverted extending a protected closure throws an exception (deprecated it instead) - -* 3.2.1 (2017-07-17) - - * fixed PHP error - -* 3.2.0 (2017-07-17) - - * added a PSR-11 service locator - * added a PSR-11 wrapper - * added ServiceIterator - * fixed extending a protected closure (now throws InvalidServiceIdentifierException) - -* 3.1.0 (2017-07-03) - - * deprecated the C extension - * added support for PSR-11 exceptions - -* 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/samples/server/petstore-security-test/slim/vendor/pimple/pimple/LICENSE b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/LICENSE deleted file mode 100644 index e02dc5a78dfa..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2009-2017 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/samples/server/petstore-security-test/slim/vendor/pimple/pimple/README.rst b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/README.rst deleted file mode 100644 index a03b6d3a4992..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/README.rst +++ /dev/null @@ -1,326 +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" - -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 -``cookie_name`` 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'); - -PSR-11 compatibility --------------------- - -For historical reasons, the ``Container`` class does not implement the PSR-11 -``ContainerInterface``. However, Pimple provides a helper class that will let -you decouple your code from the Pimple container class. - -The PSR-11 container class -~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The ``Pimple\Psr11\Container`` class lets you access the content of an -underlying Pimple container using ``Psr\Container\ContainerInterface`` -methods: - -.. code-block:: php - - use Pimple\Container; - use Pimple\Psr11\Container as PsrContainer; - - $container = new Container(); - $container['service'] = function ($c) { - return new Service(); - }; - $psr11 = new PsrContainer($container); - - $controller = function (PsrContainer $container) { - $service = $container->get('service'); - }; - $controller($psr11); - -Using the PSR-11 ServiceLocator -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Sometimes, a service needs access to several other services without being sure -that all of them will actually be used. In those cases, you may want the -instantiation of the services to be lazy. - -The traditional solution is to inject the entire service container to get only -the services really needed. However, this is not recommended because it gives -services a too broad access to the rest of the application and it hides their -actual dependencies. - -The ``ServiceLocator`` is intended to solve this problem by giving access to a -set of predefined services while instantiating them only when actually needed. - -It also allows you to make your services available under a different name than -the one used to register them. For instance, you may want to use an object -that expects an instance of ``EventDispatcherInterface`` to be available under -the name ``event_dispatcher`` while your event dispatcher has been -registered under the name ``dispatcher``: - -.. code-block:: php - - use Monolog\Logger; - use Pimple\Psr11\ServiceLocator; - use Psr\Container\ContainerInterface; - use Symfony\Component\EventDispatcher\EventDispatcher; - - class MyService - { - /** - * "logger" must be an instance of Psr\Log\LoggerInterface - * "event_dispatcher" must be an instance of Symfony\Component\EventDispatcher\EventDispatcherInterface - */ - private $services; - - public function __construct(ContainerInterface $services) - { - $this->services = $services; - } - } - - $container['logger'] = function ($c) { - return new Monolog\Logger(); - }; - $container['dispatcher'] = function () { - return new EventDispatcher(); - }; - - $container['service'] = function ($c) { - $locator = new ServiceLocator($c, array('logger', 'event_dispatcher' => 'dispatcher')); - - return new MyService($locator); - }; - -Referencing a Collection of Services Lazily -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Passing a collection of services instances in an array may prove inefficient -if the class that consumes the collection only needs to iterate over it at a -later stage, when one of its method is called. It can also lead to problems -if there is a circular dependency between one of the services stored in the -collection and the class that consumes it. - -The ``ServiceIterator`` class helps you solve these issues. It receives a -list of service names during instantiation and will retrieve the services -when iterated over: - -.. code-block:: php - - use Pimple\Container; - use Pimple\ServiceIterator; - - class AuthorizationService - { - private $voters; - - public function __construct($voters) - { - $this->voters = $voters; - } - - public function canAccess($resource) - { - foreach ($this->voters as $voter) { - if (true === $voter->canAccess($resource) { - return true; - } - } - - return false; - } - } - - $container = new Container(); - - $container['voter1'] = function ($c) { - return new SomeVoter(); - } - $container['voter2'] = function ($c) { - return new SomeOtherVoter($c['auth']); - } - $container['auth'] = function ($c) { - return new AuthorizationService(new ServiceIterator($c, array('voter1', 'voter2')); - } - -.. _Pimple 1.x documentation: https://github.com/silexphp/Pimple/tree/1.1 diff --git a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/composer.json b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/composer.json deleted file mode 100644 index dabf190a9ade..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/composer.json +++ /dev/null @@ -1,29 +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", - "psr/container": "^1.0" - }, - "require-dev": { - "symfony/phpunit-bridge": "^3.2" - }, - "autoload": { - "psr-0": { "Pimple": "src/" } - }, - "extra": { - "branch-alias": { - "dev-master": "3.2.x-dev" - } - } -} diff --git a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/.gitignore b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/.gitignore deleted file mode 100644 index 1861088ac1f6..000000000000 --- a/samples/server/petstore-security-test/slim/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/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/README.md b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/README.md deleted file mode 100644 index 7b39eb2929ea..000000000000 --- a/samples/server/petstore-security-test/slim/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/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/config.m4 b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/config.m4 deleted file mode 100644 index 3a6e9aaeb158..000000000000 --- a/samples/server/petstore-security-test/slim/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/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/config.w32 b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/config.w32 deleted file mode 100644 index 39857b3254be..000000000000 --- a/samples/server/petstore-security-test/slim/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/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/php_pimple.h b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/php_pimple.h deleted file mode 100644 index eed7c1731d48..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/php_pimple.h +++ /dev/null @@ -1,137 +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.2.3-DEV" - -#define PIMPLE_NS "Pimple" -#define PSR_CONTAINER_NS "Psr\\Container" -#define PIMPLE_EXCEPTION_NS "Pimple\\Exception" - -#define PIMPLE_DEFAULT_ZVAL_CACHE_NUM 5 -#define PIMPLE_DEFAULT_ZVAL_VALUES_NUM 10 - -#define PIMPLE_DEPRECATE do { \ - int er = EG(error_reporting); \ - EG(error_reporting) = 0;\ - php_error(E_DEPRECATED, "The Pimple C extension is deprecated since version 3.1 and will be removed in 4.0."); \ - EG(error_reporting) = er; \ -} while (0); - -zend_module_entry *get_module(void); - -PHP_MINIT_FUNCTION(pimple); -PHP_MINFO_FUNCTION(pimple); - -PHP_METHOD(FrozenServiceException, __construct); -PHP_METHOD(InvalidServiceIdentifierException, __construct); -PHP_METHOD(UnknownIdentifierException, __construct); - -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[] = ""; - -static void pimple_exception_call_parent_constructor(zval *this_ptr, const char *format, const char *arg1 TSRMLS_DC); - -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/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/pimple.c b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/pimple.c deleted file mode 100644 index c80499b39956..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/pimple.c +++ /dev/null @@ -1,1114 +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_PsrContainerInterface; -static zend_class_entry *pimple_ce_PsrContainerExceptionInterface; -static zend_class_entry *pimple_ce_PsrNotFoundExceptionInterface; - -static zend_class_entry *pimple_ce_ExpectedInvokableException; -static zend_class_entry *pimple_ce_FrozenServiceException; -static zend_class_entry *pimple_ce_InvalidServiceIdentifierException; -static zend_class_entry *pimple_ce_UnknownIdentifierException; - -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); - - -/* Psr\Container\ContainerInterface */ -ZEND_BEGIN_ARG_INFO_EX(arginfo_pimple_PsrContainerInterface_get, 0, 0, 1) -ZEND_ARG_INFO(0, id) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_pimple_PsrContainerInterface_has, 0, 0, 1) -ZEND_ARG_INFO(0, id) -ZEND_END_ARG_INFO() - -static const zend_function_entry pimple_ce_PsrContainerInterface_functions[] = { - PHP_ABSTRACT_ME(ContainerInterface, get, arginfo_pimple_PsrContainerInterface_get) - PHP_ABSTRACT_ME(ContainerInterface, has, arginfo_pimple_PsrContainerInterface_has) - PHP_FE_END -}; - -/* Psr\Container\ContainerExceptionInterface */ -static const zend_function_entry pimple_ce_PsrContainerExceptionInterface_functions[] = { - PHP_FE_END -}; - -/* Psr\Container\NotFoundExceptionInterface */ -static const zend_function_entry pimple_ce_PsrNotFoundExceptionInterface_functions[] = { - PHP_FE_END -}; - -/* Pimple\Exception\FrozenServiceException */ -ZEND_BEGIN_ARG_INFO_EX(arginfo_FrozenServiceException___construct, 0, 0, 1) -ZEND_ARG_INFO(0, id) -ZEND_END_ARG_INFO() - -static const zend_function_entry pimple_ce_FrozenServiceException_functions[] = { - PHP_ME(FrozenServiceException, __construct, arginfo_FrozenServiceException___construct, ZEND_ACC_PUBLIC) - PHP_FE_END -}; - -/* Pimple\Exception\InvalidServiceIdentifierException */ -ZEND_BEGIN_ARG_INFO_EX(arginfo_InvalidServiceIdentifierException___construct, 0, 0, 1) -ZEND_ARG_INFO(0, id) -ZEND_END_ARG_INFO() - -static const zend_function_entry pimple_ce_InvalidServiceIdentifierException_functions[] = { - PHP_ME(InvalidServiceIdentifierException, __construct, arginfo_InvalidServiceIdentifierException___construct, ZEND_ACC_PUBLIC) - PHP_FE_END -}; - -/* Pimple\Exception\UnknownIdentifierException */ -ZEND_BEGIN_ARG_INFO_EX(arginfo_UnknownIdentifierException___construct, 0, 0, 1) -ZEND_ARG_INFO(0, id) -ZEND_END_ARG_INFO() - -static const zend_function_entry pimple_ce_UnknownIdentifierException_functions[] = { - PHP_ME(UnknownIdentifierException, __construct, arginfo_UnknownIdentifierException___construct, ZEND_ACC_PUBLIC) - PHP_FE_END -}; - -/* Pimple\Container */ -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() - -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 -}; - -/* Pimple\ServiceProviderInterface */ -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_serviceprovider_iface_ce_functions[] = { - PHP_ABSTRACT_ME(ServiceProviderInterface, register, arginfo_serviceprovider_register) - PHP_FE_END -}; - -/* parent::__construct(sprintf("Something with %s", $arg1)) */ -static void pimple_exception_call_parent_constructor(zval *this_ptr, const char *format, const char *arg1 TSRMLS_DC) -{ - zend_class_entry *ce = Z_OBJCE_P(this_ptr); - char *message = NULL; - int message_len; - zval *constructor_arg; - - message_len = spprintf(&message, 0, format, arg1); - ALLOC_INIT_ZVAL(constructor_arg); - ZVAL_STRINGL(constructor_arg, message, message_len, 1); - - zend_call_method_with_1_params(&this_ptr, ce, &ce->parent->constructor, "__construct", NULL, constructor_arg); - - efree(message); - zval_ptr_dtor(&constructor_arg); -} - -/** - * Pass a single string parameter to exception constructor and throw - */ -static void pimple_throw_exception_string(zend_class_entry *ce, const char *message, zend_uint message_len TSRMLS_DC) -{ - zval *exception, *param; - - ALLOC_INIT_ZVAL(exception); - object_init_ex(exception, ce); - - ALLOC_INIT_ZVAL(param); - ZVAL_STRINGL(param, message, message_len, 1); - - zend_call_method_with_1_params(&exception, ce, &ce->constructor, "__construct", NULL, param); - - zend_throw_exception_object(exception TSRMLS_CC); - - zval_ptr_dtor(¶m); -} - -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); - pimple_throw_exception_string(pimple_ce_FrozenServiceException, Z_STRVAL_P(offset), Z_STRLEN_P(offset) TSRMLS_CC); - 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); - convert_to_string(offset); - pimple_throw_exception_string(pimple_ce_FrozenServiceException, Z_STRVAL_P(offset), Z_STRLEN_P(offset) TSRMLS_CC); - 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) { - pimple_throw_exception_string(pimple_ce_UnknownIdentifierException, Z_STRVAL_P(offset), Z_STRLEN_P(offset) TSRMLS_CC); - - 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 every time 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(FrozenServiceException, __construct) -{ - char *id = NULL; - int id_len; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &id, &id_len) == FAILURE) { - return; - } - pimple_exception_call_parent_constructor(getThis(), "Cannot override frozen service \"%s\".", id TSRMLS_CC); -} - -PHP_METHOD(InvalidServiceIdentifierException, __construct) -{ - char *id = NULL; - int id_len; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &id, &id_len) == FAILURE) { - return; - } - pimple_exception_call_parent_constructor(getThis(), "Identifier \"%s\" does not contain an object definition.", id TSRMLS_CC); -} - -PHP_METHOD(UnknownIdentifierException, __construct) -{ - char *id = NULL; - int id_len; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &id, &id_len) == FAILURE) { - return; - } - pimple_exception_call_parent_constructor(getThis(), "Identifier \"%s\" is not defined.", id TSRMLS_CC); -} - -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(pimple_ce_ExpectedInvokableException, "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) { - pimple_throw_exception_string(pimple_ce_UnknownIdentifierException, Z_STRVAL_P(offset), Z_STRLEN_P(offset) TSRMLS_CC); - 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) { - pimple_throw_exception_string(pimple_ce_UnknownIdentifierException, Z_STRVAL_P(offset), Z_STRLEN_P(offset) TSRMLS_CC); - RETURN_NULL(); - } - - if (value->type != PIMPLE_IS_SERVICE) { - pimple_throw_exception_string(pimple_ce_InvalidServiceIdentifierException, Z_STRVAL_P(offset), Z_STRLEN_P(offset) TSRMLS_CC); - RETURN_NULL(); - } - if (zend_hash_index_exists(&pobj->protected, value->handle_num)) { - int er = EG(error_reporting); - EG(error_reporting) = 0; - php_error(E_DEPRECATED, "How Pimple behaves when extending protected closures will be fixed in Pimple 4. Are you sure \"%s\" should be protected?", Z_STRVAL_P(offset)); - EG(error_reporting) = er; - } - 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) { - convert_to_string(offset); - pimple_throw_exception_string(pimple_ce_UnknownIdentifierException, Z_STRVAL_P(offset), Z_STRLEN_P(offset) TSRMLS_CC); - RETURN_NULL(); - } - if (value->type != PIMPLE_IS_SERVICE) { - convert_to_string(offset); - pimple_throw_exception_string(pimple_ce_InvalidServiceIdentifierException, Z_STRVAL_P(offset), Z_STRLEN_P(offset) TSRMLS_CC); - RETURN_NULL(); - } - if (zend_hash_index_exists(&pobj->protected, value->handle_num)) { - int er = EG(error_reporting); - EG(error_reporting) = 0; - php_error(E_DEPRECATED, "How Pimple behaves when extending protected closures will be fixed in Pimple 4. Are you sure \"%ld\" should be protected?", index); - EG(error_reporting) = er; - } - 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(pimple_ce_ExpectedInvokableException, "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(pimple_ce_ExpectedInvokableException, "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) { - return; - } - - PIMPLE_DEPRECATE - - if (!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_ce_PsrContainerInterface, tmp_ce_PsrContainerExceptionInterface, tmp_ce_PsrNotFoundExceptionInterface; - zend_class_entry tmp_ce_ExpectedInvokableException, tmp_ce_FrozenServiceException, tmp_ce_InvalidServiceIdentifierException, tmp_ce_UnknownIdentifierException; - zend_class_entry tmp_pimple_ce, tmp_pimple_closure_ce, tmp_pimple_serviceprovider_iface_ce; - - /* Psr\Container namespace */ - INIT_NS_CLASS_ENTRY(tmp_ce_PsrContainerInterface, PSR_CONTAINER_NS, "ContainerInterface", pimple_ce_PsrContainerInterface_functions); - INIT_NS_CLASS_ENTRY(tmp_ce_PsrContainerExceptionInterface, PSR_CONTAINER_NS, "ContainerExceptionInterface", pimple_ce_PsrContainerExceptionInterface_functions); - INIT_NS_CLASS_ENTRY(tmp_ce_PsrNotFoundExceptionInterface, PSR_CONTAINER_NS, "NotFoundExceptionInterface", pimple_ce_PsrNotFoundExceptionInterface_functions); - - pimple_ce_PsrContainerInterface = zend_register_internal_interface(&tmp_ce_PsrContainerInterface TSRMLS_CC); - pimple_ce_PsrContainerExceptionInterface = zend_register_internal_interface(&tmp_ce_PsrContainerExceptionInterface TSRMLS_CC); - pimple_ce_PsrNotFoundExceptionInterface = zend_register_internal_interface(&tmp_ce_PsrNotFoundExceptionInterface TSRMLS_CC); - - zend_class_implements(pimple_ce_PsrNotFoundExceptionInterface TSRMLS_CC, 1, pimple_ce_PsrContainerExceptionInterface); - - /* Pimple\Exception namespace */ - INIT_NS_CLASS_ENTRY(tmp_ce_ExpectedInvokableException, PIMPLE_EXCEPTION_NS, "ExpectedInvokableException", NULL); - INIT_NS_CLASS_ENTRY(tmp_ce_FrozenServiceException, PIMPLE_EXCEPTION_NS, "FrozenServiceException", pimple_ce_FrozenServiceException_functions); - INIT_NS_CLASS_ENTRY(tmp_ce_InvalidServiceIdentifierException, PIMPLE_EXCEPTION_NS, "InvalidServiceIdentifierException", pimple_ce_InvalidServiceIdentifierException_functions); - INIT_NS_CLASS_ENTRY(tmp_ce_UnknownIdentifierException, PIMPLE_EXCEPTION_NS, "UnknownIdentifierException", pimple_ce_UnknownIdentifierException_functions); - - pimple_ce_ExpectedInvokableException = zend_register_internal_class_ex(&tmp_ce_ExpectedInvokableException, spl_ce_InvalidArgumentException, NULL TSRMLS_CC); - pimple_ce_FrozenServiceException = zend_register_internal_class_ex(&tmp_ce_FrozenServiceException, spl_ce_RuntimeException, NULL TSRMLS_CC); - pimple_ce_InvalidServiceIdentifierException = zend_register_internal_class_ex(&tmp_ce_InvalidServiceIdentifierException, spl_ce_InvalidArgumentException, NULL TSRMLS_CC); - pimple_ce_UnknownIdentifierException = zend_register_internal_class_ex(&tmp_ce_UnknownIdentifierException, spl_ce_InvalidArgumentException, NULL TSRMLS_CC); - - zend_class_implements(pimple_ce_ExpectedInvokableException TSRMLS_CC, 1, pimple_ce_PsrContainerExceptionInterface); - zend_class_implements(pimple_ce_FrozenServiceException TSRMLS_CC, 1, pimple_ce_PsrContainerExceptionInterface); - zend_class_implements(pimple_ce_InvalidServiceIdentifierException TSRMLS_CC, 1, pimple_ce_PsrContainerExceptionInterface); - zend_class_implements(pimple_ce_UnknownIdentifierException TSRMLS_CC, 1, pimple_ce_PsrNotFoundExceptionInterface); - - /* Pimple namespace */ - 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/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/pimple_compat.h b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/pimple_compat.h deleted file mode 100644 index d234e174d0aa..000000000000 --- a/samples/server/petstore-security-test/slim/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/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/001.phpt b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/001.phpt deleted file mode 100644 index 0809ea232b66..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/001.phpt +++ /dev/null @@ -1,45 +0,0 @@ ---TEST-- -Test for read_dim/write_dim handlers ---SKIPIF-- - ---FILE-- - - ---EXPECTF-- -foo -42 -foo2 -foo99 -baz -strstr \ No newline at end of file diff --git a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/002.phpt b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/002.phpt deleted file mode 100644 index 7b56d2c1fe8b..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/002.phpt +++ /dev/null @@ -1,15 +0,0 @@ ---TEST-- -Test for constructor ---SKIPIF-- - ---FILE-- -'foo')); -var_dump($p[42]); -?> ---EXPECT-- -NULL -string(3) "foo" diff --git a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/003.phpt b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/003.phpt deleted file mode 100644 index a22cfa352ea6..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/003.phpt +++ /dev/null @@ -1,16 +0,0 @@ ---TEST-- -Test empty dimensions ---SKIPIF-- - ---FILE-- - ---EXPECT-- -int(42) -string(3) "bar" \ No newline at end of file diff --git a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/004.phpt b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/004.phpt deleted file mode 100644 index 1e1d25136792..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/004.phpt +++ /dev/null @@ -1,30 +0,0 @@ ---TEST-- -Test has/unset dim handlers ---SKIPIF-- - ---FILE-- - ---EXPECT-- -int(42) -NULL -bool(true) -bool(false) -bool(true) -bool(true) \ No newline at end of file diff --git a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/005.phpt b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/005.phpt deleted file mode 100644 index 0479ee055ded..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/005.phpt +++ /dev/null @@ -1,27 +0,0 @@ ---TEST-- -Test simple class inheritance ---SKIPIF-- - ---FILE-- -someAttr; -?> ---EXPECT-- -string(3) "hit" -foo -fooAttr \ No newline at end of file diff --git a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/006.phpt b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/006.phpt deleted file mode 100644 index cfe8a119e63a..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/006.phpt +++ /dev/null @@ -1,51 +0,0 @@ ---TEST-- -Test complex class inheritance ---SKIPIF-- - ---FILE-- - '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/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/007.phpt b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/007.phpt deleted file mode 100644 index 5aac68380643..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/007.phpt +++ /dev/null @@ -1,22 +0,0 @@ ---TEST-- -Test for read_dim/write_dim handlers ---SKIPIF-- - ---FILE-- - ---EXPECTF-- -foo -42 \ No newline at end of file diff --git a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/008.phpt b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/008.phpt deleted file mode 100644 index db7eeec4a113..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/008.phpt +++ /dev/null @@ -1,29 +0,0 @@ ---TEST-- -Test frozen services ---SKIPIF-- - ---FILE-- - ---EXPECTF-- diff --git a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/009.phpt b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/009.phpt deleted file mode 100644 index bb05ea296485..000000000000 --- a/samples/server/petstore-security-test/slim/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-- - ---FILE-- - ---EXPECTF-- -bool(true) \ No newline at end of file diff --git a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/010.phpt b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/010.phpt deleted file mode 100644 index badce0146a91..000000000000 --- a/samples/server/petstore-security-test/slim/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-- - ---FILE-- - ---EXPECTF-- -callme -called -Foo::bar -array(2) { - [0]=> - string(3) "Foo" - [1]=> - string(3) "bar" -} \ No newline at end of file diff --git a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/011.phpt b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/011.phpt deleted file mode 100644 index 6682ab8ebdbc..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/011.phpt +++ /dev/null @@ -1,19 +0,0 @@ ---TEST-- -Test service callback throwing an exception ---SKIPIF-- - ---FILE-- - ---EXPECTF-- -all right! \ No newline at end of file diff --git a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/012.phpt b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/012.phpt deleted file mode 100644 index 4c6ac486dc74..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/012.phpt +++ /dev/null @@ -1,28 +0,0 @@ ---TEST-- -Test service factory ---SKIPIF-- - ---FILE-- -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/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/013.phpt b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/013.phpt deleted file mode 100644 index f419958c5fa5..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/013.phpt +++ /dev/null @@ -1,33 +0,0 @@ ---TEST-- -Test keys() ---SKIPIF-- - ---FILE-- -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/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/014.phpt b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/014.phpt deleted file mode 100644 index ac937213ac0b..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/014.phpt +++ /dev/null @@ -1,30 +0,0 @@ ---TEST-- -Test raw() ---SKIPIF-- - ---FILE-- -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/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/015.phpt b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/015.phpt deleted file mode 100644 index 314f008ac1bb..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/015.phpt +++ /dev/null @@ -1,17 +0,0 @@ ---TEST-- -Test protect() ---SKIPIF-- - ---FILE-- -protect($f); - -var_dump($p['foo']); ---EXPECTF-- -object(Closure)#%i (0) { -} \ No newline at end of file diff --git a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/016.phpt b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/016.phpt deleted file mode 100644 index e55edb0a7a13..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/016.phpt +++ /dev/null @@ -1,24 +0,0 @@ ---TEST-- -Test extend() ---SKIPIF-- - ---FILE-- -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/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/017.phpt b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/017.phpt deleted file mode 100644 index bac23ce09a91..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/017.phpt +++ /dev/null @@ -1,17 +0,0 @@ ---TEST-- -Test extend() with exception in service extension ---SKIPIF-- - ---FILE-- -extend(12, function ($w) { throw new BadMethodCallException; }); - -try { - $p[12]; - echo "Exception expected"; -} catch (BadMethodCallException $e) { } ---EXPECTF-- diff --git a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/017_1.phpt b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/017_1.phpt deleted file mode 100644 index 8f881d6ebf82..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/017_1.phpt +++ /dev/null @@ -1,17 +0,0 @@ ---TEST-- -Test extend() with exception in service factory ---SKIPIF-- - ---FILE-- -extend(12, function ($w) { return 'foobar'; }); - -try { - $p[12]; - echo "Exception expected"; -} catch (BadMethodCallException $e) { } ---EXPECTF-- diff --git a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/018.phpt b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/018.phpt deleted file mode 100644 index 27c12a14e79e..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/018.phpt +++ /dev/null @@ -1,23 +0,0 @@ ---TEST-- -Test register() ---SKIPIF-- - ---FILE-- -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/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/019.phpt b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/019.phpt deleted file mode 100644 index 28a9aecac7f0..000000000000 --- a/samples/server/petstore-security-test/slim/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-- - ---FILE-- -register(new Foo)); ---EXPECTF-- -bool(true) diff --git a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/bench.phpb b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/bench.phpb deleted file mode 100644 index 8f983e656b52..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/bench.phpb +++ /dev/null @@ -1,51 +0,0 @@ -factory($factory); - -$p['factory'] = $factory; - -echo $p['factory']; -echo $p['factory']; -echo $p['factory']; - -} - -echo microtime(true) - $time; diff --git a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/bench_shared.phpb b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/bench_shared.phpb deleted file mode 100644 index aec541f0bc8b..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/ext/pimple/tests/bench_shared.phpb +++ /dev/null @@ -1,25 +0,0 @@ - diff --git a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/phpunit.xml.dist b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/phpunit.xml.dist deleted file mode 100644 index 5c8d487fea9a..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/phpunit.xml.dist +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - ./src/Pimple/Tests - - - diff --git a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/src/Pimple/Container.php b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/src/Pimple/Container.php deleted file mode 100644 index 707b92b82c13..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/src/Pimple/Container.php +++ /dev/null @@ -1,298 +0,0 @@ -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 FrozenServiceException Prevent override of a frozen service - */ - public function offsetSet($id, $value) - { - if (isset($this->frozen[$id])) { - throw new FrozenServiceException($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 UnknownIdentifierException If the identifier is not defined - */ - public function offsetGet($id) - { - if (!isset($this->keys[$id])) { - throw new UnknownIdentifierException($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 ExpectedInvokableException Service definition has to be a closure or an invokable object - */ - public function factory($callable) - { - if (!\method_exists($callable, '__invoke')) { - throw new ExpectedInvokableException('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 ExpectedInvokableException Service definition has to be a closure or an invokable object - */ - public function protect($callable) - { - if (!\method_exists($callable, '__invoke')) { - throw new ExpectedInvokableException('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 UnknownIdentifierException If the identifier is not defined - */ - public function raw($id) - { - if (!isset($this->keys[$id])) { - throw new UnknownIdentifierException($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 UnknownIdentifierException If the identifier is not defined - * @throws FrozenServiceException If the service is frozen - * @throws InvalidServiceIdentifierException If the identifier belongs to a parameter - * @throws ExpectedInvokableException If the extension callable is not a closure or an invokable object - */ - public function extend($id, $callable) - { - if (!isset($this->keys[$id])) { - throw new UnknownIdentifierException($id); - } - - if (isset($this->frozen[$id])) { - throw new FrozenServiceException($id); - } - - if (!\is_object($this->values[$id]) || !\method_exists($this->values[$id], '__invoke')) { - throw new InvalidServiceIdentifierException($id); - } - - if (isset($this->protected[$this->values[$id]])) { - @\trigger_error(\sprintf('How Pimple behaves when extending protected closures will be fixed in Pimple 4. Are you sure "%s" should be protected?', $id), \E_USER_DEPRECATED); - } - - if (!\is_object($callable) || !\method_exists($callable, '__invoke')) { - throw new ExpectedInvokableException('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/samples/server/petstore-security-test/slim/vendor/pimple/pimple/src/Pimple/ServiceProviderInterface.php b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/src/Pimple/ServiceProviderInterface.php deleted file mode 100644 index c004594baf04..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/src/Pimple/ServiceProviderInterface.php +++ /dev/null @@ -1,46 +0,0 @@ -value = $value; - - return $service; - } -} diff --git a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/src/Pimple/Tests/Fixtures/NonInvokable.php b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/src/Pimple/Tests/Fixtures/NonInvokable.php deleted file mode 100644 index 33cd4e548640..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/src/Pimple/Tests/Fixtures/NonInvokable.php +++ /dev/null @@ -1,34 +0,0 @@ -factory(function () { - return new Service(); - }); - } -} diff --git a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/src/Pimple/Tests/Fixtures/Service.php b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/src/Pimple/Tests/Fixtures/Service.php deleted file mode 100644 index d71b184ddf7f..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/src/Pimple/Tests/Fixtures/Service.php +++ /dev/null @@ -1,35 +0,0 @@ - - */ -class Service -{ - public $value; -} diff --git a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/src/Pimple/Tests/PimpleServiceProviderInterfaceTest.php b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/src/Pimple/Tests/PimpleServiceProviderInterfaceTest.php deleted file mode 100644 index 8e5c4c73deb0..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/src/Pimple/Tests/PimpleServiceProviderInterfaceTest.php +++ /dev/null @@ -1,76 +0,0 @@ - - */ -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/samples/server/petstore-security-test/slim/vendor/pimple/pimple/src/Pimple/Tests/PimpleTest.php b/samples/server/petstore-security-test/slim/vendor/pimple/pimple/src/Pimple/Tests/PimpleTest.php deleted file mode 100644 index acb66e000261..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/pimple/pimple/src/Pimple/Tests/PimpleTest.php +++ /dev/null @@ -1,589 +0,0 @@ - - */ -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 \Pimple\Exception\UnknownIdentifierException - * @expectedExceptionMessage Identifier "foo" is not defined. - */ - public function testOffsetGetValidatesKeyIsPresent() - { - $pimple = new Container(); - echo $pimple['foo']; - } - - /** - * @group legacy - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage Identifier "foo" is not defined. - */ - public function testLegacyOffsetGetValidatesKeyIsPresent() - { - $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->getMockBuilder('Pimple\ServiceProviderInterface')->getMock())); - } - - /** - * @expectedException \Pimple\Exception\UnknownIdentifierException - * @expectedExceptionMessage Identifier "foo" is not defined. - */ - public function testRawValidatesKeyIsPresent() - { - $pimple = new Container(); - $pimple->raw('foo'); - } - - /** - * @group legacy - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage Identifier "foo" is not defined. - */ - public function testLegacyRawValidatesKeyIsPresent() - { - $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 \Pimple\Exception\UnknownIdentifierException - * @expectedExceptionMessage Identifier "foo" is not defined. - */ - public function testExtendValidatesKeyIsPresent() - { - $pimple = new Container(); - $pimple->extend('foo', function () {}); - } - - /** - * @group legacy - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage Identifier "foo" is not defined. - */ - public function testLegacyExtendValidatesKeyIsPresent() - { - $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 \Pimple\Exception\ExpectedInvokableException - * @expectedExceptionMessage Service definition is not a Closure or invokable object. - */ - public function testFactoryFailsForInvalidServiceDefinitions($service) - { - $pimple = new Container(); - $pimple->factory($service); - } - - /** - * @group legacy - * @dataProvider badServiceDefinitionProvider - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage Service definition is not a Closure or invokable object. - */ - public function testLegacyFactoryFailsForInvalidServiceDefinitions($service) - { - $pimple = new Container(); - $pimple->factory($service); - } - - /** - * @dataProvider badServiceDefinitionProvider - * @expectedException \Pimple\Exception\ExpectedInvokableException - * @expectedExceptionMessage Callable is not a Closure or invokable object. - */ - public function testProtectFailsForInvalidServiceDefinitions($service) - { - $pimple = new Container(); - $pimple->protect($service); - } - - /** - * @group legacy - * @dataProvider badServiceDefinitionProvider - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage Callable is not a Closure or invokable object. - */ - public function testLegacyProtectFailsForInvalidServiceDefinitions($service) - { - $pimple = new Container(); - $pimple->protect($service); - } - - /** - * @dataProvider badServiceDefinitionProvider - * @expectedException \Pimple\Exception\InvalidServiceIdentifierException - * @expectedExceptionMessage Identifier "foo" does not contain an object definition. - */ - public function testExtendFailsForKeysNotContainingServiceDefinitions($service) - { - $pimple = new Container(); - $pimple['foo'] = $service; - $pimple->extend('foo', function () {}); - } - - /** - * @group legacy - * @dataProvider badServiceDefinitionProvider - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage Identifier "foo" does not contain an object definition. - */ - public function testLegacyExtendFailsForKeysNotContainingServiceDefinitions($service) - { - $pimple = new Container(); - $pimple['foo'] = $service; - $pimple->extend('foo', function () {}); - } - - /** - * @group legacy - * @expectedDeprecation How Pimple behaves when extending protected closures will be fixed in Pimple 4. Are you sure "foo" should be protected? - */ - public function testExtendingProtectedClosureDeprecation() - { - $pimple = new Container(); - $pimple['foo'] = $pimple->protect(function () { - return 'bar'; - }); - - $pimple->extend('foo', function ($value) { - return $value.'-baz'; - }); - - $this->assertSame('bar-baz', $pimple['foo']); - } - - /** - * @dataProvider badServiceDefinitionProvider - * @expectedException \Pimple\Exception\ExpectedInvokableException - * @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); - } - - /** - * @group legacy - * @dataProvider badServiceDefinitionProvider - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage Extension service definition is not a Closure or invokable object. - */ - public function testLegacyExtendFailsForInvalidServiceDefinitions($service) - { - $pimple = new Container(); - $pimple['foo'] = function () {}; - $pimple->extend('foo', $service); - } - - /** - * @expectedException \Pimple\Exception\FrozenServiceException - * @expectedExceptionMessage Cannot override frozen service "foo". - */ - public function testExtendFailsIfFrozenServiceIsNonInvokable() - { - $pimple = new Container(); - $pimple['foo'] = function () { - return new Fixtures\NonInvokable(); - }; - $foo = $pimple['foo']; - - $pimple->extend('foo', function () {}); - } - - /** - * @expectedException \Pimple\Exception\FrozenServiceException - * @expectedExceptionMessage Cannot override frozen service "foo". - */ - public function testExtendFailsIfFrozenServiceIsInvokable() - { - $pimple = new Container(); - $pimple['foo'] = function () { - return new Fixtures\Invokable(); - }; - $foo = $pimple['foo']; - - $pimple->extend('foo', function () {}); - } - - /** - * 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 \Pimple\Exception\FrozenServiceException - * @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'; - }; - } - - /** - * @group legacy - * @expectedException \RuntimeException - * @expectedExceptionMessage Cannot override frozen service "foo". - */ - public function testLegacyOverridingServiceAfterFreeze() - { - $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/samples/server/petstore-security-test/slim/vendor/psr/http-message/LICENSE b/samples/server/petstore-security-test/slim/vendor/psr/http-message/LICENSE deleted file mode 100644 index c2d8e452de1b..000000000000 --- a/samples/server/petstore-security-test/slim/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/samples/server/petstore-security-test/slim/vendor/psr/http-message/README.md b/samples/server/petstore-security-test/slim/vendor/psr/http-message/README.md deleted file mode 100644 index 28185338f723..000000000000 --- a/samples/server/petstore-security-test/slim/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/samples/server/petstore-security-test/slim/vendor/psr/http-message/composer.json b/samples/server/petstore-security-test/slim/vendor/psr/http-message/composer.json deleted file mode 100644 index b0d2937a03a5..000000000000 --- a/samples/server/petstore-security-test/slim/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/samples/server/petstore-security-test/slim/vendor/psr/http-message/src/MessageInterface.php b/samples/server/petstore-security-test/slim/vendor/psr/http-message/src/MessageInterface.php deleted file mode 100644 index dd46e5ec81ee..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/psr/http-message/src/MessageInterface.php +++ /dev/null @@ -1,187 +0,0 @@ -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/samples/server/petstore-security-test/slim/vendor/psr/http-message/src/RequestInterface.php b/samples/server/petstore-security-test/slim/vendor/psr/http-message/src/RequestInterface.php deleted file mode 100644 index a96d4fd63667..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/psr/http-message/src/RequestInterface.php +++ /dev/null @@ -1,129 +0,0 @@ -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/samples/server/petstore-security-test/slim/vendor/psr/http-message/src/StreamInterface.php b/samples/server/petstore-security-test/slim/vendor/psr/http-message/src/StreamInterface.php deleted file mode 100644 index f68f391269b4..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/psr/http-message/src/StreamInterface.php +++ /dev/null @@ -1,158 +0,0 @@ - - * [user-info@]host[:port] - * - * - * 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/samples/server/petstore-security-test/slim/vendor/slim/slim/LICENSE.md b/samples/server/petstore-security-test/slim/vendor/slim/slim/LICENSE.md deleted file mode 100644 index 682c21dc7a47..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/LICENSE.md +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2011-2017 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/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/App.php b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/App.php deleted file mode 100644 index ba2aef40695f..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/App.php +++ /dev/null @@ -1,714 +0,0 @@ -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; - } - - /** - * Add a route that sends an HTTP redirect - * - * @param string $from - * @param string|UriInterface $to - * @param int $status - * - * @return RouteInterface - */ - public function redirect($from, $to, $status = 302) - { - $handler = function ($request, ResponseInterface $response) use ($to, $status) { - return $response->withHeader('Location', (string)$to)->withStatus($status); - }; - - return $this->get($from, $handler); - } - - /** - * 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) - { - $response = $this->container->get('response'); - - try { - ob_start(); - $response = $this->process($this->container->get('request'), $response); - } catch (InvalidMethodException $e) { - $response = $this->processInvalidMethod($e->getRequest(), $response); - } finally { - $output = ob_get_clean(); - } - - if (!empty($output) && $response->getBody()->isWritable()) { - $outputBuffering = $this->container->get('settings')['outputBuffering']; - if ($outputBuffering === 'prepend') { - // prepend output buffer content - $body = new Http\Body(fopen('php://temp', 'r+')); - $body->write($output . $response->getBody()); - $response = $response->withBody($body); - } elseif ($outputBuffering === 'append') { - // append output buffer content - $response->getBody()->write($output); - } - } - - $response = $this->finalize($response); - - if (!$silent) { - $this->respond($response); - } - - return $response; - } - - /** - * Pull route info for a request with a bad method to decide whether to - * return a not-found error (default) or a bad-method error, then run - * the handler for that error, returning the resulting response. - * - * Used for cases where an incoming request has an unrecognized method, - * rather than throwing an exception and not catching it all the way up. - * - * @param ServerRequestInterface $request - * @param ResponseInterface $response - * @return ResponseInterface - */ - protected function processInvalidMethod(ServerRequestInterface $request, ResponseInterface $response) - { - $router = $this->container->get('router'); - if (is_callable([$request->getUri(), 'getBasePath']) && is_callable([$router, 'setBasePath'])) { - $router->setBasePath($request->getUri()->getBasePath()); - } - - $request = $this->dispatchRouterAndPrepareRoute($request, $router); - $routeInfo = $request->getAttribute('routeInfo', [RouterInterface::DISPATCH_STATUS => Dispatcher::NOT_FOUND]); - - if ($routeInfo[RouterInterface::DISPATCH_STATUS] === Dispatcher::METHOD_NOT_ALLOWED) { - return $this->handleException( - new MethodNotAllowedException($request, $response, $routeInfo[RouterInterface::ALLOWED_METHODS]), - $request, - $response - ); - } - - return $this->handleException(new NotFoundException($request, $response), $request, $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); - } - - return $response; - } - - /** - * Send the response to the client - * - * @param ResponseInterface $response - */ - public function respond(ResponseInterface $response) - { - // Send response - if (!headers_sent()) { - // Headers - foreach ($response->getHeaders() as $name => $values) { - foreach ($values as $value) { - header(sprintf('%s: %s', $name, $value), false); - } - } - - // Set the status _after_ the headers, because of PHP's "helpful" behavior with location headers. - // See https://github.com/slimphp/Slim/issues/1730 - - // Status - header(sprintf( - 'HTTP/%s %s %s', - $response->getProtocolVersion(), - $response->getStatusCode(), - $response->getReasonPhrase() - )); - } - - // 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 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(), $e]; - } 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/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/CallableResolver.php b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/CallableResolver.php deleted file mode 100644 index 2211a3291878..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/CallableResolver.php +++ /dev/null @@ -1,110 +0,0 @@ -container = $container; - } - - /** - * Resolve toResolve into a closure so 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) - { - if (is_callable($toResolve)) { - return $toResolve; - } - - if (!is_string($toResolve)) { - $this->assertCallable($toResolve); - } - - // check for slim callable as "class:method" - if (preg_match(self::CALLABLE_PATTERN, $toResolve, $matches)) { - $resolved = $this->resolveCallable($matches[1], $matches[2]); - $this->assertCallable($resolved); - - return $resolved; - } - - $resolved = $this->resolveCallable($toResolve); - $this->assertCallable($resolved); - - return $resolved; - } - - /** - * Check if string is something in the DIC - * that's callable or is a class name which has an __invoke() method. - * - * @param string $class - * @param string $method - * @return callable - * - * @throws \RuntimeException if the callable does not exist - */ - protected function resolveCallable($class, $method = '__invoke') - { - if ($this->container->has($class)) { - return [$this->container->get($class), $method]; - } - - if (!class_exists($class)) { - throw new RuntimeException(sprintf('Callable %s does not exist', $class)); - } - - return [new $class($this->container), $method]; - } - - /** - * @param Callable $callable - * - * @throws \RuntimeException if the callable is not resolvable - */ - protected function assertCallable($callable) - { - if (!is_callable($callable)) { - throw new RuntimeException(sprintf( - '%s is not resolvable', - is_array($callable) || is_object($callable) ? json_encode($callable) : $callable - )); - } - } -} diff --git a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/CallableResolverAwareTrait.php b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/CallableResolverAwareTrait.php deleted file mode 100644 index ffb4eb28a439..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/CallableResolverAwareTrait.php +++ /dev/null @@ -1,47 +0,0 @@ -container instanceof ContainerInterface) { - return $callable; - } - - /** @var CallableResolverInterface $resolver */ - $resolver = $this->container->get('callableResolver'); - - return $resolver->resolve($callable); - } -} diff --git a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Collection.php b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Collection.php deleted file mode 100644 index 728bb73e08b1..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Collection.php +++ /dev/null @@ -1,202 +0,0 @@ -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/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Container.php b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Container.php deleted file mode 100644 index 1f713ac4eabb..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Container.php +++ /dev/null @@ -1,179 +0,0 @@ - '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 Psr\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/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/DefaultServicesProvider.php b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/DefaultServicesProvider.php deleted file mode 100644 index 13fe1fb31ce3..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/DefaultServicesProvider.php +++ /dev/null @@ -1,211 +0,0 @@ -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']; - } - - - $router = (new Router)->setCacheFile($routerCacheFile); - if (method_exists($router, 'setContainer')) { - $router->setContainer($container); - } - - return $router; - }; - } - - 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/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/DeferredCallable.php b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/DeferredCallable.php deleted file mode 100644 index 22887c0fce63..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/DeferredCallable.php +++ /dev/null @@ -1,45 +0,0 @@ -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/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Exception/ContainerException.php b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Exception/ContainerException.php deleted file mode 100644 index 06163f1da059..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Exception/ContainerException.php +++ /dev/null @@ -1,20 +0,0 @@ -allowedMethods = $allowedMethods; - } - - /** - * Get allowed methods - * - * @return string[] - */ - public function getAllowedMethods() - { - return $this->allowedMethods; - } -} diff --git a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Exception/NotFoundException.php b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Exception/NotFoundException.php deleted file mode 100644 index 9e72e14e63bc..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Exception/NotFoundException.php +++ /dev/null @@ -1,14 +0,0 @@ -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/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Handlers/AbstractError.php b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Handlers/AbstractError.php deleted file mode 100644 index 42f8dde3df06..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Handlers/AbstractError.php +++ /dev/null @@ -1,99 +0,0 @@ -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/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Handlers/AbstractHandler.php b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Handlers/AbstractHandler.php deleted file mode 100644 index b166a1564431..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Handlers/AbstractHandler.php +++ /dev/null @@ -1,59 +0,0 @@ -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/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Handlers/Error.php b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Handlers/Error.php deleted file mode 100644 index dd0bc8d4e7a5..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Handlers/Error.php +++ /dev/null @@ -1,224 +0,0 @@ -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 = '

The application could not run because of the following error:

'; - $html .= '

Details

'; - $html .= $this->renderHtmlException($exception); - - while ($exception = $exception->getPrevious()) { - $html .= '

Previous exception

'; - $html .= $this->renderHtmlExceptionOrError($exception); - } - } else { - $html = '

A website error has occurred. Sorry for the temporary inconvenience.

'; - } - - $output = sprintf( - "" . - "%s

%s

%s", - $title, - $title, - $html - ); - - return $output; - } - - /** - * Render exception as HTML. - * - * Provided for backwards compatibility; use renderHtmlExceptionOrError(). - * - * @param \Exception $exception - * - * @return string - */ - protected function renderHtmlException(\Exception $exception) - { - return $this->renderHtmlExceptionOrError($exception); - } - - /** - * Render exception or error as HTML. - * - * @param \Exception|\Error $exception - * - * @return string - */ - protected function renderHtmlExceptionOrError($exception) - { - if (!$exception instanceof \Exception && !$exception instanceof \Error) { - throw new \RuntimeException("Unexpected type. Expected Exception or Error."); - } - - $html = sprintf('
Type: %s
', get_class($exception)); - - if (($code = $exception->getCode())) { - $html .= sprintf('
Code: %s
', $code); - } - - if (($message = $exception->getMessage())) { - $html .= sprintf('
Message: %s
', htmlentities($message)); - } - - if (($file = $exception->getFile())) { - $html .= sprintf('
File: %s
', $file); - } - - if (($line = $exception->getLine())) { - $html .= sprintf('
Line: %s
', $line); - } - - if (($trace = $exception->getTraceAsString())) { - $html .= '

Trace

'; - $html .= sprintf('
%s
', 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 = "\n Slim Application Error\n"; - if ($this->displayErrorDetails) { - do { - $xml .= " \n"; - $xml .= " " . get_class($exception) . "\n"; - $xml .= " " . $exception->getCode() . "\n"; - $xml .= " " . $this->createCdataSection($exception->getMessage()) . "\n"; - $xml .= " " . $exception->getFile() . "\n"; - $xml .= " " . $exception->getLine() . "\n"; - $xml .= " " . $this->createCdataSection($exception->getTraceAsString()) . "\n"; - $xml .= " \n"; - } while ($exception = $exception->getPrevious()); - } - $xml .= ""; - - return $xml; - } - - /** - * Returns a CDATA section with the given content. - * - * @param string $content - * @return string - */ - private function createCdataSection($content) - { - return sprintf('', str_replace(']]>', ']]]]>', $content)); - } -} diff --git a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Handlers/NotAllowed.php b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Handlers/NotAllowed.php deleted file mode 100644 index 345f0ff8c42f..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Handlers/NotAllowed.php +++ /dev/null @@ -1,147 +0,0 @@ -getMethod() === 'OPTIONS') { - $status = 200; - $contentType = 'text/plain'; - $output = $this->renderPlainOptionsMessage($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 message for OPTIONS response - * - * @param array $methods - * @return string - */ - protected function renderPlainOptionsMessage($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 "Method not allowed. Must be one of: $allow"; - } - - /** - * Render HTML not allowed message - * - * @param array $methods - * @return string - */ - protected function renderHtmlNotAllowedMessage($methods) - { - $allow = implode(', ', $methods); - $output = << - - Method not allowed - - - -

Method not allowed

-

Method not allowed. Must be one of: $allow

- - -END; - - return $output; - } -} diff --git a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Handlers/NotFound.php b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Handlers/NotFound.php deleted file mode 100644 index b3330321ff38..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Handlers/NotFound.php +++ /dev/null @@ -1,141 +0,0 @@ -getMethod() === 'OPTIONS') { - $contentType = 'text/plain'; - $output = $this->renderPlainNotFoundOutput(); - } else { - $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); - } - - /** - * Render plain not found message - * - * @return ResponseInterface - */ - protected function renderPlainNotFoundOutput() - { - return 'Not found'; - } - - /** - * 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 'Not found'; - } - - /** - * 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 << - - Page Not Found - - - -

Page Not Found

-

- 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. -

- Visit the Home Page - - -END; - } -} diff --git a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Handlers/PhpError.php b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Handlers/PhpError.php deleted file mode 100644 index 3ecce30cfaf0..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Handlers/PhpError.php +++ /dev/null @@ -1,205 +0,0 @@ -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 = '

The application could not run because of the following error:

'; - $html .= '

Details

'; - $html .= $this->renderHtmlError($error); - - while ($error = $error->getPrevious()) { - $html .= '

Previous error

'; - $html .= $this->renderHtmlError($error); - } - } else { - $html = '

A website error has occurred. Sorry for the temporary inconvenience.

'; - } - - $output = sprintf( - "" . - "%s

%s

%s", - $title, - $title, - $html - ); - - return $output; - } - - /** - * Render error as HTML. - * - * @param \Throwable $error - * - * @return string - */ - protected function renderHtmlError(\Throwable $error) - { - $html = sprintf('
Type: %s
', get_class($error)); - - if (($code = $error->getCode())) { - $html .= sprintf('
Code: %s
', $code); - } - - if (($message = $error->getMessage())) { - $html .= sprintf('
Message: %s
', htmlentities($message)); - } - - if (($file = $error->getFile())) { - $html .= sprintf('
File: %s
', $file); - } - - if (($line = $error->getLine())) { - $html .= sprintf('
Line: %s
', $line); - } - - if (($trace = $error->getTraceAsString())) { - $html .= '

Trace

'; - $html .= sprintf('
%s
', 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 = "\n Slim Application Error\n"; - if ($this->displayErrorDetails) { - do { - $xml .= " \n"; - $xml .= " " . get_class($error) . "\n"; - $xml .= " " . $error->getCode() . "\n"; - $xml .= " " . $this->createCdataSection($error->getMessage()) . "\n"; - $xml .= " " . $error->getFile() . "\n"; - $xml .= " " . $error->getLine() . "\n"; - $xml .= " " . $this->createCdataSection($error->getTraceAsString()) . "\n"; - $xml .= " \n"; - } while ($error = $error->getPrevious()); - } - $xml .= ""; - - return $xml; - } - - /** - * Returns a CDATA section with the given content. - * - * @param string $content - * @return string - */ - private function createCdataSection($content) - { - return sprintf('', str_replace(']]>', ']]]]>', $content)); - } -} diff --git a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Handlers/Strategies/RequestResponse.php b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Handlers/Strategies/RequestResponse.php deleted file mode 100644 index ad99b56e8655..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Handlers/Strategies/RequestResponse.php +++ /dev/null @@ -1,43 +0,0 @@ - $v) { - $request = $request->withAttribute($k, $v); - } - - return call_user_func($callable, $request, $response, $routeArguments); - } -} diff --git a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Handlers/Strategies/RequestResponseArgs.php b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Handlers/Strategies/RequestResponseArgs.php deleted file mode 100644 index 739cc7ee88f8..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Handlers/Strategies/RequestResponseArgs.php +++ /dev/null @@ -1,42 +0,0 @@ - '', - 'domain' => null, - 'hostonly' => null, - 'path' => null, - 'expires' => null, - 'secure' => false, - 'httponly' => false, - 'samesite' => null - ]; - - /** - * 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'; - } - - if (isset($properties['samesite']) && in_array(strtolower($properties['samesite']), ['lax', 'strict'], true)) { - // While strtolower is needed for correct comparison, the RFC doesn't care about case - $result .= '; SameSite=' . $properties['samesite']; - } - - 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*@', $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/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/Environment.php b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/Environment.php deleted file mode 100644 index cd452fcff97e..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/Environment.php +++ /dev/null @@ -1,63 +0,0 @@ - 'HTTP/1.1', - 'REQUEST_METHOD' => 'GET', - 'REQUEST_SCHEME' => $defscheme, - 'SCRIPT_NAME' => '', - 'REQUEST_URI' => '', - 'QUERY_STRING' => '', - 'SERVER_NAME' => 'localhost', - 'SERVER_PORT' => $defport, - '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/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/Headers.php b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/Headers.php deleted file mode 100644 index ef50f84b6015..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/Headers.php +++ /dev/null @@ -1,222 +0,0 @@ - 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 (empty($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/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/Message.php b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/Message.php deleted file mode 100644 index 9195fb5b70fa..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/Message.php +++ /dev/null @@ -1,305 +0,0 @@ - true, - '1.1' => true, - '2.0' => true, - '2' => 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/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/Request.php b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/Request.php deleted file mode 100644 index 3bda649b3353..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/Request.php +++ /dev/null @@ -1,1229 +0,0 @@ - 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 static - */ - 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 - * @throws InvalidMethodException on invalid HTTP method - */ - public function __construct( - $method, - UriInterface $uri, - HeadersInterface $headers, - array $cookies, - array $serverParams, - StreamInterface $body, - array $uploadedFiles = [] - ) { - try { - $this->originalMethod = $this->filterMethod($method); - } catch (InvalidMethodException $e) { - $this->originalMethod = $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() !== '') { - $port = $this->uri->getPort() ? ":{$this->uri->getPort()}" : ''; - - $this->headers->set('Host', $this->uri->getHost() . $port); - } - - $this->registerMediaTypeParser('application/json', function ($input) { - $result = json_decode($input, true); - if (!is_array($result)) { - return null; - } - return $result; - }); - - $this->registerMediaTypeParser('application/xml', function ($input) { - $backup = libxml_disable_entity_loader(true); - $backup_errors = libxml_use_internal_errors(true); - $result = simplexml_load_string($input); - libxml_disable_entity_loader($backup); - libxml_clear_errors(); - libxml_use_internal_errors($backup_errors); - if ($result === false) { - return null; - } - return $result; - }); - - $this->registerMediaTypeParser('text/xml', function ($input) { - $backup = libxml_disable_entity_loader(true); - $backup_errors = libxml_use_internal_errors(true); - $result = simplexml_load_string($input); - libxml_disable_entity_loader($backup); - libxml_clear_errors(); - libxml_use_internal_errors($backup_errors); - if ($result === false) { - return null; - } - return $result; - }); - - $this->registerMediaTypeParser('application/x-www-form-urlencoded', function ($input) { - parse_str($input, $data); - return $data; - }); - - // if the request had an invalid method, we can throw it now - if (isset($e) && $e instanceof InvalidMethodException) { - throw $e; - } - } - - /** - * 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') { - $overrideMethod = $this->filterMethod($this->getParsedBodyParam('_METHOD')); - if ($overrideMethod !== null) { - $this->method = $overrideMethod; - } - - 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 static - * @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 (preg_match("/^[!#$%&'*+.^_`|~0-9a-z-]+$/i", $method) !== 1) { - throw new InvalidMethodException($this, $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 static - * @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 static - */ - 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 ($uri->getHost() !== '' && (!$this->hasHeader('Host') || $this->getHeaderLine('Host') === '')) { - $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 $key 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 static - */ - 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 static - */ - 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 static - * @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; - } - - /** - * Retrieve a server parameter. - * - * Note: This method is not part of the PSR-7 standard. - * - * @param string $key - * @param mixed $default - * @return mixed - */ - public function getServerParam($key, $default = null) - { - $serverParams = $this->getServerParams(); - - return isset($serverParams[$key]) ? $serverParams[$key] : $default; - } - - /******************************************************************************* - * 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 static - */ - 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 static - */ - 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 static - */ - 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 static - * @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 $this - */ - 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 string $key - * @param mixed $default - * - * @return mixed - */ - 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 string $key - * @param mixed $default - * - * @return mixed - */ - public function getQueryParam($key, $default = null) - { - $getParams = $this->getQueryParams(); - $result = $default; - if (isset($getParams[$key])) { - $result = $getParams[$key]; - } - - return $result; - } - - /** - * Fetch associative array of body and query string parameters. - * - * Note: This method is not part of the PSR-7 standard. - * - * @param array|null $only list the keys to retrieve. - * @return array|null - */ - public function getParams(array $only = null) - { - $params = $this->getQueryParams(); - $postParams = $this->getParsedBody(); - if ($postParams) { - $params = array_merge($params, (array)$postParams); - } - - if ($only) { - $onlyParams = []; - foreach ($only as $key) { - if (array_key_exists($key, $params)) { - $onlyParams[$key] = $params[$key]; - } - } - return $onlyParams; - } - - return $params; - } -} diff --git a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/RequestBody.php b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/RequestBody.php deleted file mode 100644 index 50887fddc23b..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/RequestBody.php +++ /dev/null @@ -1,27 +0,0 @@ - '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', - 421 => 'Misdirected Request', - 422 => 'Unprocessable Entity', - 423 => 'Locked', - 424 => 'Failed Dependency', - 426 => 'Upgrade Required', - 428 => 'Precondition Required', - 429 => 'Too Many Requests', - 431 => 'Request Header Fields Too Large', - 444 => 'Connection Closed Without Response', - 451 => 'Unavailable For Legal Reasons', - 499 => 'Client Closed Request', - //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', - 599 => 'Network Connect Timeout Error', - ]; - - /** - * EOL characters used for HTTP response. - * - * @var string - */ - const EOL = "\r\n"; - - /** - * 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 static - * @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 ''; - } - - /******************************************************************************* - * Headers - ******************************************************************************/ - - /** - * Return an instance with the provided value replacing the specified header. - * - * If a Location header is set and the status code is 200, then set the status - * code to 302 to mimic what PHP does. See https://github.com/slimphp/Slim/issues/1730 - * - * @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); - - if ($clone->getStatusCode() === 200 && strtolower($name) === 'location') { - $clone = $clone->withStatus(302); - } - - return $clone; - } - - - /******************************************************************************* - * 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 $this - */ - 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 static - */ - 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 static - */ - public function withJson($data, $status = null, $encodingOptions = 0) - { - $response = $this->withBody(new Body(fopen('php://temp', 'r+'))); - $response->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 = $response->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 .= Response::EOL; - foreach ($this->getHeaders() as $name => $values) { - $output .= sprintf('%s: %s', $name, $this->getHeaderLine($name)) . Response::EOL; - } - $output .= Response::EOL; - $output .= (string)$this->getBody(); - - return $output; - } -} diff --git a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/Stream.php b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/Stream.php deleted file mode 100644 index 27c7a7645bf6..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/Stream.php +++ /dev/null @@ -1,450 +0,0 @@ - ['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/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/UploadedFile.php b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/UploadedFile.php deleted file mode 100644 index ae5dfb65e593..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/UploadedFile.php +++ /dev/null @@ -1,327 +0,0 @@ -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/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/Uri.php b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/Uri.php deleted file mode 100644 index fb0f04b5c3e9..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Http/Uri.php +++ /dev/null @@ -1,845 +0,0 @@ -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 (isset($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: - * - *
-     * [user-info@]host[:port]
-     * 
- * - * 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 = $this->filterUserInfo($user); - if ($clone->user) { - $clone->password = $password ? $this->filterUserInfo($password) : ''; - } else { - $clone->password = ''; - } - - return $clone; - } - - /** - * Filters the user info string. - * - * @param string $query The raw uri query string. - * @return string The percent-encoded query string. - */ - protected function filterUserInfo($query) - { - return preg_replace_callback( - '/(?:[^a-zA-Z0-9_\-\.~!\$&\'\(\)\*\+,;=]+|%(?![A-Fa-f0-9]{2}))/u', - function ($match) { - return rawurlencode($match[0]); - }, - $query - ); - } - - /** - * 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/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Interfaces/CallableResolverInterface.php b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Interfaces/CallableResolverInterface.php deleted file mode 100644 index 17d81dbe84ea..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Interfaces/CallableResolverInterface.php +++ /dev/null @@ -1,27 +0,0 @@ -middlewareLock) { - throw new RuntimeException('Middleware can’t be added once the stack is dequeuing'); - } - - if (is_null($this->tip)) { - $this->seedMiddlewareStack(); - } - $next = $this->tip; - $this->tip = function ( - ServerRequestInterface $request, - ResponseInterface $response - ) use ( - $callable, - $next - ) { - $result = call_user_func($callable, $request, $response, $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->tip)) { - throw new RuntimeException('MiddlewareStack can only be seeded once.'); - } - if ($kernel === null) { - $kernel = $this; - } - $this->tip = $kernel; - } - - /** - * Call middleware stack - * - * @param ServerRequestInterface $request A request object - * @param ResponseInterface $response A response object - * - * @return ResponseInterface - */ - public function callMiddlewareStack(ServerRequestInterface $request, ResponseInterface $response) - { - if (is_null($this->tip)) { - $this->seedMiddlewareStack(); - } - /** @var callable $start */ - $start = $this->tip; - $this->middlewareLock = true; - $response = $start($request, $response); - $this->middlewareLock = false; - return $response; - } -} diff --git a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Routable.php b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Routable.php deleted file mode 100644 index c912db433a14..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Routable.php +++ /dev/null @@ -1,106 +0,0 @@ -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 - * - * @param string $newPattern - */ - public function setPattern($newPattern) - { - $this->pattern = $newPattern; - } -} diff --git a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Route.php b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Route.php deleted file mode 100644 index fa8be4e44688..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Route.php +++ /dev/null @@ -1,349 +0,0 @@ -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; - } - - /** - * This method enables you to override the Route's callable - * - * @param string|\Closure $callable - */ - public function setCallable($callable) - { - $this->callable = $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 string|null $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(); - - $newResponse = $handler($this->callable, $request, $response, $this->arguments); - - 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); - } - } - - return $response; - } -} diff --git a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/RouteGroup.php b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/RouteGroup.php deleted file mode 100644 index 8260bbd6c760..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/RouteGroup.php +++ /dev/null @@ -1,47 +0,0 @@ -pattern = $pattern; - $this->callable = $callable; - } - - /** - * Invoke the group to register any Routable objects within it. - * - * @param App $app The App instance to bind/pass to the group callable - */ - public function __invoke(App $app = null) - { - $callable = $this->resolveCallable($this->callable); - if ($callable instanceof Closure && $app !== null) { - $callable = $callable->bindTo($app); - } - - $callable($app); - } -} diff --git a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Router.php b/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Router.php deleted file mode 100644 index 83116288c68c..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/Slim/Router.php +++ /dev/null @@ -1,455 +0,0 @@ -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; - } - - /** - * @param ContainerInterface $container - */ - public function setContainer(ContainerInterface $container) - { - $this->container = $container; - } - - /** - * 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 $callable The route callable - * - * @return \Slim\Interfaces\RouteInterface - */ - protected function createRoute($methods, $pattern, $callable) - { - $route = new Route($methods, $pattern, $callable, $this->routeGroups, $this->routeCounter); - if (!empty($this->container)) { - $route->setContainer($this->container); - } - - return $route; - } - - /** - * @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/samples/server/petstore-security-test/slim/vendor/slim/slim/composer.json b/samples/server/petstore-security-test/slim/vendor/slim/slim/composer.json deleted file mode 100644 index 554a838a95d5..000000000000 --- a/samples/server/petstore-security-test/slim/vendor/slim/slim/composer.json +++ /dev/null @@ -1,58 +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": "https://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.2", - "psr/container": "^1.0" - }, - "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/samples/server/petstore/php-slim/.gitignore b/samples/server/petstore/php-slim/.gitignore new file mode 100644 index 000000000000..9ff0a17ae5c9 --- /dev/null +++ b/samples/server/petstore/php-slim/.gitignore @@ -0,0 +1,6 @@ +composer.phar +/vendor/ + +# Commit your application's lock file https://getcomposer.org/doc/01-basic-usage.md#commit-your-composer-lock-file-to-version-control +# You may choose to ignore a library lock file http://getcomposer.org/doc/02-libraries.md#lock-file +composer.lock \ No newline at end of file diff --git a/samples/server/petstore/php-slim/vendor/autoload.php b/samples/server/petstore/php-slim/vendor/autoload.php deleted file mode 100644 index 58c1fa48aaaf..000000000000 --- a/samples/server/petstore/php-slim/vendor/autoload.php +++ /dev/null @@ -1,7 +0,0 @@ - - * Jordi Boggiano - * - * 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 - * @author Jordi Boggiano - * @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(); - private $apcuPrefix; - - 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; - } - - /** - * APCu prefix to use to cache found/not-found classes, if the extension is enabled. - * - * @param string|null $apcuPrefix - */ - public function setApcuPrefix($apcuPrefix) - { - $this->apcuPrefix = function_exists('apcu_fetch') && ini_get('apc.enabled') ? $apcuPrefix : null; - } - - /** - * The APCu prefix in use, or null if APCu caching is not enabled. - * - * @return string|null - */ - public function getApcuPrefix() - { - return $this->apcuPrefix; - } - - /** - * 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) - { - // class map lookup - if (isset($this->classMap[$class])) { - return $this->classMap[$class]; - } - if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { - return false; - } - if (null !== $this->apcuPrefix) { - $file = apcu_fetch($this->apcuPrefix.$class, $hit); - if ($hit) { - return $file; - } - } - - $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 (null !== $this->apcuPrefix) { - apcu_add($this->apcuPrefix.$class, $file); - } - - 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])) { - $subPath = $class; - while (false !== $lastPos = strrpos($subPath, '\\')) { - $subPath = substr($subPath, 0, $lastPos); - $search = $subPath.'\\'; - if (isset($this->prefixDirsPsr4[$search])) { - $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); - foreach ($this->prefixDirsPsr4[$search] as $dir) { - if (file_exists($file = $dir . $pathEnd)) { - 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/samples/server/petstore/php-slim/vendor/composer/autoload_classmap.php b/samples/server/petstore/php-slim/vendor/composer/autoload_classmap.php deleted file mode 100644 index 7a91153b0d8e..000000000000 --- a/samples/server/petstore/php-slim/vendor/composer/autoload_classmap.php +++ /dev/null @@ -1,9 +0,0 @@ - $vendorDir . '/nikic/fast-route/src/functions.php', -); diff --git a/samples/server/petstore/php-slim/vendor/composer/autoload_namespaces.php b/samples/server/petstore/php-slim/vendor/composer/autoload_namespaces.php deleted file mode 100644 index c3cd02297dec..000000000000 --- a/samples/server/petstore/php-slim/vendor/composer/autoload_namespaces.php +++ /dev/null @@ -1,10 +0,0 @@ - array($vendorDir . '/pimple/pimple/src'), -); diff --git a/samples/server/petstore/php-slim/vendor/composer/autoload_psr4.php b/samples/server/petstore/php-slim/vendor/composer/autoload_psr4.php deleted file mode 100644 index 9c0b4719520a..000000000000 --- a/samples/server/petstore/php-slim/vendor/composer/autoload_psr4.php +++ /dev/null @@ -1,14 +0,0 @@ - array($vendorDir . '/slim/slim/Slim'), - 'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src'), - 'Psr\\Container\\' => array($vendorDir . '/psr/container/src'), - 'Interop\\Container\\' => array($vendorDir . '/container-interop/container-interop/src/Interop/Container'), - 'FastRoute\\' => array($vendorDir . '/nikic/fast-route/src'), -); diff --git a/samples/server/petstore/php-slim/vendor/composer/autoload_real.php b/samples/server/petstore/php-slim/vendor/composer/autoload_real.php deleted file mode 100644 index 2ebf2ad72869..000000000000 --- a/samples/server/petstore/php-slim/vendor/composer/autoload_real.php +++ /dev/null @@ -1,70 +0,0 @@ -= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); - if ($useStaticLoader) { - require_once __DIR__ . '/autoload_static.php'; - - call_user_func(\Composer\Autoload\ComposerStaticInit8ad75658dadd8f07df6a5456dd736c25::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\ComposerStaticInit8ad75658dadd8f07df6a5456dd736c25::$files; - } else { - $includeFiles = require __DIR__ . '/autoload_files.php'; - } - foreach ($includeFiles as $fileIdentifier => $file) { - composerRequire8ad75658dadd8f07df6a5456dd736c25($fileIdentifier, $file); - } - - return $loader; - } -} - -function composerRequire8ad75658dadd8f07df6a5456dd736c25($fileIdentifier, $file) -{ - if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { - require $file; - - $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; - } -} diff --git a/samples/server/petstore/php-slim/vendor/composer/installed.json b/samples/server/petstore/php-slim/vendor/composer/installed.json deleted file mode 100644 index f5c5dff605b8..000000000000 --- a/samples/server/petstore/php-slim/vendor/composer/installed.json +++ /dev/null @@ -1,311 +0,0 @@ -[ - { - "name": "container-interop/container-interop", - "version": "1.2.0", - "version_normalized": "1.2.0.0", - "source": { - "type": "git", - "url": "https://github.com/container-interop/container-interop.git", - "reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/container-interop/container-interop/zipball/79cbf1341c22ec75643d841642dd5d6acd83bdb8", - "reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8", - "shasum": "" - }, - "require": { - "psr/container": "^1.0" - }, - "time": "2017-02-14T19:40:03+00:00", - "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.)", - "homepage": "https://github.com/container-interop/container-interop" - }, - { - "name": "nikic/fast-route", - "version": "v1.3.0", - "version_normalized": "1.3.0.0", - "source": { - "type": "git", - "url": "https://github.com/nikic/FastRoute.git", - "reference": "181d480e08d9476e61381e04a71b34dc0432e812" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nikic/FastRoute/zipball/181d480e08d9476e61381e04a71b34dc0432e812", - "reference": "181d480e08d9476e61381e04a71b34dc0432e812", - "shasum": "" - }, - "require": { - "php": ">=5.4.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35|~5.7" - }, - "time": "2018-02-13T20:26:39+00:00", - "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": "pimple/pimple", - "version": "v3.2.3", - "version_normalized": "3.2.3.0", - "source": { - "type": "git", - "url": "https://github.com/silexphp/Pimple.git", - "reference": "9e403941ef9d65d20cba7d54e29fe906db42cf32" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/silexphp/Pimple/zipball/9e403941ef9d65d20cba7d54e29fe906db42cf32", - "reference": "9e403941ef9d65d20cba7d54e29fe906db42cf32", - "shasum": "" - }, - "require": { - "php": ">=5.3.0", - "psr/container": "^1.0" - }, - "require-dev": { - "symfony/phpunit-bridge": "^3.2" - }, - "time": "2018-01-21T07:42:36+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.2.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": "psr/container", - "version": "1.0.0", - "version_normalized": "1.0.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", - "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "time": "2017-02-14T16:28:37+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Psr\\Container\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", - "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" - ] - }, - { - "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-06T14:39:51+00:00", - "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": "slim/slim", - "version": "3.10.0", - "version_normalized": "3.10.0.0", - "source": { - "type": "git", - "url": "https://github.com/slimphp/Slim.git", - "reference": "d8aabeacc3688b25e2f2dd2db91df91ec6fdd748" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/slimphp/Slim/zipball/d8aabeacc3688b25e2f2dd2db91df91ec6fdd748", - "reference": "d8aabeacc3688b25e2f2dd2db91df91ec6fdd748", - "shasum": "" - }, - "require": { - "container-interop/container-interop": "^1.2", - "nikic/fast-route": "^1.0", - "php": ">=5.5.0", - "pimple/pimple": "^3.0", - "psr/container": "^1.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": "2018-04-19T19:29:08+00:00", - "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": "https://slimframework.com", - "keywords": [ - "api", - "framework", - "micro", - "router" - ] - } -] diff --git a/samples/server/petstore/php-slim/vendor/container-interop/container-interop/.gitignore b/samples/server/petstore/php-slim/vendor/container-interop/container-interop/.gitignore deleted file mode 100644 index b2395aa05541..000000000000 --- a/samples/server/petstore/php-slim/vendor/container-interop/container-interop/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -composer.lock -composer.phar -/vendor/ diff --git a/samples/server/petstore/php-slim/vendor/container-interop/container-interop/README.md b/samples/server/petstore/php-slim/vendor/container-interop/container-interop/README.md deleted file mode 100644 index cdd7a44c8ee8..000000000000 --- a/samples/server/petstore/php-slim/vendor/container-interop/container-interop/README.md +++ /dev/null @@ -1,148 +0,0 @@ -# Container Interoperability - -[![Latest Stable Version](https://poser.pugx.org/container-interop/container-interop/v/stable.png)](https://packagist.org/packages/container-interop/container-interop) -[![Total Downloads](https://poser.pugx.org/container-interop/container-interop/downloads.svg)](https://packagist.org/packages/container-interop/container-interop) - -## Deprecation warning! - -Starting Feb. 13th 2017, container-interop is officially deprecated in favor of [PSR-11](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-11-container.md). -Container-interop has been the test-bed of PSR-11. From v1.2, container-interop directly extends PSR-11 interfaces. -Therefore, all containers implementing container-interop are now *de-facto* compatible with PSR-11. - -- Projects implementing container-interop interfaces are encouraged to directly implement PSR-11 interfaces instead. -- Projects consuming container-interop interfaces are very strongly encouraged to directly type-hint on PSR-11 interfaces, in order to be compatible with PSR-11 containers that are not compatible with container-interop. - -Regarding the delegate lookup feature, that is present in container-interop and not in PSR-11, the feature is actually a design pattern. It is therefore not deprecated. Documentation regarding this design pattern will be migrated from this repository into a separate website in the future. - -## About - -*container-interop* tries to identify and standardize features in *container* objects (service locators, -dependency injection containers, etc.) to achieve interoperability. - -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 -composer require container-interop/container-interop -``` - -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): Adapters for - Aura.Di, Laravel, Nette DI, Pimple, Symfony DI, ZF2 Service manager, ZF2 - Dependency injection and any container using `ArrayAccess` -- [Aura.Di](https://github.com/auraphp/Aura.Di) -- [auryn-container-interop](https://github.com/elazar/auryn-container-interop) -- [Burlap](https://github.com/codeeverything/burlap) -- [Chernozem](https://github.com/pyrsmk/Chernozem) -- [Data Manager](https://github.com/chrismichaels84/data-manager) -- [Disco](https://github.com/bitexpert/disco) -- [InDI](https://github.com/idealogica/indi) -- [League/Container](http://container.thephpleague.com/) -- [Mouf](http://mouf-php.com) -- [Njasm Container](https://github.com/njasm/container) -- [PHP-DI](http://php-di.org) -- [Picotainer](https://github.com/thecodingmachine/picotainer) -- [PimpleInterop](https://github.com/moufmouf/pimple-interop) -- [Pimple3-ContainerInterop](https://github.com/Sam-Burns/pimple3-containerinterop) (using Pimple v3) -- [SitePoint Container](https://github.com/sitepoint/Container) -- [Thruster Container](https://github.com/ThrusterIO/container) (PHP7 only) -- [Ultra-Lite Container](https://github.com/ultra-lite/container) -- [Unbox](https://github.com/mindplay-dk/unbox) -- [XStatic](https://github.com/jeremeamia/xstatic) -- [Zend\ServiceManager](https://github.com/zendframework/zend-servicemanager) -- [Zit](https://github.com/inxilpro/Zit) - -### Projects implementing the *delegate lookup* feature - -- [Aura.Di](https://github.com/auraphp/Aura.Di) -- [Burlap](https://github.com/codeeverything/burlap) -- [Chernozem](https://github.com/pyrsmk/Chernozem) -- [InDI](https://github.com/idealogica/indi) -- [League/Container](http://container.thephpleague.com/) -- [Mouf](http://mouf-php.com) -- [Picotainer](https://github.com/thecodingmachine/picotainer) -- [PHP-DI](http://php-di.org) -- [PimpleInterop](https://github.com/moufmouf/pimple-interop) -- [Ultra-Lite Container](https://github.com/ultra-lite/container) - -### Middlewares implementing `ContainerInterface` - -- [Alias-Container](https://github.com/thecodingmachine/alias-container): add - aliases support to any container -- [Prefixer-Container](https://github.com/thecodingmachine/prefixer-container): - dynamically prefix identifiers -- [Lazy-Container](https://github.com/snapshotpl/lazy-container): lazy services - -### Projects using `ContainerInterface` - -The list below contains only a sample of all the projects consuming `ContainerInterface`. For a more complete list have a look [here](http://packanalyst.com/class?q=Interop%5CContainer%5CContainerInterface). - -| | Downloads | -| --- | --- | -| [Adroit](https://github.com/bitexpert/adroit) | ![](https://img.shields.io/packagist/dt/bitexpert/adroit.svg) | -| [Behat](https://github.com/Behat/Behat/pull/974) | ![](https://img.shields.io/packagist/dt/behat/behat.svg) | -| [blast-facades](https://github.com/phpthinktank/blast-facades): Minimize complexity and represent dependencies as facades. | ![](https://img.shields.io/packagist/dt/blast/facades.svg) | -| [interop.silex.di](https://github.com/thecodingmachine/interop.silex.di): an extension to [Silex](http://silex.sensiolabs.org/) that adds support for any *container-interop* compatible container | ![](https://img.shields.io/packagist/dt/mouf/interop.silex.di.svg) | -| [mindplay/walkway](https://github.com/mindplay-dk/walkway): a modular request router | ![](https://img.shields.io/packagist/dt/mindplay/walkway.svg) | -| [mindplay/middleman](https://github.com/mindplay-dk/middleman): minimalist PSR-7 middleware dispatcher | ![](https://img.shields.io/packagist/dt/mindplay/middleman.svg) | -| [PHP-DI/Invoker](https://github.com/PHP-DI/Invoker): extensible and configurable invoker/dispatcher | ![](https://img.shields.io/packagist/dt/php-di/invoker.svg) | -| [Prophiler](https://github.com/fabfuel/prophiler) | ![](https://img.shields.io/packagist/dt/fabfuel/prophiler.svg) | -| [Silly](https://github.com/mnapoli/silly): CLI micro-framework | ![](https://img.shields.io/packagist/dt/mnapoli/silly.svg) | -| [Slim v3](https://github.com/slimphp/Slim) | ![](https://img.shields.io/packagist/dt/slim/slim.svg) | -| [Splash](http://mouf-php.com/packages/mouf/mvc.splash-common/version/8.0-dev/README.md) | ![](https://img.shields.io/packagist/dt/mouf/mvc.splash-common.svg) | -| [Woohoo Labs. Harmony](https://github.com/woohoolabs/harmony): a flexible micro-framework | ![](https://img.shields.io/packagist/dt/woohoolabs/harmony.svg) | -| [zend-expressive](https://github.com/zendframework/zend-expressive) | ![](https://img.shields.io/packagist/dt/zendframework/zend-expressive.svg) | - - -## 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/samples/server/petstore/php-slim/vendor/container-interop/container-interop/composer.json b/samples/server/petstore/php-slim/vendor/container-interop/container-interop/composer.json deleted file mode 100644 index 855f766723a0..000000000000 --- a/samples/server/petstore/php-slim/vendor/container-interop/container-interop/composer.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "container-interop/container-interop", - "type": "library", - "description": "Promoting the interoperability of container objects (DIC, SL, etc.)", - "homepage": "https://github.com/container-interop/container-interop", - "license": "MIT", - "autoload": { - "psr-4": { - "Interop\\Container\\": "src/Interop/Container/" - } - }, - "require": { - "psr/container": "^1.0" - } -} diff --git a/samples/server/petstore/php-slim/vendor/container-interop/container-interop/docs/ContainerInterface-meta.md b/samples/server/petstore/php-slim/vendor/container-interop/container-interop/docs/ContainerInterface-meta.md deleted file mode 100644 index 59f3d5599faf..000000000000 --- a/samples/server/petstore/php-slim/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 have 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/samples/server/petstore/php-slim/vendor/container-interop/container-interop/docs/ContainerInterface.md b/samples/server/petstore/php-slim/vendor/container-interop/container-interop/docs/ContainerInterface.md deleted file mode 100644 index bda973d6fce1..000000000000 --- a/samples/server/petstore/php-slim/vendor/container-interop/container-interop/docs/ContainerInterface.md +++ /dev/null @@ -1,158 +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 dependency injection-related library or framework. -Users of dependency injections containers (DIC) are referred 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. - `has($id)` returning true does not mean that `get($id)` will not throw an exception. - It does however mean that `get($id)` will not throw a `NotFoundException`. - -### 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 -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/samples/server/petstore/php-slim/vendor/container-interop/container-interop/docs/Delegate-lookup.md b/samples/server/petstore/php-slim/vendor/container-interop/container-interop/docs/Delegate-lookup.md deleted file mode 100644 index f64a8f785a84..000000000000 --- a/samples/server/petstore/php-slim/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 referred 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/samples/server/petstore/php-slim/vendor/container-interop/container-interop/docs/images/interoperating_containers.png b/samples/server/petstore/php-slim/vendor/container-interop/container-interop/docs/images/interoperating_containers.png deleted file mode 100644 index 1d3fdd0ddbea28d77c08cfb65834ec11357be5fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25738 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 lDg62tY5@ou6EsiaCMAN!E;xV!uGoVl#pK=; - } - - 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, - ?'dataGenerator' => classname, - ?'dispatcher' => classname, - ?'routeCollector' => classname, - ) $options = shape()): Dispatcher; - - function cachedDispatcher( - (function(RouteCollector): void) $routeDefinitionCallback, - shape( - ?'routeParser' => classname, - ?'dataGenerator' => classname, - ?'dispatcher' => classname, - ?'routeCollector' => classname, - ?'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 $regexToRoutesMap): array; - } - - class GroupCountBased extends RegexBasedAbstract { - protected function getApproxChunkSize(): int; - protected function processChunk(array $regexToRoutesMap): array; - } - - class GroupPosBased extends RegexBasedAbstract { - protected function getApproxChunkSize(): int; - protected function processChunk(array $regexToRoutesMap): array; - } - - class MarkBased extends RegexBasedAbstract { - protected function getApproxChunkSize(): int; - protected function processChunk(array $regexToRoutesMap): array; - } -} - -namespace FastRoute\Dispatcher { - abstract class RegexBasedAbstract implements \FastRoute\Dispatcher { - protected abstract function dispatchVariableRoute(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 $routeData, string $uri): array; - } - - class GroupCountBased extends RegexBasedAbstract { - public function __construct(array $data); - protected function dispatchVariableRoute(array $routeData, string $uri): array; - } - - class CharCountBased extends RegexBasedAbstract { - public function __construct(array $data); - protected function dispatchVariableRoute(array $routeData, string $uri): array; - } - - class MarkBased extends RegexBasedAbstract { - public function __construct(array $data); - protected function dispatchVariableRoute(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; - } -} diff --git a/samples/server/petstore/php-slim/vendor/nikic/fast-route/README.md b/samples/server/petstore/php-slim/vendor/nikic/fast-route/README.md deleted file mode 100644 index 91bd4664e031..000000000000 --- a/samples/server/petstore/php-slim/vendor/nikic/fast-route/README.md +++ /dev/null @@ -1,313 +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 -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. - -#### Shorcut methods for common request methods - -For the `GET`, `POST`, `PUT`, `PATCH`, `DELETE` and `HEAD` request methods shortcut methods are available. For example: - -```php -$r->get('/get-route', 'get_handler'); -$r->post('/post-route', 'post_handler'); -``` - -Is equivalent to: - -```php -$r->addRoute('GET', '/get-route', 'get_handler'); -$r->addRoute('POST', '/post-route', 'post_handler'); -``` - -#### Route Groups - -Additionally, you can specify routes inside of a group. All routes defined inside a group will have a common prefix. - -For example, defining your routes as: - -```php -$r->addGroup('/admin', function (RouteCollector $r) { - $r->addRoute('GET', '/do-something', 'handler'); - $r->addRoute('GET', '/do-another-thing', 'handler'); - $r->addRoute('GET', '/do-something-else', 'handler'); -}); -``` - -Will have the same result as: - - ```php -$r->addRoute('GET', '/admin/do-something', 'handler'); -$r->addRoute('GET', '/admin/do-another-thing', 'handler'); -$r->addRoute('GET', '/admin/do-something-else', 'handler'); - ``` - -Nested groups are also supported, in which case the prefixes of all the nested groups are combined. - -### 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 -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 - '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/samples/server/petstore/php-slim/vendor/nikic/fast-route/composer.json b/samples/server/petstore/php-slim/vendor/nikic/fast-route/composer.json deleted file mode 100644 index fb446a2abfbc..000000000000 --- a/samples/server/petstore/php-slim/vendor/nikic/fast-route/composer.json +++ /dev/null @@ -1,24 +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" - } - ], - "autoload": { - "psr-4": { - "FastRoute\\": "src/" - }, - "files": ["src/functions.php"] - }, - "require": { - "php": ">=5.4.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35|~5.7" - } -} diff --git a/samples/server/petstore/php-slim/vendor/nikic/fast-route/phpunit.xml b/samples/server/petstore/php-slim/vendor/nikic/fast-route/phpunit.xml deleted file mode 100644 index 3c807b6acbcd..000000000000 --- a/samples/server/petstore/php-slim/vendor/nikic/fast-route/phpunit.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - ./test/ - - - - - - ./src/ - - - diff --git a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/BadRouteException.php b/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/BadRouteException.php deleted file mode 100644 index 62262ec66f66..000000000000 --- a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/BadRouteException.php +++ /dev/null @@ -1,7 +0,0 @@ - $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/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/DataGenerator/GroupCountBased.php b/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/DataGenerator/GroupCountBased.php deleted file mode 100644 index 54d9a05e20b6..000000000000 --- a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/DataGenerator/GroupCountBased.php +++ /dev/null @@ -1,30 +0,0 @@ - $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/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/DataGenerator/GroupPosBased.php b/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/DataGenerator/GroupPosBased.php deleted file mode 100644 index fc4dc0aff639..000000000000 --- a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/DataGenerator/GroupPosBased.php +++ /dev/null @@ -1,27 +0,0 @@ - $route) { - $regexes[] = $regex; - $routeMap[$offset] = [$route->handler, $route->variables]; - - $offset += count($route->variables); - } - - $regex = '~^(?:' . implode('|', $regexes) . ')$~'; - return ['regex' => $regex, 'routeMap' => $routeMap]; - } -} diff --git a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/DataGenerator/MarkBased.php b/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/DataGenerator/MarkBased.php deleted file mode 100644 index 0aebed9a1614..000000000000 --- a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/DataGenerator/MarkBased.php +++ /dev/null @@ -1,27 +0,0 @@ - $route) { - $regexes[] = $regex . '(*MARK:' . $markName . ')'; - $routeMap[$markName] = [$route->handler, $route->variables]; - - ++$markName; - } - - $regex = '~^(?|' . implode('|', $regexes) . ')$~'; - return ['regex' => $regex, 'routeMap' => $routeMap]; - } -} diff --git a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php b/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php deleted file mode 100644 index 645729059925..000000000000 --- a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php +++ /dev/null @@ -1,186 +0,0 @@ -isStaticRoute($routeData)) { - $this->addStaticRoute($httpMethod, $routeData, $handler); - } else { - $this->addVariableRoute($httpMethod, $routeData, $handler); - } - } - - /** - * @return mixed[] - */ - public function getData() - { - if (empty($this->methodToRegexToRoutesMap)) { - return [$this->staticRoutes, []]; - } - - return [$this->staticRoutes, $this->generateVariableRouteData()]; - } - - /** - * @return mixed[] - */ - 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; - } - - /** - * @param int - * @return int - */ - private function computeChunkSize($count) - { - $numParts = max(1, round($count / $this->getApproxChunkSize())); - return (int) ceil($count / $numParts); - } - - /** - * @param mixed[] - * @return bool - */ - 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 - ); - } - - /** - * @param mixed[] - * @return mixed[] - */ - 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]; - } - - /** - * @param string - * @return bool - */ - 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 (bool) preg_match( - '~ - (?: - \(\?\( - | \[ [^\]\\\\]* (?: \\\\ . [^\]\\\\]* )* \] - | \\\\ . - ) (*SKIP)(*FAIL) | - \( - (?! - \? (?! <(?![!=]) | P< | \' ) - | \* - ) - ~x', - $regex - ); - } -} diff --git a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Dispatcher.php b/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Dispatcher.php deleted file mode 100644 index 4ae72a356b65..000000000000 --- a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Dispatcher.php +++ /dev/null @@ -1,26 +0,0 @@ - 'value', ...]] - * - * @param string $httpMethod - * @param string $uri - * - * @return array - */ - public function dispatch($httpMethod, $uri); -} diff --git a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Dispatcher/CharCountBased.php b/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Dispatcher/CharCountBased.php deleted file mode 100644 index ef1eec1345ea..000000000000 --- a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Dispatcher/CharCountBased.php +++ /dev/null @@ -1,31 +0,0 @@ -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/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Dispatcher/GroupCountBased.php b/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Dispatcher/GroupCountBased.php deleted file mode 100644 index 493e7a94f08f..000000000000 --- a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Dispatcher/GroupCountBased.php +++ /dev/null @@ -1,31 +0,0 @@ -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/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Dispatcher/GroupPosBased.php b/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Dispatcher/GroupPosBased.php deleted file mode 100644 index 498220ed6f7c..000000000000 --- a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Dispatcher/GroupPosBased.php +++ /dev/null @@ -1,33 +0,0 @@ -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/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Dispatcher/MarkBased.php b/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Dispatcher/MarkBased.php deleted file mode 100644 index 22eb09ba575f..000000000000 --- a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Dispatcher/MarkBased.php +++ /dev/null @@ -1,31 +0,0 @@ -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/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Dispatcher/RegexBasedAbstract.php b/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Dispatcher/RegexBasedAbstract.php deleted file mode 100644 index 206e879f7b25..000000000000 --- a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Dispatcher/RegexBasedAbstract.php +++ /dev/null @@ -1,88 +0,0 @@ -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]; - } - - return [self::NOT_FOUND]; - } -} diff --git a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Route.php b/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Route.php deleted file mode 100644 index e1bf7dd97222..000000000000 --- a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/Route.php +++ /dev/null @@ -1,47 +0,0 @@ -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/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/RouteCollector.php b/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/RouteCollector.php deleted file mode 100644 index c1c1762d8d3a..000000000000 --- a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/RouteCollector.php +++ /dev/null @@ -1,152 +0,0 @@ -routeParser = $routeParser; - $this->dataGenerator = $dataGenerator; - $this->currentGroupPrefix = ''; - } - - /** - * 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) - { - $route = $this->currentGroupPrefix . $route; - $routeDatas = $this->routeParser->parse($route); - foreach ((array) $httpMethod as $method) { - foreach ($routeDatas as $routeData) { - $this->dataGenerator->addRoute($method, $routeData, $handler); - } - } - } - - /** - * Create a route group with a common prefix. - * - * All routes created in the passed callback will have the given group prefix prepended. - * - * @param string $prefix - * @param callable $callback - */ - public function addGroup($prefix, callable $callback) - { - $previousGroupPrefix = $this->currentGroupPrefix; - $this->currentGroupPrefix = $previousGroupPrefix . $prefix; - $callback($this); - $this->currentGroupPrefix = $previousGroupPrefix; - } - - /** - * Adds a GET route to the collection - * - * This is simply an alias of $this->addRoute('GET', $route, $handler) - * - * @param string $route - * @param mixed $handler - */ - public function get($route, $handler) - { - $this->addRoute('GET', $route, $handler); - } - - /** - * Adds a POST route to the collection - * - * This is simply an alias of $this->addRoute('POST', $route, $handler) - * - * @param string $route - * @param mixed $handler - */ - public function post($route, $handler) - { - $this->addRoute('POST', $route, $handler); - } - - /** - * Adds a PUT route to the collection - * - * This is simply an alias of $this->addRoute('PUT', $route, $handler) - * - * @param string $route - * @param mixed $handler - */ - public function put($route, $handler) - { - $this->addRoute('PUT', $route, $handler); - } - - /** - * Adds a DELETE route to the collection - * - * This is simply an alias of $this->addRoute('DELETE', $route, $handler) - * - * @param string $route - * @param mixed $handler - */ - public function delete($route, $handler) - { - $this->addRoute('DELETE', $route, $handler); - } - - /** - * Adds a PATCH route to the collection - * - * This is simply an alias of $this->addRoute('PATCH', $route, $handler) - * - * @param string $route - * @param mixed $handler - */ - public function patch($route, $handler) - { - $this->addRoute('PATCH', $route, $handler); - } - - /** - * Adds a HEAD route to the collection - * - * This is simply an alias of $this->addRoute('HEAD', $route, $handler) - * - * @param string $route - * @param mixed $handler - */ - public function head($route, $handler) - { - $this->addRoute('HEAD', $route, $handler); - } - - /** - * Returns the collected route data, as provided by the data generator. - * - * @return array - */ - public function getData() - { - return $this->dataGenerator->getData(); - } -} diff --git a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/RouteParser.php b/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/RouteParser.php deleted file mode 100644 index 6a7685cfed6c..000000000000 --- a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/RouteParser.php +++ /dev/null @@ -1,37 +0,0 @@ - $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. - * - * @param string - * @return mixed[] - */ - 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/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/bootstrap.php b/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/bootstrap.php deleted file mode 100644 index 0bce3a42071f..000000000000 --- a/samples/server/petstore/php-slim/vendor/nikic/fast-route/src/bootstrap.php +++ /dev/null @@ -1,12 +0,0 @@ - '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(); - if (!$options['cacheDisabled']) { - file_put_contents( - $options['cacheFile'], - ' $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->assertArrayNotHasKey(1, $routeInfo, - '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->assertArrayHasKey(1, $routeInfo, - '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]; - - // 17 ---- - - $callback = function (RouteCollector $r) { - $r->addRoute('POST', '/user.json', 'handler0'); - $r->addRoute('GET', '/{entity}.json', 'handler1'); - }; - - $cases[] = ['GET', '/user.json', $callback, 'handler1', ['entity' => 'user']]; - - // 18 ---- - - $callback = function (RouteCollector $r) { - $r->addRoute('GET', '', 'handler0'); - }; - - $cases[] = ['GET', '', $callback, 'handler0', []]; - - // 19 ---- - - $callback = function (RouteCollector $r) { - $r->addRoute('HEAD', '/a/{foo}', 'handler0'); - $r->addRoute('GET', '/b/{foo}', 'handler1'); - }; - - $cases[] = ['HEAD', '/b/bar', $callback, 'handler1', ['foo' => 'bar']]; - - // 20 ---- - - $callback = function (RouteCollector $r) { - $r->addRoute('HEAD', '/a', 'handler0'); - $r->addRoute('GET', '/b', 'handler1'); - }; - - $cases[] = ['HEAD', '/b', $callback, 'handler1', []]; - - // 21 ---- - - $callback = function (RouteCollector $r) { - $r->addRoute('GET', '/foo', 'handler0'); - $r->addRoute('HEAD', '/{bar}', 'handler1'); - }; - - $cases[] = ['HEAD', '/foo', $callback, 'handler1', ['bar' => 'foo']]; - - // 22 ---- - - $callback = function (RouteCollector $r) { - $r->addRoute('*', '/user', 'handler0'); - $r->addRoute('*', '/{user}', 'handler1'); - $r->addRoute('GET', '/user', 'handler2'); - }; - - $cases[] = ['GET', '/user', $callback, 'handler2', []]; - - // 23 ---- - - $callback = function (RouteCollector $r) { - $r->addRoute('*', '/user', 'handler0'); - $r->addRoute('GET', '/user', 'handler1'); - }; - - $cases[] = ['POST', '/user', $callback, 'handler0', []]; - - // 24 ---- - - $cases[] = ['HEAD', '/user', $callback, 'handler1', []]; - - // 25 ---- - - $callback = function (RouteCollector $r) { - $r->addRoute('GET', '/{bar}', 'handler0'); - $r->addRoute('*', '/foo', 'handler1'); - }; - - $cases[] = ['GET', '/foo', $callback, 'handler0', ['bar' => 'foo']]; - - // 26 ---- - - $callback = function(RouteCollector $r) { - $r->addRoute('GET', '/user', 'handler0'); - $r->addRoute('*', '/{foo:.*}', 'handler1'); - }; - - $cases[] = ['POST', '/bar', $callback, 'handler1', ['foo' => 'bar']]; - - // 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[] = [$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/samples/server/petstore/php-slim/vendor/nikic/fast-route/test/Dispatcher/GroupCountBasedTest.php b/samples/server/petstore/php-slim/vendor/nikic/fast-route/test/Dispatcher/GroupCountBasedTest.php deleted file mode 100644 index f821ef56b93f..000000000000 --- a/samples/server/petstore/php-slim/vendor/nikic/fast-route/test/Dispatcher/GroupCountBasedTest.php +++ /dev/null @@ -1,16 +0,0 @@ -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/samples/server/petstore/php-slim/vendor/nikic/fast-route/test/HackTypechecker/HackTypecheckerTest.php b/samples/server/petstore/php-slim/vendor/nikic/fast-route/test/HackTypechecker/HackTypecheckerTest.php deleted file mode 100644 index b6fc53f7702a..000000000000 --- a/samples/server/petstore/php-slim/vendor/nikic/fast-route/test/HackTypechecker/HackTypecheckerTest.php +++ /dev/null @@ -1,44 +0,0 @@ -markTestSkipped('HHVM only'); - } - if (!version_compare(HHVM_VERSION, '3.9.0', '>=')) { - $this->markTestSkipped('classname requires HHVM 3.9+'); - } - - // The typechecker recurses the whole tree, so it makes sure - // that everything in fixtures/ is valid when this runs. - - $output = []; - $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/samples/server/petstore/php-slim/vendor/nikic/fast-route/test/HackTypechecker/fixtures/all_options.php b/samples/server/petstore/php-slim/vendor/nikic/fast-route/test/HackTypechecker/fixtures/all_options.php deleted file mode 100644 index 05a9af231b4a..000000000000 --- a/samples/server/petstore/php-slim/vendor/nikic/fast-route/test/HackTypechecker/fixtures/all_options.php +++ /dev/null @@ -1,29 +0,0 @@ - {}, - 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/samples/server/petstore/php-slim/vendor/nikic/fast-route/test/HackTypechecker/fixtures/empty_options.php b/samples/server/petstore/php-slim/vendor/nikic/fast-route/test/HackTypechecker/fixtures/empty_options.php deleted file mode 100644 index 61eb54190d9e..000000000000 --- a/samples/server/petstore/php-slim/vendor/nikic/fast-route/test/HackTypechecker/fixtures/empty_options.php +++ /dev/null @@ -1,11 +0,0 @@ - {}, shape()); -} - -function empty_options_cached(): \FastRoute\Dispatcher { - return \FastRoute\cachedDispatcher($collector ==> {}, shape()); -} diff --git a/samples/server/petstore/php-slim/vendor/nikic/fast-route/test/HackTypechecker/fixtures/no_options.php b/samples/server/petstore/php-slim/vendor/nikic/fast-route/test/HackTypechecker/fixtures/no_options.php deleted file mode 100644 index 44b5422f583e..000000000000 --- a/samples/server/petstore/php-slim/vendor/nikic/fast-route/test/HackTypechecker/fixtures/no_options.php +++ /dev/null @@ -1,11 +0,0 @@ - {}); -} - -function no_options_cached(): \FastRoute\Dispatcher { - return \FastRoute\cachedDispatcher($collector ==> {}); -} diff --git a/samples/server/petstore/php-slim/vendor/nikic/fast-route/test/RouteParser/StdTest.php b/samples/server/petstore/php-slim/vendor/nikic/fast-route/test/RouteParser/StdTest.php deleted file mode 100644 index e13e4de61718..000000000000 --- a/samples/server/petstore/php-slim/vendor/nikic/fast-route/test/RouteParser/StdTest.php +++ /dev/null @@ -1,154 +0,0 @@ -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/samples/server/petstore/php-slim/vendor/nikic/fast-route/test/bootstrap.php b/samples/server/petstore/php-slim/vendor/nikic/fast-route/test/bootstrap.php deleted file mode 100644 index 3023f41e4659..000000000000 --- a/samples/server/petstore/php-slim/vendor/nikic/fast-route/test/bootstrap.php +++ /dev/null @@ -1,11 +0,0 @@ -> `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 - - if [ "$PIMPLE_EXT" == "yes" ]; then export SYMFONY_DEPRECATIONS_HELPER=weak; fi - - cd ../.. - - ./vendor/bin/simple-phpunit - -matrix: - include: - - php: hhvm - dist: trusty - env: PIMPLE_EXT=no - exclude: - - php: 7.0 - env: PIMPLE_EXT=yes - - php: 7.1 - env: PIMPLE_EXT=yes diff --git a/samples/server/petstore/php-slim/vendor/pimple/pimple/CHANGELOG b/samples/server/petstore/php-slim/vendor/pimple/pimple/CHANGELOG deleted file mode 100644 index ba56760c1f59..000000000000 --- a/samples/server/petstore/php-slim/vendor/pimple/pimple/CHANGELOG +++ /dev/null @@ -1,59 +0,0 @@ -* 3.2.3 (2017-XX-XX) - - * n/a - -* 3.2.2 (2017-07-23) - - * reverted extending a protected closure throws an exception (deprecated it instead) - -* 3.2.1 (2017-07-17) - - * fixed PHP error - -* 3.2.0 (2017-07-17) - - * added a PSR-11 service locator - * added a PSR-11 wrapper - * added ServiceIterator - * fixed extending a protected closure (now throws InvalidServiceIdentifierException) - -* 3.1.0 (2017-07-03) - - * deprecated the C extension - * added support for PSR-11 exceptions - -* 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/samples/server/petstore/php-slim/vendor/pimple/pimple/README.rst b/samples/server/petstore/php-slim/vendor/pimple/pimple/README.rst deleted file mode 100644 index a03b6d3a4992..000000000000 --- a/samples/server/petstore/php-slim/vendor/pimple/pimple/README.rst +++ /dev/null @@ -1,326 +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" - -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 -``cookie_name`` 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'); - -PSR-11 compatibility --------------------- - -For historical reasons, the ``Container`` class does not implement the PSR-11 -``ContainerInterface``. However, Pimple provides a helper class that will let -you decouple your code from the Pimple container class. - -The PSR-11 container class -~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The ``Pimple\Psr11\Container`` class lets you access the content of an -underlying Pimple container using ``Psr\Container\ContainerInterface`` -methods: - -.. code-block:: php - - use Pimple\Container; - use Pimple\Psr11\Container as PsrContainer; - - $container = new Container(); - $container['service'] = function ($c) { - return new Service(); - }; - $psr11 = new PsrContainer($container); - - $controller = function (PsrContainer $container) { - $service = $container->get('service'); - }; - $controller($psr11); - -Using the PSR-11 ServiceLocator -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Sometimes, a service needs access to several other services without being sure -that all of them will actually be used. In those cases, you may want the -instantiation of the services to be lazy. - -The traditional solution is to inject the entire service container to get only -the services really needed. However, this is not recommended because it gives -services a too broad access to the rest of the application and it hides their -actual dependencies. - -The ``ServiceLocator`` is intended to solve this problem by giving access to a -set of predefined services while instantiating them only when actually needed. - -It also allows you to make your services available under a different name than -the one used to register them. For instance, you may want to use an object -that expects an instance of ``EventDispatcherInterface`` to be available under -the name ``event_dispatcher`` while your event dispatcher has been -registered under the name ``dispatcher``: - -.. code-block:: php - - use Monolog\Logger; - use Pimple\Psr11\ServiceLocator; - use Psr\Container\ContainerInterface; - use Symfony\Component\EventDispatcher\EventDispatcher; - - class MyService - { - /** - * "logger" must be an instance of Psr\Log\LoggerInterface - * "event_dispatcher" must be an instance of Symfony\Component\EventDispatcher\EventDispatcherInterface - */ - private $services; - - public function __construct(ContainerInterface $services) - { - $this->services = $services; - } - } - - $container['logger'] = function ($c) { - return new Monolog\Logger(); - }; - $container['dispatcher'] = function () { - return new EventDispatcher(); - }; - - $container['service'] = function ($c) { - $locator = new ServiceLocator($c, array('logger', 'event_dispatcher' => 'dispatcher')); - - return new MyService($locator); - }; - -Referencing a Collection of Services Lazily -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Passing a collection of services instances in an array may prove inefficient -if the class that consumes the collection only needs to iterate over it at a -later stage, when one of its method is called. It can also lead to problems -if there is a circular dependency between one of the services stored in the -collection and the class that consumes it. - -The ``ServiceIterator`` class helps you solve these issues. It receives a -list of service names during instantiation and will retrieve the services -when iterated over: - -.. code-block:: php - - use Pimple\Container; - use Pimple\ServiceIterator; - - class AuthorizationService - { - private $voters; - - public function __construct($voters) - { - $this->voters = $voters; - } - - public function canAccess($resource) - { - foreach ($this->voters as $voter) { - if (true === $voter->canAccess($resource) { - return true; - } - } - - return false; - } - } - - $container = new Container(); - - $container['voter1'] = function ($c) { - return new SomeVoter(); - } - $container['voter2'] = function ($c) { - return new SomeOtherVoter($c['auth']); - } - $container['auth'] = function ($c) { - return new AuthorizationService(new ServiceIterator($c, array('voter1', 'voter2')); - } - -.. _Pimple 1.x documentation: https://github.com/silexphp/Pimple/tree/1.1 diff --git a/samples/server/petstore/php-slim/vendor/pimple/pimple/composer.json b/samples/server/petstore/php-slim/vendor/pimple/pimple/composer.json deleted file mode 100644 index dabf190a9ade..000000000000 --- a/samples/server/petstore/php-slim/vendor/pimple/pimple/composer.json +++ /dev/null @@ -1,29 +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", - "psr/container": "^1.0" - }, - "require-dev": { - "symfony/phpunit-bridge": "^3.2" - }, - "autoload": { - "psr-0": { "Pimple": "src/" } - }, - "extra": { - "branch-alias": { - "dev-master": "3.2.x-dev" - } - } -} diff --git a/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/.gitignore b/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/.gitignore deleted file mode 100644 index 1861088ac1f6..000000000000 --- a/samples/server/petstore/php-slim/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/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/README.md b/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/README.md deleted file mode 100644 index 7b39eb2929ea..000000000000 --- a/samples/server/petstore/php-slim/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/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/config.m4 b/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/config.m4 deleted file mode 100644 index 3a6e9aaeb158..000000000000 --- a/samples/server/petstore/php-slim/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/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/config.w32 b/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/config.w32 deleted file mode 100644 index 39857b3254be..000000000000 --- a/samples/server/petstore/php-slim/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/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/php_pimple.h b/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/php_pimple.h deleted file mode 100644 index eed7c1731d48..000000000000 --- a/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/php_pimple.h +++ /dev/null @@ -1,137 +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.2.3-DEV" - -#define PIMPLE_NS "Pimple" -#define PSR_CONTAINER_NS "Psr\\Container" -#define PIMPLE_EXCEPTION_NS "Pimple\\Exception" - -#define PIMPLE_DEFAULT_ZVAL_CACHE_NUM 5 -#define PIMPLE_DEFAULT_ZVAL_VALUES_NUM 10 - -#define PIMPLE_DEPRECATE do { \ - int er = EG(error_reporting); \ - EG(error_reporting) = 0;\ - php_error(E_DEPRECATED, "The Pimple C extension is deprecated since version 3.1 and will be removed in 4.0."); \ - EG(error_reporting) = er; \ -} while (0); - -zend_module_entry *get_module(void); - -PHP_MINIT_FUNCTION(pimple); -PHP_MINFO_FUNCTION(pimple); - -PHP_METHOD(FrozenServiceException, __construct); -PHP_METHOD(InvalidServiceIdentifierException, __construct); -PHP_METHOD(UnknownIdentifierException, __construct); - -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[] = ""; - -static void pimple_exception_call_parent_constructor(zval *this_ptr, const char *format, const char *arg1 TSRMLS_DC); - -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/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/pimple.c b/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/pimple.c deleted file mode 100644 index c80499b39956..000000000000 --- a/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/pimple.c +++ /dev/null @@ -1,1114 +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_PsrContainerInterface; -static zend_class_entry *pimple_ce_PsrContainerExceptionInterface; -static zend_class_entry *pimple_ce_PsrNotFoundExceptionInterface; - -static zend_class_entry *pimple_ce_ExpectedInvokableException; -static zend_class_entry *pimple_ce_FrozenServiceException; -static zend_class_entry *pimple_ce_InvalidServiceIdentifierException; -static zend_class_entry *pimple_ce_UnknownIdentifierException; - -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); - - -/* Psr\Container\ContainerInterface */ -ZEND_BEGIN_ARG_INFO_EX(arginfo_pimple_PsrContainerInterface_get, 0, 0, 1) -ZEND_ARG_INFO(0, id) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_pimple_PsrContainerInterface_has, 0, 0, 1) -ZEND_ARG_INFO(0, id) -ZEND_END_ARG_INFO() - -static const zend_function_entry pimple_ce_PsrContainerInterface_functions[] = { - PHP_ABSTRACT_ME(ContainerInterface, get, arginfo_pimple_PsrContainerInterface_get) - PHP_ABSTRACT_ME(ContainerInterface, has, arginfo_pimple_PsrContainerInterface_has) - PHP_FE_END -}; - -/* Psr\Container\ContainerExceptionInterface */ -static const zend_function_entry pimple_ce_PsrContainerExceptionInterface_functions[] = { - PHP_FE_END -}; - -/* Psr\Container\NotFoundExceptionInterface */ -static const zend_function_entry pimple_ce_PsrNotFoundExceptionInterface_functions[] = { - PHP_FE_END -}; - -/* Pimple\Exception\FrozenServiceException */ -ZEND_BEGIN_ARG_INFO_EX(arginfo_FrozenServiceException___construct, 0, 0, 1) -ZEND_ARG_INFO(0, id) -ZEND_END_ARG_INFO() - -static const zend_function_entry pimple_ce_FrozenServiceException_functions[] = { - PHP_ME(FrozenServiceException, __construct, arginfo_FrozenServiceException___construct, ZEND_ACC_PUBLIC) - PHP_FE_END -}; - -/* Pimple\Exception\InvalidServiceIdentifierException */ -ZEND_BEGIN_ARG_INFO_EX(arginfo_InvalidServiceIdentifierException___construct, 0, 0, 1) -ZEND_ARG_INFO(0, id) -ZEND_END_ARG_INFO() - -static const zend_function_entry pimple_ce_InvalidServiceIdentifierException_functions[] = { - PHP_ME(InvalidServiceIdentifierException, __construct, arginfo_InvalidServiceIdentifierException___construct, ZEND_ACC_PUBLIC) - PHP_FE_END -}; - -/* Pimple\Exception\UnknownIdentifierException */ -ZEND_BEGIN_ARG_INFO_EX(arginfo_UnknownIdentifierException___construct, 0, 0, 1) -ZEND_ARG_INFO(0, id) -ZEND_END_ARG_INFO() - -static const zend_function_entry pimple_ce_UnknownIdentifierException_functions[] = { - PHP_ME(UnknownIdentifierException, __construct, arginfo_UnknownIdentifierException___construct, ZEND_ACC_PUBLIC) - PHP_FE_END -}; - -/* Pimple\Container */ -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() - -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 -}; - -/* Pimple\ServiceProviderInterface */ -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_serviceprovider_iface_ce_functions[] = { - PHP_ABSTRACT_ME(ServiceProviderInterface, register, arginfo_serviceprovider_register) - PHP_FE_END -}; - -/* parent::__construct(sprintf("Something with %s", $arg1)) */ -static void pimple_exception_call_parent_constructor(zval *this_ptr, const char *format, const char *arg1 TSRMLS_DC) -{ - zend_class_entry *ce = Z_OBJCE_P(this_ptr); - char *message = NULL; - int message_len; - zval *constructor_arg; - - message_len = spprintf(&message, 0, format, arg1); - ALLOC_INIT_ZVAL(constructor_arg); - ZVAL_STRINGL(constructor_arg, message, message_len, 1); - - zend_call_method_with_1_params(&this_ptr, ce, &ce->parent->constructor, "__construct", NULL, constructor_arg); - - efree(message); - zval_ptr_dtor(&constructor_arg); -} - -/** - * Pass a single string parameter to exception constructor and throw - */ -static void pimple_throw_exception_string(zend_class_entry *ce, const char *message, zend_uint message_len TSRMLS_DC) -{ - zval *exception, *param; - - ALLOC_INIT_ZVAL(exception); - object_init_ex(exception, ce); - - ALLOC_INIT_ZVAL(param); - ZVAL_STRINGL(param, message, message_len, 1); - - zend_call_method_with_1_params(&exception, ce, &ce->constructor, "__construct", NULL, param); - - zend_throw_exception_object(exception TSRMLS_CC); - - zval_ptr_dtor(¶m); -} - -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); - pimple_throw_exception_string(pimple_ce_FrozenServiceException, Z_STRVAL_P(offset), Z_STRLEN_P(offset) TSRMLS_CC); - 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); - convert_to_string(offset); - pimple_throw_exception_string(pimple_ce_FrozenServiceException, Z_STRVAL_P(offset), Z_STRLEN_P(offset) TSRMLS_CC); - 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) { - pimple_throw_exception_string(pimple_ce_UnknownIdentifierException, Z_STRVAL_P(offset), Z_STRLEN_P(offset) TSRMLS_CC); - - 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 every time 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(FrozenServiceException, __construct) -{ - char *id = NULL; - int id_len; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &id, &id_len) == FAILURE) { - return; - } - pimple_exception_call_parent_constructor(getThis(), "Cannot override frozen service \"%s\".", id TSRMLS_CC); -} - -PHP_METHOD(InvalidServiceIdentifierException, __construct) -{ - char *id = NULL; - int id_len; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &id, &id_len) == FAILURE) { - return; - } - pimple_exception_call_parent_constructor(getThis(), "Identifier \"%s\" does not contain an object definition.", id TSRMLS_CC); -} - -PHP_METHOD(UnknownIdentifierException, __construct) -{ - char *id = NULL; - int id_len; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &id, &id_len) == FAILURE) { - return; - } - pimple_exception_call_parent_constructor(getThis(), "Identifier \"%s\" is not defined.", id TSRMLS_CC); -} - -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(pimple_ce_ExpectedInvokableException, "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) { - pimple_throw_exception_string(pimple_ce_UnknownIdentifierException, Z_STRVAL_P(offset), Z_STRLEN_P(offset) TSRMLS_CC); - 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) { - pimple_throw_exception_string(pimple_ce_UnknownIdentifierException, Z_STRVAL_P(offset), Z_STRLEN_P(offset) TSRMLS_CC); - RETURN_NULL(); - } - - if (value->type != PIMPLE_IS_SERVICE) { - pimple_throw_exception_string(pimple_ce_InvalidServiceIdentifierException, Z_STRVAL_P(offset), Z_STRLEN_P(offset) TSRMLS_CC); - RETURN_NULL(); - } - if (zend_hash_index_exists(&pobj->protected, value->handle_num)) { - int er = EG(error_reporting); - EG(error_reporting) = 0; - php_error(E_DEPRECATED, "How Pimple behaves when extending protected closures will be fixed in Pimple 4. Are you sure \"%s\" should be protected?", Z_STRVAL_P(offset)); - EG(error_reporting) = er; - } - 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) { - convert_to_string(offset); - pimple_throw_exception_string(pimple_ce_UnknownIdentifierException, Z_STRVAL_P(offset), Z_STRLEN_P(offset) TSRMLS_CC); - RETURN_NULL(); - } - if (value->type != PIMPLE_IS_SERVICE) { - convert_to_string(offset); - pimple_throw_exception_string(pimple_ce_InvalidServiceIdentifierException, Z_STRVAL_P(offset), Z_STRLEN_P(offset) TSRMLS_CC); - RETURN_NULL(); - } - if (zend_hash_index_exists(&pobj->protected, value->handle_num)) { - int er = EG(error_reporting); - EG(error_reporting) = 0; - php_error(E_DEPRECATED, "How Pimple behaves when extending protected closures will be fixed in Pimple 4. Are you sure \"%ld\" should be protected?", index); - EG(error_reporting) = er; - } - 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(pimple_ce_ExpectedInvokableException, "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(pimple_ce_ExpectedInvokableException, "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) { - return; - } - - PIMPLE_DEPRECATE - - if (!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_ce_PsrContainerInterface, tmp_ce_PsrContainerExceptionInterface, tmp_ce_PsrNotFoundExceptionInterface; - zend_class_entry tmp_ce_ExpectedInvokableException, tmp_ce_FrozenServiceException, tmp_ce_InvalidServiceIdentifierException, tmp_ce_UnknownIdentifierException; - zend_class_entry tmp_pimple_ce, tmp_pimple_closure_ce, tmp_pimple_serviceprovider_iface_ce; - - /* Psr\Container namespace */ - INIT_NS_CLASS_ENTRY(tmp_ce_PsrContainerInterface, PSR_CONTAINER_NS, "ContainerInterface", pimple_ce_PsrContainerInterface_functions); - INIT_NS_CLASS_ENTRY(tmp_ce_PsrContainerExceptionInterface, PSR_CONTAINER_NS, "ContainerExceptionInterface", pimple_ce_PsrContainerExceptionInterface_functions); - INIT_NS_CLASS_ENTRY(tmp_ce_PsrNotFoundExceptionInterface, PSR_CONTAINER_NS, "NotFoundExceptionInterface", pimple_ce_PsrNotFoundExceptionInterface_functions); - - pimple_ce_PsrContainerInterface = zend_register_internal_interface(&tmp_ce_PsrContainerInterface TSRMLS_CC); - pimple_ce_PsrContainerExceptionInterface = zend_register_internal_interface(&tmp_ce_PsrContainerExceptionInterface TSRMLS_CC); - pimple_ce_PsrNotFoundExceptionInterface = zend_register_internal_interface(&tmp_ce_PsrNotFoundExceptionInterface TSRMLS_CC); - - zend_class_implements(pimple_ce_PsrNotFoundExceptionInterface TSRMLS_CC, 1, pimple_ce_PsrContainerExceptionInterface); - - /* Pimple\Exception namespace */ - INIT_NS_CLASS_ENTRY(tmp_ce_ExpectedInvokableException, PIMPLE_EXCEPTION_NS, "ExpectedInvokableException", NULL); - INIT_NS_CLASS_ENTRY(tmp_ce_FrozenServiceException, PIMPLE_EXCEPTION_NS, "FrozenServiceException", pimple_ce_FrozenServiceException_functions); - INIT_NS_CLASS_ENTRY(tmp_ce_InvalidServiceIdentifierException, PIMPLE_EXCEPTION_NS, "InvalidServiceIdentifierException", pimple_ce_InvalidServiceIdentifierException_functions); - INIT_NS_CLASS_ENTRY(tmp_ce_UnknownIdentifierException, PIMPLE_EXCEPTION_NS, "UnknownIdentifierException", pimple_ce_UnknownIdentifierException_functions); - - pimple_ce_ExpectedInvokableException = zend_register_internal_class_ex(&tmp_ce_ExpectedInvokableException, spl_ce_InvalidArgumentException, NULL TSRMLS_CC); - pimple_ce_FrozenServiceException = zend_register_internal_class_ex(&tmp_ce_FrozenServiceException, spl_ce_RuntimeException, NULL TSRMLS_CC); - pimple_ce_InvalidServiceIdentifierException = zend_register_internal_class_ex(&tmp_ce_InvalidServiceIdentifierException, spl_ce_InvalidArgumentException, NULL TSRMLS_CC); - pimple_ce_UnknownIdentifierException = zend_register_internal_class_ex(&tmp_ce_UnknownIdentifierException, spl_ce_InvalidArgumentException, NULL TSRMLS_CC); - - zend_class_implements(pimple_ce_ExpectedInvokableException TSRMLS_CC, 1, pimple_ce_PsrContainerExceptionInterface); - zend_class_implements(pimple_ce_FrozenServiceException TSRMLS_CC, 1, pimple_ce_PsrContainerExceptionInterface); - zend_class_implements(pimple_ce_InvalidServiceIdentifierException TSRMLS_CC, 1, pimple_ce_PsrContainerExceptionInterface); - zend_class_implements(pimple_ce_UnknownIdentifierException TSRMLS_CC, 1, pimple_ce_PsrNotFoundExceptionInterface); - - /* Pimple namespace */ - 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/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/pimple_compat.h b/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/pimple_compat.h deleted file mode 100644 index d234e174d0aa..000000000000 --- a/samples/server/petstore/php-slim/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/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/001.phpt b/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/001.phpt deleted file mode 100644 index 0809ea232b66..000000000000 --- a/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/001.phpt +++ /dev/null @@ -1,45 +0,0 @@ ---TEST-- -Test for read_dim/write_dim handlers ---SKIPIF-- - ---FILE-- - - ---EXPECTF-- -foo -42 -foo2 -foo99 -baz -strstr \ No newline at end of file diff --git a/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/002.phpt b/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/002.phpt deleted file mode 100644 index 7b56d2c1fe8b..000000000000 --- a/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/002.phpt +++ /dev/null @@ -1,15 +0,0 @@ ---TEST-- -Test for constructor ---SKIPIF-- - ---FILE-- -'foo')); -var_dump($p[42]); -?> ---EXPECT-- -NULL -string(3) "foo" diff --git a/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/003.phpt b/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/003.phpt deleted file mode 100644 index a22cfa352ea6..000000000000 --- a/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/003.phpt +++ /dev/null @@ -1,16 +0,0 @@ ---TEST-- -Test empty dimensions ---SKIPIF-- - ---FILE-- - ---EXPECT-- -int(42) -string(3) "bar" \ No newline at end of file diff --git a/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/004.phpt b/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/004.phpt deleted file mode 100644 index 1e1d25136792..000000000000 --- a/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/004.phpt +++ /dev/null @@ -1,30 +0,0 @@ ---TEST-- -Test has/unset dim handlers ---SKIPIF-- - ---FILE-- - ---EXPECT-- -int(42) -NULL -bool(true) -bool(false) -bool(true) -bool(true) \ No newline at end of file diff --git a/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/005.phpt b/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/005.phpt deleted file mode 100644 index 0479ee055ded..000000000000 --- a/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/005.phpt +++ /dev/null @@ -1,27 +0,0 @@ ---TEST-- -Test simple class inheritance ---SKIPIF-- - ---FILE-- -someAttr; -?> ---EXPECT-- -string(3) "hit" -foo -fooAttr \ No newline at end of file diff --git a/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/006.phpt b/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/006.phpt deleted file mode 100644 index cfe8a119e63a..000000000000 --- a/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/006.phpt +++ /dev/null @@ -1,51 +0,0 @@ ---TEST-- -Test complex class inheritance ---SKIPIF-- - ---FILE-- - '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/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/007.phpt b/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/007.phpt deleted file mode 100644 index 5aac68380643..000000000000 --- a/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/007.phpt +++ /dev/null @@ -1,22 +0,0 @@ ---TEST-- -Test for read_dim/write_dim handlers ---SKIPIF-- - ---FILE-- - ---EXPECTF-- -foo -42 \ No newline at end of file diff --git a/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/008.phpt b/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/008.phpt deleted file mode 100644 index db7eeec4a113..000000000000 --- a/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/008.phpt +++ /dev/null @@ -1,29 +0,0 @@ ---TEST-- -Test frozen services ---SKIPIF-- - ---FILE-- - ---EXPECTF-- diff --git a/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/009.phpt b/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/009.phpt deleted file mode 100644 index bb05ea296485..000000000000 --- a/samples/server/petstore/php-slim/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-- - ---FILE-- - ---EXPECTF-- -bool(true) \ No newline at end of file diff --git a/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/010.phpt b/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/010.phpt deleted file mode 100644 index badce0146a91..000000000000 --- a/samples/server/petstore/php-slim/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-- - ---FILE-- - ---EXPECTF-- -callme -called -Foo::bar -array(2) { - [0]=> - string(3) "Foo" - [1]=> - string(3) "bar" -} \ No newline at end of file diff --git a/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/011.phpt b/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/011.phpt deleted file mode 100644 index 6682ab8ebdbc..000000000000 --- a/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/011.phpt +++ /dev/null @@ -1,19 +0,0 @@ ---TEST-- -Test service callback throwing an exception ---SKIPIF-- - ---FILE-- - ---EXPECTF-- -all right! \ No newline at end of file diff --git a/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/012.phpt b/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/012.phpt deleted file mode 100644 index 4c6ac486dc74..000000000000 --- a/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/012.phpt +++ /dev/null @@ -1,28 +0,0 @@ ---TEST-- -Test service factory ---SKIPIF-- - ---FILE-- -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/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/013.phpt b/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/013.phpt deleted file mode 100644 index f419958c5fa5..000000000000 --- a/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/013.phpt +++ /dev/null @@ -1,33 +0,0 @@ ---TEST-- -Test keys() ---SKIPIF-- - ---FILE-- -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/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/014.phpt b/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/014.phpt deleted file mode 100644 index ac937213ac0b..000000000000 --- a/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/014.phpt +++ /dev/null @@ -1,30 +0,0 @@ ---TEST-- -Test raw() ---SKIPIF-- - ---FILE-- -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/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/015.phpt b/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/015.phpt deleted file mode 100644 index 314f008ac1bb..000000000000 --- a/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/015.phpt +++ /dev/null @@ -1,17 +0,0 @@ ---TEST-- -Test protect() ---SKIPIF-- - ---FILE-- -protect($f); - -var_dump($p['foo']); ---EXPECTF-- -object(Closure)#%i (0) { -} \ No newline at end of file diff --git a/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/016.phpt b/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/016.phpt deleted file mode 100644 index e55edb0a7a13..000000000000 --- a/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/016.phpt +++ /dev/null @@ -1,24 +0,0 @@ ---TEST-- -Test extend() ---SKIPIF-- - ---FILE-- -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/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/017.phpt b/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/017.phpt deleted file mode 100644 index bac23ce09a91..000000000000 --- a/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/017.phpt +++ /dev/null @@ -1,17 +0,0 @@ ---TEST-- -Test extend() with exception in service extension ---SKIPIF-- - ---FILE-- -extend(12, function ($w) { throw new BadMethodCallException; }); - -try { - $p[12]; - echo "Exception expected"; -} catch (BadMethodCallException $e) { } ---EXPECTF-- diff --git a/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/017_1.phpt b/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/017_1.phpt deleted file mode 100644 index 8f881d6ebf82..000000000000 --- a/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/017_1.phpt +++ /dev/null @@ -1,17 +0,0 @@ ---TEST-- -Test extend() with exception in service factory ---SKIPIF-- - ---FILE-- -extend(12, function ($w) { return 'foobar'; }); - -try { - $p[12]; - echo "Exception expected"; -} catch (BadMethodCallException $e) { } ---EXPECTF-- diff --git a/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/018.phpt b/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/018.phpt deleted file mode 100644 index 27c12a14e79e..000000000000 --- a/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/018.phpt +++ /dev/null @@ -1,23 +0,0 @@ ---TEST-- -Test register() ---SKIPIF-- - ---FILE-- -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/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/019.phpt b/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/019.phpt deleted file mode 100644 index 28a9aecac7f0..000000000000 --- a/samples/server/petstore/php-slim/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-- - ---FILE-- -register(new Foo)); ---EXPECTF-- -bool(true) diff --git a/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/bench.phpb b/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/bench.phpb deleted file mode 100644 index 8f983e656b52..000000000000 --- a/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/bench.phpb +++ /dev/null @@ -1,51 +0,0 @@ -factory($factory); - -$p['factory'] = $factory; - -echo $p['factory']; -echo $p['factory']; -echo $p['factory']; - -} - -echo microtime(true) - $time; diff --git a/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/bench_shared.phpb b/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/bench_shared.phpb deleted file mode 100644 index aec541f0bc8b..000000000000 --- a/samples/server/petstore/php-slim/vendor/pimple/pimple/ext/pimple/tests/bench_shared.phpb +++ /dev/null @@ -1,25 +0,0 @@ - diff --git a/samples/server/petstore/php-slim/vendor/pimple/pimple/phpunit.xml.dist b/samples/server/petstore/php-slim/vendor/pimple/pimple/phpunit.xml.dist deleted file mode 100644 index 5c8d487fea9a..000000000000 --- a/samples/server/petstore/php-slim/vendor/pimple/pimple/phpunit.xml.dist +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - ./src/Pimple/Tests - - - diff --git a/samples/server/petstore/php-slim/vendor/pimple/pimple/src/Pimple/Container.php b/samples/server/petstore/php-slim/vendor/pimple/pimple/src/Pimple/Container.php deleted file mode 100644 index 707b92b82c13..000000000000 --- a/samples/server/petstore/php-slim/vendor/pimple/pimple/src/Pimple/Container.php +++ /dev/null @@ -1,298 +0,0 @@ -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 FrozenServiceException Prevent override of a frozen service - */ - public function offsetSet($id, $value) - { - if (isset($this->frozen[$id])) { - throw new FrozenServiceException($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 UnknownIdentifierException If the identifier is not defined - */ - public function offsetGet($id) - { - if (!isset($this->keys[$id])) { - throw new UnknownIdentifierException($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 ExpectedInvokableException Service definition has to be a closure or an invokable object - */ - public function factory($callable) - { - if (!\method_exists($callable, '__invoke')) { - throw new ExpectedInvokableException('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 ExpectedInvokableException Service definition has to be a closure or an invokable object - */ - public function protect($callable) - { - if (!\method_exists($callable, '__invoke')) { - throw new ExpectedInvokableException('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 UnknownIdentifierException If the identifier is not defined - */ - public function raw($id) - { - if (!isset($this->keys[$id])) { - throw new UnknownIdentifierException($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 UnknownIdentifierException If the identifier is not defined - * @throws FrozenServiceException If the service is frozen - * @throws InvalidServiceIdentifierException If the identifier belongs to a parameter - * @throws ExpectedInvokableException If the extension callable is not a closure or an invokable object - */ - public function extend($id, $callable) - { - if (!isset($this->keys[$id])) { - throw new UnknownIdentifierException($id); - } - - if (isset($this->frozen[$id])) { - throw new FrozenServiceException($id); - } - - if (!\is_object($this->values[$id]) || !\method_exists($this->values[$id], '__invoke')) { - throw new InvalidServiceIdentifierException($id); - } - - if (isset($this->protected[$this->values[$id]])) { - @\trigger_error(\sprintf('How Pimple behaves when extending protected closures will be fixed in Pimple 4. Are you sure "%s" should be protected?', $id), \E_USER_DEPRECATED); - } - - if (!\is_object($callable) || !\method_exists($callable, '__invoke')) { - throw new ExpectedInvokableException('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/samples/server/petstore/php-slim/vendor/pimple/pimple/src/Pimple/ServiceProviderInterface.php b/samples/server/petstore/php-slim/vendor/pimple/pimple/src/Pimple/ServiceProviderInterface.php deleted file mode 100644 index c004594baf04..000000000000 --- a/samples/server/petstore/php-slim/vendor/pimple/pimple/src/Pimple/ServiceProviderInterface.php +++ /dev/null @@ -1,46 +0,0 @@ -value = $value; - - return $service; - } -} diff --git a/samples/server/petstore/php-slim/vendor/pimple/pimple/src/Pimple/Tests/Fixtures/NonInvokable.php b/samples/server/petstore/php-slim/vendor/pimple/pimple/src/Pimple/Tests/Fixtures/NonInvokable.php deleted file mode 100644 index 33cd4e548640..000000000000 --- a/samples/server/petstore/php-slim/vendor/pimple/pimple/src/Pimple/Tests/Fixtures/NonInvokable.php +++ /dev/null @@ -1,34 +0,0 @@ -factory(function () { - return new Service(); - }); - } -} diff --git a/samples/server/petstore/php-slim/vendor/pimple/pimple/src/Pimple/Tests/Fixtures/Service.php b/samples/server/petstore/php-slim/vendor/pimple/pimple/src/Pimple/Tests/Fixtures/Service.php deleted file mode 100644 index d71b184ddf7f..000000000000 --- a/samples/server/petstore/php-slim/vendor/pimple/pimple/src/Pimple/Tests/Fixtures/Service.php +++ /dev/null @@ -1,35 +0,0 @@ - - */ -class Service -{ - public $value; -} diff --git a/samples/server/petstore/php-slim/vendor/pimple/pimple/src/Pimple/Tests/PimpleServiceProviderInterfaceTest.php b/samples/server/petstore/php-slim/vendor/pimple/pimple/src/Pimple/Tests/PimpleServiceProviderInterfaceTest.php deleted file mode 100644 index 8e5c4c73deb0..000000000000 --- a/samples/server/petstore/php-slim/vendor/pimple/pimple/src/Pimple/Tests/PimpleServiceProviderInterfaceTest.php +++ /dev/null @@ -1,76 +0,0 @@ - - */ -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/samples/server/petstore/php-slim/vendor/pimple/pimple/src/Pimple/Tests/PimpleTest.php b/samples/server/petstore/php-slim/vendor/pimple/pimple/src/Pimple/Tests/PimpleTest.php deleted file mode 100644 index acb66e000261..000000000000 --- a/samples/server/petstore/php-slim/vendor/pimple/pimple/src/Pimple/Tests/PimpleTest.php +++ /dev/null @@ -1,589 +0,0 @@ - - */ -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 \Pimple\Exception\UnknownIdentifierException - * @expectedExceptionMessage Identifier "foo" is not defined. - */ - public function testOffsetGetValidatesKeyIsPresent() - { - $pimple = new Container(); - echo $pimple['foo']; - } - - /** - * @group legacy - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage Identifier "foo" is not defined. - */ - public function testLegacyOffsetGetValidatesKeyIsPresent() - { - $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->getMockBuilder('Pimple\ServiceProviderInterface')->getMock())); - } - - /** - * @expectedException \Pimple\Exception\UnknownIdentifierException - * @expectedExceptionMessage Identifier "foo" is not defined. - */ - public function testRawValidatesKeyIsPresent() - { - $pimple = new Container(); - $pimple->raw('foo'); - } - - /** - * @group legacy - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage Identifier "foo" is not defined. - */ - public function testLegacyRawValidatesKeyIsPresent() - { - $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 \Pimple\Exception\UnknownIdentifierException - * @expectedExceptionMessage Identifier "foo" is not defined. - */ - public function testExtendValidatesKeyIsPresent() - { - $pimple = new Container(); - $pimple->extend('foo', function () {}); - } - - /** - * @group legacy - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage Identifier "foo" is not defined. - */ - public function testLegacyExtendValidatesKeyIsPresent() - { - $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 \Pimple\Exception\ExpectedInvokableException - * @expectedExceptionMessage Service definition is not a Closure or invokable object. - */ - public function testFactoryFailsForInvalidServiceDefinitions($service) - { - $pimple = new Container(); - $pimple->factory($service); - } - - /** - * @group legacy - * @dataProvider badServiceDefinitionProvider - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage Service definition is not a Closure or invokable object. - */ - public function testLegacyFactoryFailsForInvalidServiceDefinitions($service) - { - $pimple = new Container(); - $pimple->factory($service); - } - - /** - * @dataProvider badServiceDefinitionProvider - * @expectedException \Pimple\Exception\ExpectedInvokableException - * @expectedExceptionMessage Callable is not a Closure or invokable object. - */ - public function testProtectFailsForInvalidServiceDefinitions($service) - { - $pimple = new Container(); - $pimple->protect($service); - } - - /** - * @group legacy - * @dataProvider badServiceDefinitionProvider - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage Callable is not a Closure or invokable object. - */ - public function testLegacyProtectFailsForInvalidServiceDefinitions($service) - { - $pimple = new Container(); - $pimple->protect($service); - } - - /** - * @dataProvider badServiceDefinitionProvider - * @expectedException \Pimple\Exception\InvalidServiceIdentifierException - * @expectedExceptionMessage Identifier "foo" does not contain an object definition. - */ - public function testExtendFailsForKeysNotContainingServiceDefinitions($service) - { - $pimple = new Container(); - $pimple['foo'] = $service; - $pimple->extend('foo', function () {}); - } - - /** - * @group legacy - * @dataProvider badServiceDefinitionProvider - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage Identifier "foo" does not contain an object definition. - */ - public function testLegacyExtendFailsForKeysNotContainingServiceDefinitions($service) - { - $pimple = new Container(); - $pimple['foo'] = $service; - $pimple->extend('foo', function () {}); - } - - /** - * @group legacy - * @expectedDeprecation How Pimple behaves when extending protected closures will be fixed in Pimple 4. Are you sure "foo" should be protected? - */ - public function testExtendingProtectedClosureDeprecation() - { - $pimple = new Container(); - $pimple['foo'] = $pimple->protect(function () { - return 'bar'; - }); - - $pimple->extend('foo', function ($value) { - return $value.'-baz'; - }); - - $this->assertSame('bar-baz', $pimple['foo']); - } - - /** - * @dataProvider badServiceDefinitionProvider - * @expectedException \Pimple\Exception\ExpectedInvokableException - * @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); - } - - /** - * @group legacy - * @dataProvider badServiceDefinitionProvider - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage Extension service definition is not a Closure or invokable object. - */ - public function testLegacyExtendFailsForInvalidServiceDefinitions($service) - { - $pimple = new Container(); - $pimple['foo'] = function () {}; - $pimple->extend('foo', $service); - } - - /** - * @expectedException \Pimple\Exception\FrozenServiceException - * @expectedExceptionMessage Cannot override frozen service "foo". - */ - public function testExtendFailsIfFrozenServiceIsNonInvokable() - { - $pimple = new Container(); - $pimple['foo'] = function () { - return new Fixtures\NonInvokable(); - }; - $foo = $pimple['foo']; - - $pimple->extend('foo', function () {}); - } - - /** - * @expectedException \Pimple\Exception\FrozenServiceException - * @expectedExceptionMessage Cannot override frozen service "foo". - */ - public function testExtendFailsIfFrozenServiceIsInvokable() - { - $pimple = new Container(); - $pimple['foo'] = function () { - return new Fixtures\Invokable(); - }; - $foo = $pimple['foo']; - - $pimple->extend('foo', function () {}); - } - - /** - * 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 \Pimple\Exception\FrozenServiceException - * @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'; - }; - } - - /** - * @group legacy - * @expectedException \RuntimeException - * @expectedExceptionMessage Cannot override frozen service "foo". - */ - public function testLegacyOverridingServiceAfterFreeze() - { - $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/samples/server/petstore/php-slim/vendor/psr/http-message/README.md b/samples/server/petstore/php-slim/vendor/psr/http-message/README.md deleted file mode 100644 index 28185338f723..000000000000 --- a/samples/server/petstore/php-slim/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/samples/server/petstore/php-slim/vendor/psr/http-message/composer.json b/samples/server/petstore/php-slim/vendor/psr/http-message/composer.json deleted file mode 100644 index b0d2937a03a5..000000000000 --- a/samples/server/petstore/php-slim/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/samples/server/petstore/php-slim/vendor/psr/http-message/src/MessageInterface.php b/samples/server/petstore/php-slim/vendor/psr/http-message/src/MessageInterface.php deleted file mode 100644 index dd46e5ec81ee..000000000000 --- a/samples/server/petstore/php-slim/vendor/psr/http-message/src/MessageInterface.php +++ /dev/null @@ -1,187 +0,0 @@ -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/samples/server/petstore/php-slim/vendor/psr/http-message/src/RequestInterface.php b/samples/server/petstore/php-slim/vendor/psr/http-message/src/RequestInterface.php deleted file mode 100644 index a96d4fd63667..000000000000 --- a/samples/server/petstore/php-slim/vendor/psr/http-message/src/RequestInterface.php +++ /dev/null @@ -1,129 +0,0 @@ -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/samples/server/petstore/php-slim/vendor/psr/http-message/src/StreamInterface.php b/samples/server/petstore/php-slim/vendor/psr/http-message/src/StreamInterface.php deleted file mode 100644 index f68f391269b4..000000000000 --- a/samples/server/petstore/php-slim/vendor/psr/http-message/src/StreamInterface.php +++ /dev/null @@ -1,158 +0,0 @@ - - * [user-info@]host[:port] - * - * - * 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/samples/server/petstore/php-slim/vendor/slim/slim/LICENSE.md b/samples/server/petstore/php-slim/vendor/slim/slim/LICENSE.md deleted file mode 100644 index 682c21dc7a47..000000000000 --- a/samples/server/petstore/php-slim/vendor/slim/slim/LICENSE.md +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2011-2017 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/samples/server/petstore/php-slim/vendor/slim/slim/Slim/App.php b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/App.php deleted file mode 100644 index ba2aef40695f..000000000000 --- a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/App.php +++ /dev/null @@ -1,714 +0,0 @@ -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; - } - - /** - * Add a route that sends an HTTP redirect - * - * @param string $from - * @param string|UriInterface $to - * @param int $status - * - * @return RouteInterface - */ - public function redirect($from, $to, $status = 302) - { - $handler = function ($request, ResponseInterface $response) use ($to, $status) { - return $response->withHeader('Location', (string)$to)->withStatus($status); - }; - - return $this->get($from, $handler); - } - - /** - * 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) - { - $response = $this->container->get('response'); - - try { - ob_start(); - $response = $this->process($this->container->get('request'), $response); - } catch (InvalidMethodException $e) { - $response = $this->processInvalidMethod($e->getRequest(), $response); - } finally { - $output = ob_get_clean(); - } - - if (!empty($output) && $response->getBody()->isWritable()) { - $outputBuffering = $this->container->get('settings')['outputBuffering']; - if ($outputBuffering === 'prepend') { - // prepend output buffer content - $body = new Http\Body(fopen('php://temp', 'r+')); - $body->write($output . $response->getBody()); - $response = $response->withBody($body); - } elseif ($outputBuffering === 'append') { - // append output buffer content - $response->getBody()->write($output); - } - } - - $response = $this->finalize($response); - - if (!$silent) { - $this->respond($response); - } - - return $response; - } - - /** - * Pull route info for a request with a bad method to decide whether to - * return a not-found error (default) or a bad-method error, then run - * the handler for that error, returning the resulting response. - * - * Used for cases where an incoming request has an unrecognized method, - * rather than throwing an exception and not catching it all the way up. - * - * @param ServerRequestInterface $request - * @param ResponseInterface $response - * @return ResponseInterface - */ - protected function processInvalidMethod(ServerRequestInterface $request, ResponseInterface $response) - { - $router = $this->container->get('router'); - if (is_callable([$request->getUri(), 'getBasePath']) && is_callable([$router, 'setBasePath'])) { - $router->setBasePath($request->getUri()->getBasePath()); - } - - $request = $this->dispatchRouterAndPrepareRoute($request, $router); - $routeInfo = $request->getAttribute('routeInfo', [RouterInterface::DISPATCH_STATUS => Dispatcher::NOT_FOUND]); - - if ($routeInfo[RouterInterface::DISPATCH_STATUS] === Dispatcher::METHOD_NOT_ALLOWED) { - return $this->handleException( - new MethodNotAllowedException($request, $response, $routeInfo[RouterInterface::ALLOWED_METHODS]), - $request, - $response - ); - } - - return $this->handleException(new NotFoundException($request, $response), $request, $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); - } - - return $response; - } - - /** - * Send the response to the client - * - * @param ResponseInterface $response - */ - public function respond(ResponseInterface $response) - { - // Send response - if (!headers_sent()) { - // Headers - foreach ($response->getHeaders() as $name => $values) { - foreach ($values as $value) { - header(sprintf('%s: %s', $name, $value), false); - } - } - - // Set the status _after_ the headers, because of PHP's "helpful" behavior with location headers. - // See https://github.com/slimphp/Slim/issues/1730 - - // Status - header(sprintf( - 'HTTP/%s %s %s', - $response->getProtocolVersion(), - $response->getStatusCode(), - $response->getReasonPhrase() - )); - } - - // 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 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(), $e]; - } 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/samples/server/petstore/php-slim/vendor/slim/slim/Slim/CallableResolver.php b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/CallableResolver.php deleted file mode 100644 index 2211a3291878..000000000000 --- a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/CallableResolver.php +++ /dev/null @@ -1,110 +0,0 @@ -container = $container; - } - - /** - * Resolve toResolve into a closure so 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) - { - if (is_callable($toResolve)) { - return $toResolve; - } - - if (!is_string($toResolve)) { - $this->assertCallable($toResolve); - } - - // check for slim callable as "class:method" - if (preg_match(self::CALLABLE_PATTERN, $toResolve, $matches)) { - $resolved = $this->resolveCallable($matches[1], $matches[2]); - $this->assertCallable($resolved); - - return $resolved; - } - - $resolved = $this->resolveCallable($toResolve); - $this->assertCallable($resolved); - - return $resolved; - } - - /** - * Check if string is something in the DIC - * that's callable or is a class name which has an __invoke() method. - * - * @param string $class - * @param string $method - * @return callable - * - * @throws \RuntimeException if the callable does not exist - */ - protected function resolveCallable($class, $method = '__invoke') - { - if ($this->container->has($class)) { - return [$this->container->get($class), $method]; - } - - if (!class_exists($class)) { - throw new RuntimeException(sprintf('Callable %s does not exist', $class)); - } - - return [new $class($this->container), $method]; - } - - /** - * @param Callable $callable - * - * @throws \RuntimeException if the callable is not resolvable - */ - protected function assertCallable($callable) - { - if (!is_callable($callable)) { - throw new RuntimeException(sprintf( - '%s is not resolvable', - is_array($callable) || is_object($callable) ? json_encode($callable) : $callable - )); - } - } -} diff --git a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/CallableResolverAwareTrait.php b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/CallableResolverAwareTrait.php deleted file mode 100644 index ffb4eb28a439..000000000000 --- a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/CallableResolverAwareTrait.php +++ /dev/null @@ -1,47 +0,0 @@ -container instanceof ContainerInterface) { - return $callable; - } - - /** @var CallableResolverInterface $resolver */ - $resolver = $this->container->get('callableResolver'); - - return $resolver->resolve($callable); - } -} diff --git a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Collection.php b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Collection.php deleted file mode 100644 index 728bb73e08b1..000000000000 --- a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Collection.php +++ /dev/null @@ -1,202 +0,0 @@ -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/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Container.php b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Container.php deleted file mode 100644 index 1f713ac4eabb..000000000000 --- a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Container.php +++ /dev/null @@ -1,179 +0,0 @@ - '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 Psr\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/samples/server/petstore/php-slim/vendor/slim/slim/Slim/DefaultServicesProvider.php b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/DefaultServicesProvider.php deleted file mode 100644 index 13fe1fb31ce3..000000000000 --- a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/DefaultServicesProvider.php +++ /dev/null @@ -1,211 +0,0 @@ -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']; - } - - - $router = (new Router)->setCacheFile($routerCacheFile); - if (method_exists($router, 'setContainer')) { - $router->setContainer($container); - } - - return $router; - }; - } - - 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/samples/server/petstore/php-slim/vendor/slim/slim/Slim/DeferredCallable.php b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/DeferredCallable.php deleted file mode 100644 index 22887c0fce63..000000000000 --- a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/DeferredCallable.php +++ /dev/null @@ -1,45 +0,0 @@ -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/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Exception/ContainerException.php b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Exception/ContainerException.php deleted file mode 100644 index 06163f1da059..000000000000 --- a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Exception/ContainerException.php +++ /dev/null @@ -1,20 +0,0 @@ -allowedMethods = $allowedMethods; - } - - /** - * Get allowed methods - * - * @return string[] - */ - public function getAllowedMethods() - { - return $this->allowedMethods; - } -} diff --git a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Exception/NotFoundException.php b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Exception/NotFoundException.php deleted file mode 100644 index 9e72e14e63bc..000000000000 --- a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Exception/NotFoundException.php +++ /dev/null @@ -1,14 +0,0 @@ -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/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Handlers/AbstractError.php b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Handlers/AbstractError.php deleted file mode 100644 index 42f8dde3df06..000000000000 --- a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Handlers/AbstractError.php +++ /dev/null @@ -1,99 +0,0 @@ -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/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Handlers/AbstractHandler.php b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Handlers/AbstractHandler.php deleted file mode 100644 index b166a1564431..000000000000 --- a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Handlers/AbstractHandler.php +++ /dev/null @@ -1,59 +0,0 @@ -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/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Handlers/Error.php b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Handlers/Error.php deleted file mode 100644 index dd0bc8d4e7a5..000000000000 --- a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Handlers/Error.php +++ /dev/null @@ -1,224 +0,0 @@ -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 = '

The application could not run because of the following error:

'; - $html .= '

Details

'; - $html .= $this->renderHtmlException($exception); - - while ($exception = $exception->getPrevious()) { - $html .= '

Previous exception

'; - $html .= $this->renderHtmlExceptionOrError($exception); - } - } else { - $html = '

A website error has occurred. Sorry for the temporary inconvenience.

'; - } - - $output = sprintf( - "" . - "%s

%s

%s", - $title, - $title, - $html - ); - - return $output; - } - - /** - * Render exception as HTML. - * - * Provided for backwards compatibility; use renderHtmlExceptionOrError(). - * - * @param \Exception $exception - * - * @return string - */ - protected function renderHtmlException(\Exception $exception) - { - return $this->renderHtmlExceptionOrError($exception); - } - - /** - * Render exception or error as HTML. - * - * @param \Exception|\Error $exception - * - * @return string - */ - protected function renderHtmlExceptionOrError($exception) - { - if (!$exception instanceof \Exception && !$exception instanceof \Error) { - throw new \RuntimeException("Unexpected type. Expected Exception or Error."); - } - - $html = sprintf('
Type: %s
', get_class($exception)); - - if (($code = $exception->getCode())) { - $html .= sprintf('
Code: %s
', $code); - } - - if (($message = $exception->getMessage())) { - $html .= sprintf('
Message: %s
', htmlentities($message)); - } - - if (($file = $exception->getFile())) { - $html .= sprintf('
File: %s
', $file); - } - - if (($line = $exception->getLine())) { - $html .= sprintf('
Line: %s
', $line); - } - - if (($trace = $exception->getTraceAsString())) { - $html .= '

Trace

'; - $html .= sprintf('
%s
', 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 = "\n Slim Application Error\n"; - if ($this->displayErrorDetails) { - do { - $xml .= " \n"; - $xml .= " " . get_class($exception) . "\n"; - $xml .= " " . $exception->getCode() . "\n"; - $xml .= " " . $this->createCdataSection($exception->getMessage()) . "\n"; - $xml .= " " . $exception->getFile() . "\n"; - $xml .= " " . $exception->getLine() . "\n"; - $xml .= " " . $this->createCdataSection($exception->getTraceAsString()) . "\n"; - $xml .= " \n"; - } while ($exception = $exception->getPrevious()); - } - $xml .= ""; - - return $xml; - } - - /** - * Returns a CDATA section with the given content. - * - * @param string $content - * @return string - */ - private function createCdataSection($content) - { - return sprintf('', str_replace(']]>', ']]]]>', $content)); - } -} diff --git a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Handlers/NotAllowed.php b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Handlers/NotAllowed.php deleted file mode 100644 index 345f0ff8c42f..000000000000 --- a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Handlers/NotAllowed.php +++ /dev/null @@ -1,147 +0,0 @@ -getMethod() === 'OPTIONS') { - $status = 200; - $contentType = 'text/plain'; - $output = $this->renderPlainOptionsMessage($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 message for OPTIONS response - * - * @param array $methods - * @return string - */ - protected function renderPlainOptionsMessage($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 "Method not allowed. Must be one of: $allow"; - } - - /** - * Render HTML not allowed message - * - * @param array $methods - * @return string - */ - protected function renderHtmlNotAllowedMessage($methods) - { - $allow = implode(', ', $methods); - $output = << - - Method not allowed - - - -

Method not allowed

-

Method not allowed. Must be one of: $allow

- - -END; - - return $output; - } -} diff --git a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Handlers/NotFound.php b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Handlers/NotFound.php deleted file mode 100644 index b3330321ff38..000000000000 --- a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Handlers/NotFound.php +++ /dev/null @@ -1,141 +0,0 @@ -getMethod() === 'OPTIONS') { - $contentType = 'text/plain'; - $output = $this->renderPlainNotFoundOutput(); - } else { - $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); - } - - /** - * Render plain not found message - * - * @return ResponseInterface - */ - protected function renderPlainNotFoundOutput() - { - return 'Not found'; - } - - /** - * 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 'Not found'; - } - - /** - * 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 << - - Page Not Found - - - -

Page Not Found

-

- 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. -

- Visit the Home Page - - -END; - } -} diff --git a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Handlers/PhpError.php b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Handlers/PhpError.php deleted file mode 100644 index 3ecce30cfaf0..000000000000 --- a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Handlers/PhpError.php +++ /dev/null @@ -1,205 +0,0 @@ -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 = '

The application could not run because of the following error:

'; - $html .= '

Details

'; - $html .= $this->renderHtmlError($error); - - while ($error = $error->getPrevious()) { - $html .= '

Previous error

'; - $html .= $this->renderHtmlError($error); - } - } else { - $html = '

A website error has occurred. Sorry for the temporary inconvenience.

'; - } - - $output = sprintf( - "" . - "%s

%s

%s", - $title, - $title, - $html - ); - - return $output; - } - - /** - * Render error as HTML. - * - * @param \Throwable $error - * - * @return string - */ - protected function renderHtmlError(\Throwable $error) - { - $html = sprintf('
Type: %s
', get_class($error)); - - if (($code = $error->getCode())) { - $html .= sprintf('
Code: %s
', $code); - } - - if (($message = $error->getMessage())) { - $html .= sprintf('
Message: %s
', htmlentities($message)); - } - - if (($file = $error->getFile())) { - $html .= sprintf('
File: %s
', $file); - } - - if (($line = $error->getLine())) { - $html .= sprintf('
Line: %s
', $line); - } - - if (($trace = $error->getTraceAsString())) { - $html .= '

Trace

'; - $html .= sprintf('
%s
', 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 = "\n Slim Application Error\n"; - if ($this->displayErrorDetails) { - do { - $xml .= " \n"; - $xml .= " " . get_class($error) . "\n"; - $xml .= " " . $error->getCode() . "\n"; - $xml .= " " . $this->createCdataSection($error->getMessage()) . "\n"; - $xml .= " " . $error->getFile() . "\n"; - $xml .= " " . $error->getLine() . "\n"; - $xml .= " " . $this->createCdataSection($error->getTraceAsString()) . "\n"; - $xml .= " \n"; - } while ($error = $error->getPrevious()); - } - $xml .= ""; - - return $xml; - } - - /** - * Returns a CDATA section with the given content. - * - * @param string $content - * @return string - */ - private function createCdataSection($content) - { - return sprintf('', str_replace(']]>', ']]]]>', $content)); - } -} diff --git a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Handlers/Strategies/RequestResponse.php b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Handlers/Strategies/RequestResponse.php deleted file mode 100644 index ad99b56e8655..000000000000 --- a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Handlers/Strategies/RequestResponse.php +++ /dev/null @@ -1,43 +0,0 @@ - $v) { - $request = $request->withAttribute($k, $v); - } - - return call_user_func($callable, $request, $response, $routeArguments); - } -} diff --git a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Handlers/Strategies/RequestResponseArgs.php b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Handlers/Strategies/RequestResponseArgs.php deleted file mode 100644 index 739cc7ee88f8..000000000000 --- a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Handlers/Strategies/RequestResponseArgs.php +++ /dev/null @@ -1,42 +0,0 @@ - '', - 'domain' => null, - 'hostonly' => null, - 'path' => null, - 'expires' => null, - 'secure' => false, - 'httponly' => false, - 'samesite' => null - ]; - - /** - * 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'; - } - - if (isset($properties['samesite']) && in_array(strtolower($properties['samesite']), ['lax', 'strict'], true)) { - // While strtolower is needed for correct comparison, the RFC doesn't care about case - $result .= '; SameSite=' . $properties['samesite']; - } - - 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*@', $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/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/Environment.php b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/Environment.php deleted file mode 100644 index cd452fcff97e..000000000000 --- a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/Environment.php +++ /dev/null @@ -1,63 +0,0 @@ - 'HTTP/1.1', - 'REQUEST_METHOD' => 'GET', - 'REQUEST_SCHEME' => $defscheme, - 'SCRIPT_NAME' => '', - 'REQUEST_URI' => '', - 'QUERY_STRING' => '', - 'SERVER_NAME' => 'localhost', - 'SERVER_PORT' => $defport, - '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/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/Headers.php b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/Headers.php deleted file mode 100644 index ef50f84b6015..000000000000 --- a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/Headers.php +++ /dev/null @@ -1,222 +0,0 @@ - 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 (empty($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/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/Message.php b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/Message.php deleted file mode 100644 index 9195fb5b70fa..000000000000 --- a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/Message.php +++ /dev/null @@ -1,305 +0,0 @@ - true, - '1.1' => true, - '2.0' => true, - '2' => 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/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/Request.php b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/Request.php deleted file mode 100644 index 3bda649b3353..000000000000 --- a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/Request.php +++ /dev/null @@ -1,1229 +0,0 @@ - 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 static - */ - 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 - * @throws InvalidMethodException on invalid HTTP method - */ - public function __construct( - $method, - UriInterface $uri, - HeadersInterface $headers, - array $cookies, - array $serverParams, - StreamInterface $body, - array $uploadedFiles = [] - ) { - try { - $this->originalMethod = $this->filterMethod($method); - } catch (InvalidMethodException $e) { - $this->originalMethod = $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() !== '') { - $port = $this->uri->getPort() ? ":{$this->uri->getPort()}" : ''; - - $this->headers->set('Host', $this->uri->getHost() . $port); - } - - $this->registerMediaTypeParser('application/json', function ($input) { - $result = json_decode($input, true); - if (!is_array($result)) { - return null; - } - return $result; - }); - - $this->registerMediaTypeParser('application/xml', function ($input) { - $backup = libxml_disable_entity_loader(true); - $backup_errors = libxml_use_internal_errors(true); - $result = simplexml_load_string($input); - libxml_disable_entity_loader($backup); - libxml_clear_errors(); - libxml_use_internal_errors($backup_errors); - if ($result === false) { - return null; - } - return $result; - }); - - $this->registerMediaTypeParser('text/xml', function ($input) { - $backup = libxml_disable_entity_loader(true); - $backup_errors = libxml_use_internal_errors(true); - $result = simplexml_load_string($input); - libxml_disable_entity_loader($backup); - libxml_clear_errors(); - libxml_use_internal_errors($backup_errors); - if ($result === false) { - return null; - } - return $result; - }); - - $this->registerMediaTypeParser('application/x-www-form-urlencoded', function ($input) { - parse_str($input, $data); - return $data; - }); - - // if the request had an invalid method, we can throw it now - if (isset($e) && $e instanceof InvalidMethodException) { - throw $e; - } - } - - /** - * 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') { - $overrideMethod = $this->filterMethod($this->getParsedBodyParam('_METHOD')); - if ($overrideMethod !== null) { - $this->method = $overrideMethod; - } - - 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 static - * @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 (preg_match("/^[!#$%&'*+.^_`|~0-9a-z-]+$/i", $method) !== 1) { - throw new InvalidMethodException($this, $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 static - * @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 static - */ - 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 ($uri->getHost() !== '' && (!$this->hasHeader('Host') || $this->getHeaderLine('Host') === '')) { - $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 $key 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 static - */ - 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 static - */ - 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 static - * @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; - } - - /** - * Retrieve a server parameter. - * - * Note: This method is not part of the PSR-7 standard. - * - * @param string $key - * @param mixed $default - * @return mixed - */ - public function getServerParam($key, $default = null) - { - $serverParams = $this->getServerParams(); - - return isset($serverParams[$key]) ? $serverParams[$key] : $default; - } - - /******************************************************************************* - * 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 static - */ - 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 static - */ - 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 static - */ - 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 static - * @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 $this - */ - 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 string $key - * @param mixed $default - * - * @return mixed - */ - 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 string $key - * @param mixed $default - * - * @return mixed - */ - public function getQueryParam($key, $default = null) - { - $getParams = $this->getQueryParams(); - $result = $default; - if (isset($getParams[$key])) { - $result = $getParams[$key]; - } - - return $result; - } - - /** - * Fetch associative array of body and query string parameters. - * - * Note: This method is not part of the PSR-7 standard. - * - * @param array|null $only list the keys to retrieve. - * @return array|null - */ - public function getParams(array $only = null) - { - $params = $this->getQueryParams(); - $postParams = $this->getParsedBody(); - if ($postParams) { - $params = array_merge($params, (array)$postParams); - } - - if ($only) { - $onlyParams = []; - foreach ($only as $key) { - if (array_key_exists($key, $params)) { - $onlyParams[$key] = $params[$key]; - } - } - return $onlyParams; - } - - return $params; - } -} diff --git a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/RequestBody.php b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/RequestBody.php deleted file mode 100644 index 50887fddc23b..000000000000 --- a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/RequestBody.php +++ /dev/null @@ -1,27 +0,0 @@ - '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', - 421 => 'Misdirected Request', - 422 => 'Unprocessable Entity', - 423 => 'Locked', - 424 => 'Failed Dependency', - 426 => 'Upgrade Required', - 428 => 'Precondition Required', - 429 => 'Too Many Requests', - 431 => 'Request Header Fields Too Large', - 444 => 'Connection Closed Without Response', - 451 => 'Unavailable For Legal Reasons', - 499 => 'Client Closed Request', - //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', - 599 => 'Network Connect Timeout Error', - ]; - - /** - * EOL characters used for HTTP response. - * - * @var string - */ - const EOL = "\r\n"; - - /** - * 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 static - * @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 ''; - } - - /******************************************************************************* - * Headers - ******************************************************************************/ - - /** - * Return an instance with the provided value replacing the specified header. - * - * If a Location header is set and the status code is 200, then set the status - * code to 302 to mimic what PHP does. See https://github.com/slimphp/Slim/issues/1730 - * - * @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); - - if ($clone->getStatusCode() === 200 && strtolower($name) === 'location') { - $clone = $clone->withStatus(302); - } - - return $clone; - } - - - /******************************************************************************* - * 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 $this - */ - 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 static - */ - 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 static - */ - public function withJson($data, $status = null, $encodingOptions = 0) - { - $response = $this->withBody(new Body(fopen('php://temp', 'r+'))); - $response->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 = $response->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 .= Response::EOL; - foreach ($this->getHeaders() as $name => $values) { - $output .= sprintf('%s: %s', $name, $this->getHeaderLine($name)) . Response::EOL; - } - $output .= Response::EOL; - $output .= (string)$this->getBody(); - - return $output; - } -} diff --git a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/Stream.php b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/Stream.php deleted file mode 100644 index 27c7a7645bf6..000000000000 --- a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/Stream.php +++ /dev/null @@ -1,450 +0,0 @@ - ['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/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/UploadedFile.php b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/UploadedFile.php deleted file mode 100644 index ae5dfb65e593..000000000000 --- a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/UploadedFile.php +++ /dev/null @@ -1,327 +0,0 @@ -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/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/Uri.php b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/Uri.php deleted file mode 100644 index fb0f04b5c3e9..000000000000 --- a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Http/Uri.php +++ /dev/null @@ -1,845 +0,0 @@ -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 (isset($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: - * - *
-     * [user-info@]host[:port]
-     * 
- * - * 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 = $this->filterUserInfo($user); - if ($clone->user) { - $clone->password = $password ? $this->filterUserInfo($password) : ''; - } else { - $clone->password = ''; - } - - return $clone; - } - - /** - * Filters the user info string. - * - * @param string $query The raw uri query string. - * @return string The percent-encoded query string. - */ - protected function filterUserInfo($query) - { - return preg_replace_callback( - '/(?:[^a-zA-Z0-9_\-\.~!\$&\'\(\)\*\+,;=]+|%(?![A-Fa-f0-9]{2}))/u', - function ($match) { - return rawurlencode($match[0]); - }, - $query - ); - } - - /** - * 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/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Interfaces/CallableResolverInterface.php b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Interfaces/CallableResolverInterface.php deleted file mode 100644 index 17d81dbe84ea..000000000000 --- a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Interfaces/CallableResolverInterface.php +++ /dev/null @@ -1,27 +0,0 @@ -middlewareLock) { - throw new RuntimeException('Middleware can’t be added once the stack is dequeuing'); - } - - if (is_null($this->tip)) { - $this->seedMiddlewareStack(); - } - $next = $this->tip; - $this->tip = function ( - ServerRequestInterface $request, - ResponseInterface $response - ) use ( - $callable, - $next - ) { - $result = call_user_func($callable, $request, $response, $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->tip)) { - throw new RuntimeException('MiddlewareStack can only be seeded once.'); - } - if ($kernel === null) { - $kernel = $this; - } - $this->tip = $kernel; - } - - /** - * Call middleware stack - * - * @param ServerRequestInterface $request A request object - * @param ResponseInterface $response A response object - * - * @return ResponseInterface - */ - public function callMiddlewareStack(ServerRequestInterface $request, ResponseInterface $response) - { - if (is_null($this->tip)) { - $this->seedMiddlewareStack(); - } - /** @var callable $start */ - $start = $this->tip; - $this->middlewareLock = true; - $response = $start($request, $response); - $this->middlewareLock = false; - return $response; - } -} diff --git a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Routable.php b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Routable.php deleted file mode 100644 index c912db433a14..000000000000 --- a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Routable.php +++ /dev/null @@ -1,106 +0,0 @@ -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 - * - * @param string $newPattern - */ - public function setPattern($newPattern) - { - $this->pattern = $newPattern; - } -} diff --git a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Route.php b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Route.php deleted file mode 100644 index fa8be4e44688..000000000000 --- a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Route.php +++ /dev/null @@ -1,349 +0,0 @@ -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; - } - - /** - * This method enables you to override the Route's callable - * - * @param string|\Closure $callable - */ - public function setCallable($callable) - { - $this->callable = $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 string|null $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(); - - $newResponse = $handler($this->callable, $request, $response, $this->arguments); - - 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); - } - } - - return $response; - } -} diff --git a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/RouteGroup.php b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/RouteGroup.php deleted file mode 100644 index 8260bbd6c760..000000000000 --- a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/RouteGroup.php +++ /dev/null @@ -1,47 +0,0 @@ -pattern = $pattern; - $this->callable = $callable; - } - - /** - * Invoke the group to register any Routable objects within it. - * - * @param App $app The App instance to bind/pass to the group callable - */ - public function __invoke(App $app = null) - { - $callable = $this->resolveCallable($this->callable); - if ($callable instanceof Closure && $app !== null) { - $callable = $callable->bindTo($app); - } - - $callable($app); - } -} diff --git a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Router.php b/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Router.php deleted file mode 100644 index 83116288c68c..000000000000 --- a/samples/server/petstore/php-slim/vendor/slim/slim/Slim/Router.php +++ /dev/null @@ -1,455 +0,0 @@ -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; - } - - /** - * @param ContainerInterface $container - */ - public function setContainer(ContainerInterface $container) - { - $this->container = $container; - } - - /** - * 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 $callable The route callable - * - * @return \Slim\Interfaces\RouteInterface - */ - protected function createRoute($methods, $pattern, $callable) - { - $route = new Route($methods, $pattern, $callable, $this->routeGroups, $this->routeCounter); - if (!empty($this->container)) { - $route->setContainer($this->container); - } - - return $route; - } - - /** - * @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/samples/server/petstore/php-slim/vendor/slim/slim/composer.json b/samples/server/petstore/php-slim/vendor/slim/slim/composer.json deleted file mode 100644 index 554a838a95d5..000000000000 --- a/samples/server/petstore/php-slim/vendor/slim/slim/composer.json +++ /dev/null @@ -1,58 +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": "https://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.2", - "psr/container": "^1.0" - }, - "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" - } -}