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

BlockSpam   A

Complexity

Total Complexity 6

Size/Duplication

Total Lines 43
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 2

Importance

Changes 2
Bugs 0 Features 0
Metric Value
wmc 6
c 2
b 0
f 0
lcom 0
cbo 2
dl 0
loc 43
rs 10

2 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 8 2
A __invoke() 0 19 4
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