Skip to content

Instantly share code, notes, and snippets.

@alistaircol
Last active August 25, 2022 12:08
Show Gist options
  • Save alistaircol/e6f2f3cadc15400026048c8e8ff02a4f to your computer and use it in GitHub Desktop.
Save alistaircol/e6f2f3cadc15400026048c8e8ff02a4f to your computer and use it in GitHub Desktop.
Laravel imgproxy response middleware - see https://ac93.uk/articles/laravel-response-middleware-optimise-images-with-imgproxy for more context
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use Imgproxy\UrlBuilder;
use PHPHtmlParser\Dom;
use Throwable;
class ImgproxyCmsContent
{
/**
* @param Request $request
* @param Closure $next
* @return Response
*/
public function handle($request, Closure $next)
{
if ($request->has('no_imgproxy')) {
return $next($request);
}
/** @var Response $response */
$response = $next($request);
$dom = new Dom();
try {
$dom->loadStr($response->getContent());
collect($dom->find('img'))
->reject(function (Dom\Node\HtmlNode $node) {
return Str::of($node->getAttribute('src'))
->endsWith('.svg');
})
->filter(function (Dom\Node\HtmlNode $node) {
$src = Str::of($node->getAttribute('src'));
return $src->startsWith(config('app.url'))
|| $src->startsWith(Storage::disk('s3')->url('.'));
})
->each(function (Dom\Node\HtmlNode $node) {
$node->setAttribute(
'src',
app(UrlBuilder::class)
->build($node->getAttribute('src'), 896, 0)
->useAdvancedMode()
->toString()
);
});
return $response->setContent((string) $dom);
} catch (Throwable $e) {
return $response;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment