-
Notifications
You must be signed in to change notification settings - Fork 10.9k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
93ed7f4
commit 1344e2e
Showing
22 changed files
with
1,334 additions
and
15 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
82 changes: 82 additions & 0 deletions
82
src/Illuminate/Foundation/Http/Middleware/HandlePrecognitiveRequests.php
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,82 @@ | ||
<?php | ||
|
||
namespace Illuminate\Foundation\Http\Middleware; | ||
|
||
use Illuminate\Container\Container; | ||
use Illuminate\Foundation\Http\FormRequest; | ||
use Illuminate\Foundation\Precognition; | ||
use Illuminate\Foundation\Routing\PrecognitionCallableDispatcher; | ||
use Illuminate\Foundation\Routing\PrecognitionControllerDispatcher; | ||
use Illuminate\Http\Response; | ||
use Illuminate\Routing\Contracts\CallableDispatcher as CallableDispatcherContract; | ||
use Illuminate\Routing\Contracts\ControllerDispatcher as ControllerDispatcherContract; | ||
|
||
class HandlePrecognitiveRequests | ||
{ | ||
/** | ||
*The container instance. | ||
* | ||
* @var \Illuminate\Container\Container | ||
*/ | ||
protected $container; | ||
|
||
/** | ||
* Create a new middleware instance. | ||
* | ||
* @param \Illuminate\Container\Container $container | ||
* @return void | ||
*/ | ||
public function __construct(Container $container) | ||
{ | ||
$this->container = $container; | ||
} | ||
|
||
/** | ||
* Handle an incoming request. | ||
* | ||
* @param \Illuminate\Http\Request $request | ||
* @param \Closure $next | ||
* @return \Illuminate\Http\Response | ||
*/ | ||
public function handle($request, $next) | ||
{ | ||
if (! $request->isAttemptingPrecognition()) { | ||
return $this->appendVaryHeader($request, $next($request)); | ||
} | ||
|
||
$this->prepareForPrecognition($request); | ||
|
||
return tap($next($request), function ($response) use ($request) { | ||
$this->appendVaryHeader($request, $response->header('Precognition', 'true')); | ||
}); | ||
} | ||
|
||
/** | ||
* Prepare to handle a precognitive request. | ||
* | ||
* @param \Illuminate\Http\Request $request | ||
* @return void | ||
*/ | ||
protected function prepareForPrecognition($request) | ||
{ | ||
$request->attributes->set('precognitive', true); | ||
|
||
$this->container->bind(CallableDispatcherContract::class, fn ($app) => new PrecognitionCallableDispatcher($app)); | ||
$this->container->bind(ControllerDispatcherContract::class, fn ($app) => new PrecognitionControllerDispatcher($app)); | ||
} | ||
|
||
/** | ||
* Append the appropriate "Vary" header to the given response. | ||
* | ||
* @param \Illuminate\Http\Request $request | ||
* @param \Illuminate\Http\Response $response | ||
* @return \Illuminate\Http\Response $response | ||
*/ | ||
protected function appendVaryHeader($request, $response) | ||
{ | ||
return $response->header('Vary', implode(', ', array_filter([ | ||
$response->headers->get('Vary'), | ||
'Precognition', | ||
]))); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
<?php | ||
|
||
namespace Illuminate\Foundation; | ||
|
||
use Illuminate\Http\Response; | ||
|
||
class Precognition | ||
{ | ||
/** | ||
* Get the "after" validation hook that can be used for precognition requests. | ||
* | ||
* @param \Illuminate\Http\Request $request | ||
* @return \Closure | ||
*/ | ||
public static function afterValidationHook($request) | ||
{ | ||
return function ($validator) use ($request) { | ||
if ($validator->messages()->isEmpty() && $request->headers->has('Precognition-Validate-Only')) { | ||
abort(204); | ||
} | ||
}; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
24 changes: 24 additions & 0 deletions
24
src/Illuminate/Foundation/Routing/PrecognitionCallableDispatcher.php
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
<?php | ||
|
||
namespace Illuminate\Foundation\Routing; | ||
|
||
use Illuminate\Http\Response; | ||
use Illuminate\Routing\CallableDispatcher; | ||
use Illuminate\Routing\Route; | ||
|
||
class PrecognitionCallableDispatcher extends CallableDispatcher | ||
{ | ||
/** | ||
* Dispatch a request to a given callable. | ||
* | ||
* @param \Illuminate\Routing\Route $route | ||
* @param callable $callable | ||
* @return mixed | ||
*/ | ||
public function dispatch(Route $route, $callable) | ||
{ | ||
$this->resolveParameters($route, $callable); | ||
|
||
abort(204); | ||
} | ||
} |
46 changes: 46 additions & 0 deletions
46
src/Illuminate/Foundation/Routing/PrecognitionControllerDispatcher.php
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
<?php | ||
|
||
namespace Illuminate\Foundation\Routing; | ||
|
||
use Illuminate\Http\Response; | ||
use Illuminate\Routing\ControllerDispatcher; | ||
use Illuminate\Routing\Route; | ||
use RuntimeException; | ||
|
||
class PrecognitionControllerDispatcher extends ControllerDispatcher | ||
{ | ||
/** | ||
* Dispatch a request to a given controller and method. | ||
* | ||
* @param \Illuminate\Routing\Route $route | ||
* @param mixed $controller | ||
* @param string $method | ||
* @return void | ||
*/ | ||
public function dispatch(Route $route, $controller, $method) | ||
{ | ||
$this->ensureMethodExists($controller, $method); | ||
|
||
$this->resolveParameters($route, $controller, $method); | ||
|
||
abort(204); | ||
} | ||
|
||
/** | ||
* Ensure that the given method exists on the controller. | ||
* | ||
* @param object $controller | ||
* @param string $method | ||
* @return $this | ||
*/ | ||
protected function ensureMethodExists($controller, $method) | ||
{ | ||
if (method_exists($controller, $method)) { | ||
return $this; | ||
} | ||
|
||
$class = $controller::class; | ||
|
||
throw new RuntimeException("Attempting to predict the outcome of the [{$class}::{$method}()] method but the method is not defined."); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
<?php | ||
|
||
namespace Illuminate\Http\Concerns; | ||
|
||
use Illuminate\Support\Collection; | ||
|
||
trait CanBePrecognitive | ||
{ | ||
/** | ||
* Filter the given array of rules into an array of rules that are included in precognitive headers. | ||
* | ||
* @param array $rules | ||
* @return array | ||
*/ | ||
public function filterPrecognitiveRules($rules) | ||
{ | ||
if (! $this->headers->has('Precognition-Validate-Only')) { | ||
return $rules; | ||
} | ||
|
||
return Collection::make($rules) | ||
->only(explode(',', $this->header('Precognition-Validate-Only'))) | ||
->all(); | ||
} | ||
|
||
/** | ||
* Determine if the request is attempting to be precognitive. | ||
* | ||
* @return bool | ||
*/ | ||
public function isAttemptingPrecognition() | ||
{ | ||
return $this->header('Precognition') === 'true'; | ||
} | ||
|
||
/** | ||
* Determine if the request is precognitive. | ||
* | ||
* @return bool | ||
*/ | ||
public function isPrecognitive() | ||
{ | ||
return $this->attributes->get('precognitive', false); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.