Completed
Push — master ( 42adad...131718 )
by Peter
01:27
created

ErrorDetector::detect()   B

Complexity

Conditions 5
Paths 4

Size

Total Lines 21
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 10
CRAP Score 5

Importance

Changes 0
Metric Value
dl 0
loc 21
ccs 10
cts 10
cp 1
rs 8.7624
c 0
b 0
f 0
cc 5
eloc 11
nc 4
nop 3
crap 5
1
<?php
2
3
/**
4
 * AnimeDb package.
5
 *
6
 * @author    Peter Gribanov <[email protected]>
7
 * @copyright Copyright (c) 2011, Peter Gribanov
8
 * @license   http://opensource.org/licenses/GPL-3.0 GPL v3
9
 */
10
11
namespace AnimeDb\Bundle\WorldArtBrowserBundle\Service;
12
13
use AnimeDb\Bundle\WorldArtBrowserBundle\Exception\BannedException;
14
use AnimeDb\Bundle\WorldArtBrowserBundle\Exception\NotFoundException;
15
use Psr\Http\Message\ResponseInterface;
16
17
class ErrorDetector
18
{
19
    /**
20
     * @param ResponseInterface $response
21
     * @param string            $path
22
     * @param array             $options
23
     *
24
     * @return string
25
     */
26 7
    public function detect(ResponseInterface $response, $path, array $options = [])
27
    {
28 7
        if ($response->getStatusCode() == 404) {
29 1
            throw NotFoundException::page();
30
        }
31
32 6
        $content = $response->getBody()->getContents();
33
34 6
        if ($this->isBanned($content)) {
35 2
            throw BannedException::banned();
36
        }
37
38
        if (
39 4
            strpos($path, '/animation/animation.php') !== false &&
40 4
            ($id = $this->isAkiraSubstitution($content, $path, $options))
41
        ) {
42 2
            throw NotFoundException::anime($id);
43
        }
44
45 2
        return $content;
46
    }
47
48
    /**
49
     * @param string $content
50
     *
51
     * @return bool
52
     */
53 6
    private function isBanned($content)
54
    {
55
        return
56 6
            strpos($content, 'url=http://www.world-art.ru/not_connect.html') !== false ||
57 6
            strpos($content, 'NETGEAR ProSecure') !== false
58
        ;
59
    }
60
61
    /**
62
     * Return anime Akira page if anime not found.
63
     *
64
     * @see http://www.world-art.ru/animation/animation.php?id=10000000
65
     *
66
     * @param string $content
67
     * @param string $path
68
     * @param array  $options
69
     *
70
     * @return int
71
     */
72 4
    private function isAkiraSubstitution($content, $path, array $options)
73
    {
74
        // check ID in options
75 4
        if (isset($options['query']['id']) && $this->isNotAkira($options['query']['id'], $content)) {
76 1
            return $options['query']['id'];
77
        }
78
79
        // check ID in path
80 3
        if (preg_match('/\?id=(\d+)/', $path, $match) && $this->isNotAkira($match[1], $content)) {
81 1
            return $match[1];
82
        }
83
84 2
        return 0;
85
    }
86
87
    /**
88
     * Is not a Akira.
89
     *
90
     * @see http://www.world-art.ru/animation/animation.php?id=1
91
     *
92
     * @param int    $id
93
     * @param string $content
94
     *
95
     * @return bool
96
     */
97 4
    private function isNotAkira($id, $content)
98
    {
99 4
        return $id != 1 && strpos($content, '/animation/img/1000/1/1.jpg') !== false;
100
    }
101
}
102