Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
88.89% covered (warning)
88.89%
16 / 18
0.00% covered (danger)
0.00%
0 / 1
CRAP
0.00% covered (danger)
0.00%
0 / 1
GzipResponse
88.89% covered (warning)
88.89%
16 / 18
0.00% covered (danger)
0.00%
0 / 1
9.11
0.00% covered (danger)
0.00%
0 / 1
 handle
88.89% covered (warning)
88.89%
16 / 18
0.00% covered (danger)
0.00%
0 / 1
9.11
1<?php
2
3namespace App\Http\Middleware;
4
5use Closure;
6use Illuminate\Http\Request;
7use Symfony\Component\HttpFoundation\BinaryFileResponse;
8use Symfony\Component\HttpFoundation\StreamedResponse;
9
10class GzipResponse
11{
12    /**
13     * Handle an incoming request.
14     *
15     * @return mixed
16     */
17    public function handle(Request $request, Closure $next)
18    {
19        ini_set('memory_limit', '-1');
20        session()->save();
21
22        // Skip CORS preflight requests entirely
23        if ($request->isMethod('OPTIONS')) {
24            return $next($request);
25        }
26
27        $response = $next($request);
28
29        // Skip for API docs, binary downloads, and streamed responses
30        if ($request->is('docs/api*')
31            || $response instanceof BinaryFileResponse
32            || $response instanceof StreamedResponse
33        ) {
34            return $response;
35        }
36
37        // Only re-encode JSON responses to normalize unicode/slashes
38        if (is_array($response->getOriginalContent()) || is_object($response->getOriginalContent())) {
39            $rawContent = $response->getContent();
40            $decoded = json_decode($rawContent, true, 1024);
41
42            if (json_last_error() === JSON_ERROR_NONE && $decoded !== null) {
43                $response->setContent(
44                    json_encode($decoded, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE)
45                );
46            }
47
48            $response->headers->set('Content-Type', 'application/json');
49        }
50
51        return $response;
52    }
53}