Canonicalizer   A
last analyzed

Complexity

Total Complexity 25

Size/Duplication

Total Lines 126
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 1

Importance

Changes 0
Metric Value
wmc 25
lcom 1
cbo 1
dl 0
loc 126
rs 10
c 0
b 0
f 0

6 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 12 2
A isCanonicalized() 0 4 1
C www() 0 21 10
C trailingSlash() 0 23 9
A toString() 0 4 1
A __toString() 0 8 2
1
<?php
2
/**
3
 * Webino (http://webino.sk)
4
 *
5
 * @link        https://github.com/webino/WebinoCanonicalRedirect for the canonical source repository
6
 * @copyright   Copyright (c) 2014-2017 Webino, s. r. o. (http://webino.sk)
7
 * @author      Peter Bačinský <[email protected]>
8
 * @license     BSD-3-Clause
9
 */
10
11
namespace WebinoCanonicalRedirect\Uri;
12
13
use Zend\Uri\UriInterface;
14
15
/**
16
 * URI Canonicalizer
17
 */
18
class Canonicalizer
19
{
20
    /**
21
     * @var UriInterface
22
     */
23
    protected $uri;
24
25
    /**
26
     * @var string
27
     */
28
    protected $baseUrl;
29
30
    /**
31
     * @var bool
32
     */
33
    protected $isCanonicalized = false;
34
35
    /**
36
     * @param UriInterface $uri
37
     * @param null $baseUrl
38
     */
39
    public function __construct(UriInterface $uri, $baseUrl = null)
40
    {
41
        $this->uri     = $uri;
42
        $this->baseUrl = $baseUrl;
43
        $uriPath       = $this->uri->getPath();
44
45
        if (false !== strpos($uriPath, '/index.php')) {
0 ignored issues
show
Coding Style introduced by
Blank line found at start of control structure
Loading history...
46
47
            $this->uri->setPath(str_replace('/index.php', '', $uriPath));
48
            $this->isCanonicalized = true;
49
        }
50
    }
51
52
    /**
53
     * Return true if URI was canonicalized
54
     *
55
     * @return bool
56
     */
57
    public function isCanonicalized()
58
    {
59
        return $this->isCanonicalized;
60
    }
61
62
    /**
63
     * Canonicalize URI to use www or not
64
     *
65
     * @param bool $useWww
66
     * @return self
67
     */
68
    public function www($useWww)
69
    {
70
        $host        = $this->uri->getHost();
71
        $has         = (0 === strpos($host, 'www'));
72
        $dotsCount   = substr_count($host, '.');
73
        $isSubdomain = (!$has && 2 <= $dotsCount);
74
        $isLocalhost = (!$has && 0 === $dotsCount);
75
76
        if (($has && $useWww) || (!$has && !$useWww)
77
            || $isSubdomain
78
            || $isLocalhost
79
        ) {
80
            return $this;
81
        }
82
83
        $host = $useWww ? 'www.' . $host : preg_replace('~^www\.~', '', $host);
84
        $this->uri->setHost($host);
85
        $this->isCanonicalized = true;
86
87
        return $this;
88
    }
89
90
    /**
91
     * Canonicalize URI to use trailingSlash or not
92
     *
93
     * @param bool $useTrailingSlash
94
     * @return self
95
     */
96
    public function trailingSlash($useTrailingSlash)
97
    {
98
        $fullUriPath = $this->uri->getPath();
99
        $uriPath     = trim($fullUriPath, '/');
100
        $baseUrl     = trim($this->baseUrl, '/');
101
102
        if (empty($uriPath) || $uriPath === $baseUrl) {
103
            return $this;
104
        }
105
106
        $has = ('/' === $fullUriPath[strlen($fullUriPath) - 1]);
107
        $use = ($useTrailingSlash && !preg_match('~\.[a-zA-Z0-9]{1,}$~', $uriPath));
108
109
        if (($has && $use) || (!$has && !$use)) {
110
            return $this;
111
        }
112
113
        $newUriPath = $use ? '/' . $uriPath . '/' : '/' . $uriPath;
114
        $this->uri->setPath($newUriPath);
115
        $this->isCanonicalized = true;
116
117
        return $this;
118
    }
119
120
    /**
121
     * Return URI as string
122
     *
123
     * @return string
124
     */
125
    public function toString()
126
    {
127
        return $this->uri->toString();
128
    }
129
130
    /**
131
     * Magic method to convert the URI to a string
132
     *
133
     * @return string
134
     */
135
    public function __toString()
136
    {
137
        try {
138
            return $this->toString();
139
        } catch (\Exception $exc) {
140
            return '';
141
        }
142
    }
143
}
144