From 7a9a8fbdf2e9b6c2c6c9196ce24d9e6a0e24e994 Mon Sep 17 00:00:00 2001 From: Andrej Badin Date: Mon, 8 Dec 2014 01:45:29 +0100 Subject: [PATCH 1/4] Throw an Exception for invalid API version When requesting invalid API version, throw an exception which gets transformed into JSON response. --- src/Routing/GroupCollection.php | 40 ++++++++++++++++----------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/src/Routing/GroupCollection.php b/src/Routing/GroupCollection.php index dc82c362c..7a78eadc0 100644 --- a/src/Routing/GroupCollection.php +++ b/src/Routing/GroupCollection.php @@ -4,6 +4,7 @@ use Dingo\Api\Config; use Illuminate\Http\Request; +use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; class GroupCollection { @@ -31,8 +32,7 @@ class GroupCollection /** * Create a new version collection instance. * - * @param \Dingo\Api\Config $config - * + * @param \Dingo\Api\Config $config * @return void */ public function __construct(Config $config) @@ -43,9 +43,8 @@ public function __construct(Config $config) /** * Add a group to the collection. * - * @param string $version - * @param array $options - * + * @param string $version + * @param array $options * @return \Dingo\Api\Routing\RouteCollection */ public function add($version, array $options) @@ -58,8 +57,7 @@ public function add($version, array $options) /** * Determine if the version exists on the collection. * - * @param string $version - * + * @param string $version * @return bool */ public function has($version) @@ -70,8 +68,7 @@ public function has($version) /** * Get a matching API route collection from the request. * - * @param \Illuminate\Http\Request $request - * + * @param \Illuminate\Http\Request $request * @return \Dingo\Api\Routing\RouteCollection|null */ public function getByRequest(Request $request) @@ -94,23 +91,28 @@ public function getDefault() /** * Get an API route collection for a given version. * - * @param string $version - * + * @param string $version * @return \Dingo\Api\Routing\RouteCollection|null + * @throws \Symfony\Component\HttpKernel\Exception\BadRequestHttpException */ public function getByVersion($version) { - return array_first($this->groups, function ($key, $collection) use ($version) { + $group = array_first($this->groups, function ($key, $collection) use ($version) { return $collection->matchesVersion($version); }); + + if (is_null($group)) { + throw new BadRequestHttpException("Requested API version is invalid."); + } + + return $group; } /** * Get an API route collection for a given domain and optionally a version. * - * @param string $domain - * @param string $version - * + * @param string $domain + * @param string $version * @return \Dingo\Api\Routing\RouteCollection|null */ public function getByDomain($domain, $version = null) @@ -127,9 +129,8 @@ public function getByDomain($domain, $version = null) /** * Get an aPI route collection for a given domain or a given version. * - * @param string $domain - * @param string $version - * + * @param string $domain + * @param string $version * @return \Dingo\Api\Routing\RouteCollection|null */ public function getByDomainOrVersion($domain, $version) @@ -144,8 +145,7 @@ public function getByDomainOrVersion($domain, $version) /** * Get an API route collection for a given array of options. * - * @param array $options - * + * @param array $options * @return array */ public function getByOptions($options) From 6d1fd1643a78c4749ebca2f20b04d21336ff9179 Mon Sep 17 00:00:00 2001 From: Andrej Badin Date: Mon, 8 Dec 2014 11:16:42 +0100 Subject: [PATCH 2/4] Revert DocBlock formatting changes. --- src/Routing/GroupCollection.php | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/Routing/GroupCollection.php b/src/Routing/GroupCollection.php index 7a78eadc0..c69e3d088 100644 --- a/src/Routing/GroupCollection.php +++ b/src/Routing/GroupCollection.php @@ -33,6 +33,7 @@ class GroupCollection * Create a new version collection instance. * * @param \Dingo\Api\Config $config + * * @return void */ public function __construct(Config $config) @@ -45,6 +46,7 @@ public function __construct(Config $config) * * @param string $version * @param array $options + * * @return \Dingo\Api\Routing\RouteCollection */ public function add($version, array $options) @@ -58,6 +60,7 @@ public function add($version, array $options) * Determine if the version exists on the collection. * * @param string $version + * * @return bool */ public function has($version) @@ -69,6 +72,7 @@ public function has($version) * Get a matching API route collection from the request. * * @param \Illuminate\Http\Request $request + * * @return \Dingo\Api\Routing\RouteCollection|null */ public function getByRequest(Request $request) @@ -92,8 +96,10 @@ public function getDefault() * Get an API route collection for a given version. * * @param string $version - * @return \Dingo\Api\Routing\RouteCollection|null + * * @throws \Symfony\Component\HttpKernel\Exception\BadRequestHttpException + * + * @return \Dingo\Api\Routing\RouteCollection|null */ public function getByVersion($version) { @@ -113,6 +119,7 @@ public function getByVersion($version) * * @param string $domain * @param string $version + * * @return \Dingo\Api\Routing\RouteCollection|null */ public function getByDomain($domain, $version = null) @@ -131,6 +138,7 @@ public function getByDomain($domain, $version = null) * * @param string $domain * @param string $version + * * @return \Dingo\Api\Routing\RouteCollection|null */ public function getByDomainOrVersion($domain, $version) @@ -146,6 +154,7 @@ public function getByDomainOrVersion($domain, $version) * Get an API route collection for a given array of options. * * @param array $options + * * @return array */ public function getByOptions($options) From e9cea177ed7d19369188dc6157aaa3485d92585c Mon Sep 17 00:00:00 2001 From: Andrej Badin Date: Mon, 8 Dec 2014 11:44:11 +0100 Subject: [PATCH 3/4] Throw Exception from Router, not GroupCollection --- src/Routing/GroupCollection.php | 9 +-------- src/Routing/Router.php | 11 +++++++++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/Routing/GroupCollection.php b/src/Routing/GroupCollection.php index c69e3d088..73f589046 100644 --- a/src/Routing/GroupCollection.php +++ b/src/Routing/GroupCollection.php @@ -4,7 +4,6 @@ use Dingo\Api\Config; use Illuminate\Http\Request; -use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; class GroupCollection { @@ -103,15 +102,9 @@ public function getDefault() */ public function getByVersion($version) { - $group = array_first($this->groups, function ($key, $collection) use ($version) { + return array_first($this->groups, function ($key, $collection) use ($version) { return $collection->matchesVersion($version); }); - - if (is_null($group)) { - throw new BadRequestHttpException("Requested API version is invalid."); - } - - return $group; } /** diff --git a/src/Routing/Router.php b/src/Routing/Router.php index 3edac2b8f..6dcda76d4 100644 --- a/src/Routing/Router.php +++ b/src/Routing/Router.php @@ -16,6 +16,7 @@ use Illuminate\Http\Response as IlluminateResponse; use Dingo\Api\Exception\InvalidAcceptHeaderException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; +use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; use Illuminate\Routing\RouteCollection as IlluminateRouteCollection; use Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException; @@ -341,11 +342,17 @@ protected function attachApiFilters(Route $route) protected function findRoute($request) { if ($this->isApiRequest($request)) { - $route = $this->api->getByVersion($this->currentVersion)->match($request); + $routes = $this->api->getByVersion($this->currentVersion); } else { - $route = $this->routes->match($request); + $routes = $this->routes; } + if (! $routes) { + throw new BadRequestHttpException("Requested API version is invalid."); + } + + $route = $routes->match($request); + return $this->current = $this->substituteBindings($route); } From 09c0814e98d422b77d207bdc1a7d132f4b34f5d2 Mon Sep 17 00:00:00 2001 From: Andrej Badin Date: Mon, 8 Dec 2014 13:41:37 +0100 Subject: [PATCH 4/4] Revert any changes to GroupCollection --- src/Routing/GroupCollection.php | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/src/Routing/GroupCollection.php b/src/Routing/GroupCollection.php index 73f589046..dc82c362c 100644 --- a/src/Routing/GroupCollection.php +++ b/src/Routing/GroupCollection.php @@ -31,7 +31,7 @@ class GroupCollection /** * Create a new version collection instance. * - * @param \Dingo\Api\Config $config + * @param \Dingo\Api\Config $config * * @return void */ @@ -43,8 +43,8 @@ public function __construct(Config $config) /** * Add a group to the collection. * - * @param string $version - * @param array $options + * @param string $version + * @param array $options * * @return \Dingo\Api\Routing\RouteCollection */ @@ -58,7 +58,7 @@ public function add($version, array $options) /** * Determine if the version exists on the collection. * - * @param string $version + * @param string $version * * @return bool */ @@ -70,7 +70,7 @@ public function has($version) /** * Get a matching API route collection from the request. * - * @param \Illuminate\Http\Request $request + * @param \Illuminate\Http\Request $request * * @return \Dingo\Api\Routing\RouteCollection|null */ @@ -94,9 +94,7 @@ public function getDefault() /** * Get an API route collection for a given version. * - * @param string $version - * - * @throws \Symfony\Component\HttpKernel\Exception\BadRequestHttpException + * @param string $version * * @return \Dingo\Api\Routing\RouteCollection|null */ @@ -110,8 +108,8 @@ public function getByVersion($version) /** * Get an API route collection for a given domain and optionally a version. * - * @param string $domain - * @param string $version + * @param string $domain + * @param string $version * * @return \Dingo\Api\Routing\RouteCollection|null */ @@ -129,8 +127,8 @@ public function getByDomain($domain, $version = null) /** * Get an aPI route collection for a given domain or a given version. * - * @param string $domain - * @param string $version + * @param string $domain + * @param string $version * * @return \Dingo\Api\Routing\RouteCollection|null */ @@ -146,7 +144,7 @@ public function getByDomainOrVersion($domain, $version) /** * Get an API route collection for a given array of options. * - * @param array $options + * @param array $options * * @return array */