Viewing file: PreventRequestsDuringMaintenance.php (3.84 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?php
namespace Illuminate\Foundation\Http\Middleware;
use Closure; use Illuminate\Contracts\Foundation\Application; use Illuminate\Foundation\Http\MaintenanceModeBypassCookie; use Symfony\Component\HttpKernel\Exception\HttpException;
class PreventRequestsDuringMaintenance { /** * The application implementation. * * @var \Illuminate\Contracts\Foundation\Application */ protected $app;
/** * The URIs that should be accessible while maintenance mode is enabled. * * @var array */ protected $except = [];
/** * Create a new middleware instance. * * @param \Illuminate\Contracts\Foundation\Application $app * @return void */ public function __construct(Application $app) { $this->app = $app; }
/** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed * * @throws \Symfony\Component\HttpKernel\Exception\HttpException */ public function handle($request, Closure $next) { if ($this->app->isDownForMaintenance()) { $data = json_decode(file_get_contents($this->app->storagePath().'/framework/down'), true);
if (isset($data['secret']) && $request->path() === $data['secret']) { return $this->bypassResponse($data['secret']); }
if ($this->hasValidBypassCookie($request, $data) || $this->inExceptArray($request)) { return $next($request); }
if (isset($data['redirect'])) { $path = $data['redirect'] === '/' ? $data['redirect'] : trim($data['redirect'], '/');
if ($request->path() !== $path) { return redirect($path); } }
if (isset($data['template'])) { return response( $data['template'], $data['status'] ?? 503, isset($data['retry']) ? ['Retry-After' => $data['retry']] : [] ); }
throw new HttpException( $data['status'] ?? 503, 'Service Unavailable', null, isset($data['retry']) ? ['Retry-After' => $data['retry']] : [] ); }
return $next($request); }
/** * Determine if the incoming request has a maintenance mode bypass cookie. * * @param \Illuminate\Http\Request $request * @param array $data * @return bool */ protected function hasValidBypassCookie($request, array $data) { return isset($data['secret']) && $request->cookie('laravel_maintenance') && MaintenanceModeBypassCookie::isValid( $request->cookie('laravel_maintenance'), $data['secret'] ); }
/** * Determine if the request has a URI that should be accessible in maintenance mode. * * @param \Illuminate\Http\Request $request * @return bool */ protected function inExceptArray($request) { foreach ($this->except as $except) { if ($except !== '/') { $except = trim($except, '/'); }
if ($request->fullUrlIs($except) || $request->is($except)) { return true; } }
return false; }
/** * Redirect the user back to the root of the application with a maintenance mode bypass cookie. * * @param string $secret * @return \Illuminate\Http\RedirectResponse */ protected function bypassResponse(string $secret) { return redirect('/')->withCookie( MaintenanceModeBypassCookie::create($secret) ); } }
|