Skip to content

Commit

Permalink
Add isAnycast property to Traits
Browse files Browse the repository at this point in the history
  • Loading branch information
oschwald committed Nov 30, 2023
1 parent 1c95252 commit 1ebfeb7
Show file tree
Hide file tree
Showing 6 changed files with 63 additions and 0 deletions.
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,11 @@ CHANGELOG
if an invalid IP address is passed to them. Previously, they would make
a request to the web service and throw a
`GeoIp2\Exception\InvalidRequestException`.
* The `isAnycast` property was added to `GeoIp2\Record\Traits`. This returns
`true` if the IP address belongs to an [anycast
network](https://en.wikipedia.org/wiki/Anycast). This is available for the
GeoIP2 Country, City Plus, and Insights web services and the GeoIP2 Country,
City, and Enterprise databases.

2.13.0 (2022-08-05)
-------------------
Expand Down
12 changes: 12 additions & 0 deletions src/Record/Traits.php
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,14 @@ class Traits implements \JsonSerializable
*/
public readonly bool $isAnonymousVpn;

/**
* @var bool This is true if the IP address belongs to an [anycast
* network](https://en.wikipedia.org/wiki/Anycast anycast network).
* This property is not available from GeoLite databases or web
* services.
*/
public readonly bool $isAnycast;

/**
* @var bool This is true if the IP address belongs
* to a hosting or VPN provider (see description of isAnonymousVpn property).
Expand Down Expand Up @@ -198,6 +206,7 @@ public function __construct(array $record)
$this->ipAddress = $record['ip_address'] ?? null;
$this->isAnonymous = $record['is_anonymous'] ?? false;
$this->isAnonymousVpn = $record['is_anonymous_vpn'] ?? false;
$this->isAnycast = $record['is_anycast'] ?? false;
$this->isHostingProvider = $record['is_hosting_provider'] ?? false;
$this->isLegitimateProxy = $record['is_legitimate_proxy'] ?? false;
$this->isp = $record['isp'] ?? null;
Expand Down Expand Up @@ -242,6 +251,9 @@ public function jsonSerialize(): array
if ($this->isAnonymousVpn !== false) {
$js['is_anonymous_vpn'] = $this->isAnonymousVpn;
}
if ($this->isAnycast !== false) {
$js['is_anycast'] = $this->isAnycast;
}
if ($this->isHostingProvider !== false) {
$js['is_hosting_provider'] = $this->isHostingProvider;
}
Expand Down
26 changes: 26 additions & 0 deletions tests/GeoIp2/Test/Database/ReaderTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,28 @@ public function testConnectionType(): void
$reader->close();
}

public function testCity(): void
{
$reader = new Reader('maxmind-db/test-data/GeoIP2-City-Test.mmdb');

// This IP has is_anycast
$record = $reader->city('214.1.1.0');
$this->assertTrue($record->traits->isAnycast);

$reader->close();
}

public function testCountry(): void
{
$reader = new Reader('maxmind-db/test-data/GeoIP2-Country-Test.mmdb');

// This IP has is_anycast
$record = $reader->country('214.1.1.0');
$this->assertTrue($record->traits->isAnycast);

$reader->close();
}

public function testDomain(): void
{
$reader = new Reader('maxmind-db/test-data/GeoIP2-Domain-Test.mmdb');
Expand Down Expand Up @@ -214,6 +236,10 @@ public function testEnterprise(): void
$this->assertSame('310', $record->traits->mobileCountryCode);
$this->assertSame('004', $record->traits->mobileNetworkCode);

// This IP has is_anycast
$record = $reader->enterprise('214.1.1.0');
$this->assertTrue($record->traits->isAnycast);

$reader->close();
}

Expand Down
2 changes: 2 additions & 0 deletions tests/GeoIp2/Test/Model/CountryTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ class CountryTest extends TestCase
],
'traits' => [
'ip_address' => '1.2.3.4',
'is_anycast' => true,
'prefix_len' => 24,
],
];
Expand Down Expand Up @@ -188,6 +189,7 @@ public function testJsonSerialize(): void
],
'traits' => [
'ip_address' => '1.2.3.4',
'is_anycast' => true,
'network' => '1.2.3.0/24',
],
];
Expand Down
7 changes: 7 additions & 0 deletions tests/GeoIp2/Test/Model/InsightsTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ public function testFull(): void
'ip_address' => '1.2.3.4',
'is_anonymous' => true,
'is_anonymous_vpn' => true,
'is_anycast' => true,
'is_hosting_provider' => true,
'is_legitimate_proxy' => true,
'is_public_proxy' => true,
Expand Down Expand Up @@ -170,6 +171,11 @@ public function testFull(): void
'$model->traits->isAnonymous is true'
);

$this->assertTrue(
$model->traits->isAnycast,
'$model->traits->isAnycast is true'
);

$this->assertTrue(
$model->traits->isHostingProvider,
'$model->traits->isHostingProvider is true'
Expand Down Expand Up @@ -255,6 +261,7 @@ public function testFull(): void
'ip_address' => '1.2.3.4',
'is_anonymous' => true,
'is_anonymous_vpn' => true,
'is_anycast' => true,
'is_hosting_provider' => true,
'is_legitimate_proxy' => true,
'is_public_proxy' => true,
Expand Down
11 changes: 11 additions & 0 deletions tests/GeoIp2/Test/WebService/ClientTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ class ClientTest extends TestCase
'maxmind' => ['queries_remaining' => 11],
'traits' => [
'ip_address' => '1.2.3.4',
'is_anycast' => true,
'network' => '1.2.3.0/24',
],
];
Expand Down Expand Up @@ -236,6 +237,11 @@ public function testCountry(): void
'registered_country is_in_european_union is false'
);

$this->assertTrue(
$country->traits->isAnycast,
'is_anycast'
);

$this->assertSame(
'1.2.3.0/24',
$country->traits->network,
Expand All @@ -255,6 +261,11 @@ public function testInsights(): void
'continent geoname_id is 42'
);

$this->assertTrue(
$record->traits->isAnycast,
'is_anycast'
);

$this->assertSame(
'1.2.3.0/24',
$record->traits->network,
Expand Down

0 comments on commit 1ebfeb7

Please sign in to comment.