Skip to content

Instantly share code, notes, and snippets.

@djekl
Last active June 21, 2025 13:35
Show Gist options
  • Save djekl/7c437a85731b215e9c75abe5a6ffe917 to your computer and use it in GitHub Desktop.
Save djekl/7c437a85731b215e9c75abe5a6ffe917 to your computer and use it in GitHub Desktop.
Laravel Middleware to automatically gunzip content if it states gzip in "Content-Encoding" header
<?php
declare(strict_types=1);
namespace App\Http\Middleware;
use Closure;
use HttpResponseException;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
use Throwable;
class GunzipResponseMiddleware
{
/**
* @throws HttpResponseException
*/
public function handle(Request $request, Closure $next): Response
{
if ('gzip' === $request->header(key: 'Content-Encoding')) {
$gzipped_content = $request->getContent();
$request->headers->remove('Content-Encoding');
try {
$content = gzdecode(data: $gzipped_content);
} catch (Throwable $e) {
throw new HttpResponseException(
message: 'Failed to decode gzipped content: ' . $e->getMessage(),
code: Response::HTTP_UNSUPPORTED_MEDIA_TYPE,
);
}
$new_request = new Request;
$new_request->initialize(
query: $request->query->all(),
request: $request->request->all(),
attributes: $request->attributes->all(),
cookies: $request->cookies->all(),
files: $request->files->all(),
server: $request->server->all(),
content: $content,
);
app()->instance(abstract: 'request', instance: $new_request);
app()->instance(abstract: Request::class, instance: $new_request);
}
return $next($request);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment