Skip to content

Commit b9b573f

Browse files
authored
Merge pull request #29 from Suven-p/fix-22-support-wildcard-and-exceptions
Add support for wildcard and exception
2 parents 7ea655f + 32d8d7d commit b9b573f

File tree

2 files changed

+182
-5
lines changed

2 files changed

+182
-5
lines changed

src/Domains/Domain.php

Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,13 @@ class Domain
4646
*/
4747
protected $sub = '';
4848

49+
/**
50+
* PSL rule matching suffix
51+
*
52+
* @var string
53+
*/
54+
protected $rule = '';
55+
4956
/**
5057
* Domain Parts
5158
*
@@ -105,11 +112,29 @@ public function getSuffix(): string
105112
return $this->suffix;
106113
}
107114

108-
for ($i = 3; $i > 0; $i--) {
109-
$joined = \implode('.', \array_slice($this->parts, $i * -1));
115+
for ($i = 0; $i < count($this->parts); $i++) {
116+
$joined = \implode('.', \array_slice($this->parts, $i));
117+
$next = \implode('.', \array_slice($this->parts, $i + 1));
118+
$exception = '!'.$joined;
119+
$wildcard = '*.'.$next;
120+
121+
if (\array_key_exists($exception, self::$list)) {
122+
$this->suffix = $next;
123+
$this->rule = $exception;
124+
125+
return $next;
126+
}
110127

111128
if (\array_key_exists($joined, self::$list)) {
112129
$this->suffix = $joined;
130+
$this->rule = $joined;
131+
132+
return $joined;
133+
}
134+
135+
if (\array_key_exists($wildcard, self::$list)) {
136+
$this->suffix = $joined;
137+
$this->rule = $wildcard;
113138

114139
return $joined;
115140
}
@@ -118,6 +143,14 @@ public function getSuffix(): string
118143
return '';
119144
}
120145

146+
public function getRule(): string
147+
{
148+
if (! $this->rule) {
149+
$this->getSuffix();
150+
}
151+
return $this->rule;
152+
}
153+
121154
/**
122155
* Returns registerable domain name
123156
*/
@@ -176,7 +209,7 @@ public function getSub(): string
176209
*/
177210
public function isKnown(): bool
178211
{
179-
if (\array_key_exists($this->getSuffix(), self::$list)) {
212+
if (\array_key_exists($this->getRule(), self::$list)) {
180213
return true;
181214
}
182215

@@ -188,7 +221,7 @@ public function isKnown(): bool
188221
*/
189222
public function isICANN(): bool
190223
{
191-
if (isset(self::$list[$this->getSuffix()]) && self::$list[$this->getSuffix()]['type'] === 'ICANN') {
224+
if (isset(self::$list[$this->getRule()]) && self::$list[$this->getRule()]['type'] === 'ICANN') {
192225
return true;
193226
}
194227

@@ -200,7 +233,7 @@ public function isICANN(): bool
200233
*/
201234
public function isPrivate(): bool
202235
{
203-
if (isset(self::$list[$this->getSuffix()]) && self::$list[$this->getSuffix()]['type'] === 'PRIVATE') {
236+
if (isset(self::$list[$this->getRule()]) && self::$list[$this->getRule()]['type'] === 'PRIVATE') {
204237
return true;
205238
}
206239

tests/DomainTest.php

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,4 +211,148 @@ public function testHTTPSException2(): void
211211

212212
new Domain('https://facbook.com');
213213
}
214+
215+
public function testExampleExampleCk(): void
216+
{
217+
$domain = new Domain('example.example.ck');
218+
219+
$this->assertEquals('example.example.ck', $domain->get());
220+
$this->assertEquals('ck', $domain->getTLD());
221+
$this->assertEquals('example.ck', $domain->getSuffix());
222+
$this->assertEquals('example.example.ck', $domain->getRegisterable());
223+
$this->assertEquals('example', $domain->getName());
224+
$this->assertEquals('', $domain->getSub());
225+
$this->assertEquals(true, $domain->isKnown());
226+
$this->assertEquals(true, $domain->isICANN());
227+
$this->assertEquals(false, $domain->isPrivate());
228+
$this->assertEquals(false, $domain->isTest());
229+
}
230+
231+
public function testSubSubExampleExampleCk(): void
232+
{
233+
$domain = new Domain('subsub.demo.example.example.ck');
234+
235+
$this->assertEquals('subsub.demo.example.example.ck', $domain->get());
236+
$this->assertEquals('ck', $domain->getTLD());
237+
$this->assertEquals('example.ck', $domain->getSuffix());
238+
$this->assertEquals('example.example.ck', $domain->getRegisterable());
239+
$this->assertEquals('example', $domain->getName());
240+
$this->assertEquals('subsub.demo', $domain->getSub());
241+
$this->assertEquals(true, $domain->isKnown());
242+
$this->assertEquals(true, $domain->isICANN());
243+
$this->assertEquals(false, $domain->isPrivate());
244+
$this->assertEquals(false, $domain->isTest());
245+
}
246+
247+
public function testWwwCk(): void
248+
{
249+
$domain = new Domain('www.ck');
250+
251+
$this->assertEquals('www.ck', $domain->get());
252+
$this->assertEquals('ck', $domain->getTLD());
253+
$this->assertEquals('ck', $domain->getSuffix());
254+
$this->assertEquals('www.ck', $domain->getRegisterable());
255+
$this->assertEquals('www', $domain->getName());
256+
$this->assertEquals('', $domain->getSub());
257+
$this->assertEquals(true, $domain->isKnown());
258+
$this->assertEquals(true, $domain->isICANN());
259+
$this->assertEquals(false, $domain->isPrivate());
260+
$this->assertEquals(false, $domain->isTest());
261+
}
262+
263+
public function testSubSubWwwCk(): void
264+
{
265+
$domain = new Domain('subsub.demo.www.ck');
266+
267+
$this->assertEquals('subsub.demo.www.ck', $domain->get());
268+
$this->assertEquals('ck', $domain->getTLD());
269+
$this->assertEquals('ck', $domain->getSuffix());
270+
$this->assertEquals('www.ck', $domain->getRegisterable());
271+
$this->assertEquals('www', $domain->getName());
272+
$this->assertEquals('subsub.demo', $domain->getSub());
273+
$this->assertEquals(true, $domain->isKnown());
274+
$this->assertEquals(true, $domain->isICANN());
275+
$this->assertEquals(false, $domain->isPrivate());
276+
$this->assertEquals(false, $domain->isTest());
277+
}
278+
279+
public function testWildcardNomBr(): void
280+
{
281+
$domain = new Domain('sub.example.com.nom.br');
282+
283+
$this->assertEquals('sub.example.com.nom.br', $domain->get());
284+
$this->assertEquals('br', $domain->getTLD());
285+
$this->assertEquals('com.nom.br', $domain->getSuffix());
286+
$this->assertEquals('example.com.nom.br', $domain->getRegisterable());
287+
$this->assertEquals('example', $domain->getName());
288+
$this->assertEquals('sub', $domain->getSub());
289+
$this->assertEquals(true, $domain->isKnown());
290+
$this->assertEquals(true, $domain->isICANN());
291+
$this->assertEquals(false, $domain->isPrivate());
292+
$this->assertEquals(false, $domain->isTest());
293+
}
294+
295+
public function testWildcardKawasakiJp(): void
296+
{
297+
$domain = new Domain('sub.example.com.kawasaki.jp');
298+
299+
$this->assertEquals('sub.example.com.kawasaki.jp', $domain->get());
300+
$this->assertEquals('jp', $domain->getTLD());
301+
$this->assertEquals('com.kawasaki.jp', $domain->getSuffix());
302+
$this->assertEquals('example.com.kawasaki.jp', $domain->getRegisterable());
303+
$this->assertEquals('example', $domain->getName());
304+
$this->assertEquals('sub', $domain->getSub());
305+
$this->assertEquals(true, $domain->isKnown());
306+
$this->assertEquals(true, $domain->isICANN());
307+
$this->assertEquals(false, $domain->isPrivate());
308+
$this->assertEquals(false, $domain->isTest());
309+
}
310+
311+
public function testExceptionKawasakiJp(): void
312+
{
313+
$domain = new Domain('sub.city.kawasaki.jp');
314+
315+
$this->assertEquals('sub.city.kawasaki.jp', $domain->get());
316+
$this->assertEquals('jp', $domain->getTLD());
317+
$this->assertEquals('kawasaki.jp', $domain->getSuffix());
318+
$this->assertEquals('city.kawasaki.jp', $domain->getRegisterable());
319+
$this->assertEquals('city', $domain->getName());
320+
$this->assertEquals('sub', $domain->getSub());
321+
$this->assertEquals(true, $domain->isKnown());
322+
$this->assertEquals(true, $domain->isICANN());
323+
$this->assertEquals(false, $domain->isPrivate());
324+
$this->assertEquals(false, $domain->isTest());
325+
}
326+
327+
public function testWildcardPrivateDomain(): void
328+
{
329+
$domain = new Domain('sub.example.com.dev.adobeaemcloud.com');
330+
331+
$this->assertEquals('sub.example.com.dev.adobeaemcloud.com', $domain->get());
332+
$this->assertEquals('com', $domain->getTLD());
333+
$this->assertEquals('com.dev.adobeaemcloud.com', $domain->getSuffix());
334+
$this->assertEquals('example.com.dev.adobeaemcloud.com', $domain->getRegisterable());
335+
$this->assertEquals('example', $domain->getName());
336+
$this->assertEquals('sub', $domain->getSub());
337+
$this->assertEquals(true, $domain->isKnown());
338+
$this->assertEquals(false, $domain->isICANN());
339+
$this->assertEquals(true, $domain->isPrivate());
340+
$this->assertEquals(false, $domain->isTest());
341+
}
342+
343+
public function testPrivateDomain(): void
344+
{
345+
$domain = new Domain('sub.example.adobeaemcloud.net');
346+
347+
$this->assertEquals('sub.example.adobeaemcloud.net', $domain->get());
348+
$this->assertEquals('net', $domain->getTLD());
349+
$this->assertEquals('adobeaemcloud.net', $domain->getSuffix());
350+
$this->assertEquals('example.adobeaemcloud.net', $domain->getRegisterable());
351+
$this->assertEquals('example', $domain->getName());
352+
$this->assertEquals('sub', $domain->getSub());
353+
$this->assertEquals(true, $domain->isKnown());
354+
$this->assertEquals(false, $domain->isICANN());
355+
$this->assertEquals(true, $domain->isPrivate());
356+
$this->assertEquals(false, $domain->isTest());
357+
}
214358
}

0 commit comments

Comments
 (0)