Completed
Push — master ( 00ed35...63fbb3 )
by Oscar
10:20
created

BlockSpam::__invoke()   A

Complexity

Conditions 4
Paths 5

Size

Total Lines 19
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 19
rs 9.2
cc 4
eloc 10
nc 5
nop 3
1
<?php
2
3
namespace Psr7Middlewares\Middleware;
4
5
use Psr7Middlewares\Middleware;
6
use Psr\Http\Message\ServerRequestInterface;
7
use Psr\Http\Message\ResponseInterface;
8
use RuntimeException;
9
10
/**
11
 * Middleware to block request from blacklist referrer.
12
 */
13
class BlockSpam
14
{
15
    private $spammers;
16
    private $list;
17
18
    public function __construct($spammers = null)
19
    {
20
        if ($spammers === null) {
21
            $spammers = __DIR__.'/../../../../vendor/piwik/referrer-spam-blacklist/spammers.txt';
22
        }
23
24
        $this->spammers = $spammers;
25
    }
26
27
    /**
28
     * Execute the middleware.
29
     *
30
     * @param ServerRequestInterface $request
31
     * @param ResponseInterface      $response
32
     * @param callable               $next
33
     *
34
     * @return ResponseInterface
35
     */
36
    public function __invoke(ServerRequestInterface $request, ResponseInterface $response, callable $next)
37
    {
38
        if ($this->list === null) {
39
            if (!is_file($this->spammers)) {
40
                throw new RuntimeException(sprintf('The spammers file "%s" doest not exists', $this->spammers));
41
            }
42
43
            $this->list = file($this->spammers, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
44
        }
45
46
        $referer = parse_url($request->getHeaderLine('Referer'), PHP_URL_HOST);
47
        $referer = preg_replace('/^(www\.)/i', '', $referer);
48
49
        if (in_array($referer, $this->list, true)) {
50
            return $response->withStatus(403);
51
        }
52
53
        return $next($request, $response);
54
    }
55
}
56