LaravelCaffeineDripMiddleware::makeRegex()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 3
rs 10
c 0
b 0
f 0
cc 1
eloc 1
nc 1
nop 1
1
<?php namespace GeneaLabs\LaravelCaffeine\Http\Middleware;
2
3
use Closure;
4
use GeneaLabs\LaravelCaffeine\Dripper;
5
use Illuminate\Http\Request;
6
7
class LaravelCaffeineDripMiddleware
8
{
9
    public function handle(Request $request, Closure $next)
10
    {
11
        $response = $next($request);
12
13
        $content = $response->getContent();
14
15
        if (! is_string($content) || strlen(trim($content)) === 0) {
16
            return $response;
17
        }
18
19
        $shouldDripRegexp = $this->makeRegex([
20
            '<meta\s+',
21
            '(name\s*=\s*[\'"]caffeinated[\'"]\s+content\s*=\s*[\'"]false[\'"]',
22
            '|content\s*=\s*[\'"]false[\'"]\s+name\s*=\s*[\'"]caffeinated[\'"])',
23
        ]);
24
25
        $shouldNotDrip = preg_match($shouldDripRegexp, $content);
26
27
        if ($shouldNotDrip) {
28
            return $response;
29
        }
30
31
        $formTokenRegexp = $this->makeRegex([
32
            "<input.*?name\s*=\s*[\'\"]_token[\'\"]",
33
        ]);
34
        $metaTokenRegexp = $this->makeRegex([
35
            "<meta.*?name\s*=\s*[\'\"]csrf[_-]token[\'\"]",
36
        ]);
37
        $hasNoFormToken = ! preg_match($formTokenRegexp, $content);
38
        $hasNoMetaToken = ! preg_match($metaTokenRegexp, $content);
39
40
        if ($hasNoFormToken && $hasNoMetaToken) {
41
            return $response;
42
        }
43
44
        $dripper = (new Dripper);
45
        $content = preg_replace('/(<\/html>)\s*\z/', $dripper->html . "</html>", $content);
46
47
        if (! preg_match_all('/(<\/html>)\s*\z/', $content, $matches)) {
48
            $content .= $dripper->html;
49
        }
50
51
        $original = $response->original;
52
        $response->setContent($content);
53
        $response->original = $original;
54
55
        return $response;
56
    }
57
58
    protected function makeRegex(array $regexp) : string
59
    {
60
        return '/' . implode('', $regexp) . '/';
61
    }
62
}
63