Skip to content

Commit ccf6d3f

Browse files
author
Anas
authored
Merge pull request #110 from dreamfactorysoftware/develop
Fix CORS Preflight Handling for Laravel 9
2 parents c91d00a + 13a6e53 commit ccf6d3f

File tree

5 files changed

+46
-28
lines changed

5 files changed

+46
-28
lines changed

composer.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
"prefer-stable": true,
3232
"require": {
3333
"php": "^8.0",
34-
"fruitcake/laravel-cors": "~3.0.0",
3534
"doctrine/dbal": "^3.1.4",
3635
"guzzlehttp/guzzle": "~7.4.5",
3736
"symfony/yaml": "^6.0",

routes/routes.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
$resourcePathPattern = '[0-9a-zA-ZÀ-ÿ-_@&\#\!=,:;\/\^\$\.\|\{\}\[\]\(\)\*\+\?\' ]+';
1818
$controller = 'DreamFactory\Core\Http\Controllers\RestController';
1919
// Don't use any() below, or include OPTIONS here, breaks CORS
20-
$verbs = ['GET', 'HEAD', 'POST', 'PUT', 'PATCH', 'DELETE'];
20+
$verbs = ['GET', 'HEAD', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'];
2121

2222
Route::get('', $controller . '@index');
2323
// Support old versioning in URL, i.e api/v2 and api/v2/service

src/LaravelServiceProvider.php

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -103,19 +103,9 @@ protected function addAliases()
103103
*/
104104
protected function addMiddleware()
105105
{
106-
// the method name was changed in Laravel 5.4
107-
if (method_exists(\Illuminate\Routing\Router::class, 'aliasMiddleware')) {
108-
Route::aliasMiddleware('df.auth_check', AuthCheck::class);
109-
Route::aliasMiddleware('df.access_check', AccessCheck::class);
110-
Route::aliasMiddleware('df.verb_override', VerbOverrides::class);
111-
} else {
112-
/** @noinspection PhpUndefinedMethodInspection */
113-
Route::middleware('df.auth_check', AuthCheck::class);
114-
/** @noinspection PhpUndefinedMethodInspection */
115-
Route::middleware('df.access_check', AccessCheck::class);
116-
/** @noinspection PhpUndefinedMethodInspection */
117-
Route::middleware('df.verb_override', VerbOverrides::class);
118-
}
106+
Route::aliasMiddleware('df.auth_check', AuthCheck::class);
107+
Route::aliasMiddleware('df.access_check', AccessCheck::class);
108+
Route::aliasMiddleware('df.verb_override', VerbOverrides::class);
119109

120110
/** Add the first user check to the web group */
121111
Route::prependMiddlewareToGroup('web', FirstUserCheck::class);

src/Providers/CorsServiceProvider.php

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@
22

33
namespace DreamFactory\Core\Providers;
44

5-
use Fruitcake\Cors\HandleCors;
6-
use Fruitcake\Cors\CorsService;
5+
use DreamFactory\Core\Services\DfCorsService;
76
use DreamFactory\Core\Models\CorsConfig;
7+
use Fruitcake\Cors\CorsService;
8+
use Illuminate\Http\Middleware\HandleCors;
89
use Illuminate\Database\QueryException;
910
use Illuminate\Contracts\Http\Kernel;
1011
use Illuminate\Http\Request;
@@ -35,21 +36,15 @@ public function register()
3536
*/
3637
public function boot(Request $request, Kernel $kernel)
3738
{
39+
$api_prefix = config('df.api_route_prefix', 'api');
40+
config(['cors.paths' => [$api_prefix . '/*']]);
41+
3842
$config = $this->getOptions($request);
3943
$this->app->singleton(CorsService::class, function () use ($config){
40-
return new CorsService($config);
44+
return new DfCorsService($config);
4145
});
4246

43-
/** @noinspection PhpUndefinedMethodInspection */
44-
//$this->app['router']->middleware('cors', HandleCors::class);
45-
46-
if (method_exists(\Illuminate\Routing\Router::class, 'aliasMiddleware')) {
47-
Route::aliasMiddleware('df.cors', HandleCors::class);
48-
} else {
49-
/** @noinspection PhpUndefinedMethodInspection */
50-
Route::middleware('df.cors', HandleCors::class);
51-
}
52-
47+
Route::aliasMiddleware('df.cors', HandleCors::class);
5348
Route::prependMiddlewareToGroup('df.api', 'df.cors');
5449
}
5550

src/Services/DfCorsService.php

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php
2+
3+
namespace DreamFactory\Core\Services;
4+
5+
use Fruitcake\Cors\CorsService;
6+
use Symfony\Component\HttpFoundation\Request;
7+
use Symfony\Component\HttpFoundation\Response;
8+
9+
class DfCorsService extends CorsService
10+
{
11+
/** @var string[] */
12+
private array $allowedMethodsCopy = [];
13+
14+
15+
public function setOptions(array $options): void
16+
{
17+
$this->allowedMethodsCopy = $options['allowedMethods'] ?? $options['allowed_methods'] ?? $this->allowedMethodsCopy;
18+
parent::setOptions($options);
19+
}
20+
21+
public function handlePreflightRequest(Request $request): Response
22+
{
23+
$response = new Response();
24+
25+
$requestMethod = strtoupper($request->headers->get('Access-Control-Request-Method'));
26+
if(!in_array($requestMethod, $this->allowedMethodsCopy)) {
27+
$response->setStatusCode(405, 'Method not allowed');
28+
} else {
29+
$response->setStatusCode(204);
30+
}
31+
32+
return $this->addPreflightRequestHeaders($response, $request);
33+
}
34+
}

0 commit comments

Comments
 (0)