mirror of
https://github.com/BookStackApp/BookStack.git
synced 2026-01-03 23:42:28 +03:00
Thumbnails: Added OOM handling and regen endpoint
- Added some level of app out-of-memory handling so we can show a proper error message upon OOM events. - Added endpoint and image-manager button/action for regenerating thumbnails for an image so they can be re-created upon failure.
This commit is contained in:
@@ -10,6 +10,7 @@ use Illuminate\Http\Exceptions\PostTooLargeException;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Validation\ValidationException;
|
||||
use Symfony\Component\ErrorHandler\Error\FatalError;
|
||||
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
|
||||
use Throwable;
|
||||
|
||||
@@ -36,6 +37,15 @@ class Handler extends ExceptionHandler
|
||||
'password_confirmation',
|
||||
];
|
||||
|
||||
/**
|
||||
* A function to run upon out of memory.
|
||||
* If it returns a response, that will be provided back to the request
|
||||
* upon an out of memory event.
|
||||
*
|
||||
* @var ?callable<?\Illuminate\Http\Response>
|
||||
*/
|
||||
protected $onOutOfMemory = null;
|
||||
|
||||
/**
|
||||
* Report or log an exception.
|
||||
*
|
||||
@@ -60,6 +70,13 @@ class Handler extends ExceptionHandler
|
||||
*/
|
||||
public function render($request, Throwable $e)
|
||||
{
|
||||
if ($e instanceof FatalError && str_contains($e->getMessage(), 'bytes exhausted (tried to allocate') && $this->onOutOfMemory) {
|
||||
$response = call_user_func($this->onOutOfMemory);
|
||||
if ($response) {
|
||||
return $response;
|
||||
}
|
||||
}
|
||||
|
||||
if ($e instanceof PostTooLargeException) {
|
||||
$e = new NotifyException(trans('errors.server_post_limit'), '/', 413);
|
||||
}
|
||||
@@ -71,6 +88,24 @@ class Handler extends ExceptionHandler
|
||||
return parent::render($request, $e);
|
||||
}
|
||||
|
||||
/**
|
||||
* Provide a function to be called when an out of memory event occurs.
|
||||
* If the callable returns a response, this response will be returned
|
||||
* to the request upon error.
|
||||
*/
|
||||
public function prepareForOutOfMemory(callable $onOutOfMemory)
|
||||
{
|
||||
$this->onOutOfMemory = $onOutOfMemory;
|
||||
}
|
||||
|
||||
/**
|
||||
* Forget the current out of memory handler, if existing.
|
||||
*/
|
||||
public function forgetOutOfMemoryHandler()
|
||||
{
|
||||
$this->onOutOfMemory = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the given request is an API request.
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user