Last active
June 21, 2025 13:35
-
-
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
This file contains hidden or 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
<?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