Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 2
CRAP
15.79% covered (danger)
15.79%
3 / 19
HttpGeoLocation
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 2
69.72
15.79% covered (danger)
15.79%
3 / 19
 __construct
0.00% covered (danger)
0.00%
0 / 1
3.14
75.00% covered (warning)
75.00%
3 / 4
 locate
0.00% covered (danger)
0.00%
0 / 1
56
0.00% covered (danger)
0.00%
0 / 15
<?php
namespace CookieWarning;
use Http;
use InvalidArgumentException;
use Wikimedia\IPUtils;
/**
 * Implements the GeoLocation class, which allows to locate the user based on the IP address.
 */
class HttpGeoLocation implements GeoLocation {
    private $geoIPServiceURL;
    private $locatedIPs = [];
    /**
     * @param string $geoIPServiceURL
     */
    public function __construct( $geoIPServiceURL ) {
        if ( !is_string( $geoIPServiceURL ) || !$geoIPServiceURL ) {
            throw new InvalidArgumentException( 'The geoIPServiceUL is invalid' );
        }
        $this->geoIPServiceURL = $geoIPServiceURL;
    }
    /**
     * {@inheritdoc}
     * @param string $ip The IP address to lookup
     * @return string|null
     */
    public function locate( $ip ) {
        if ( isset( $this->locatedIPs[$ip] ) ) {
            return $this->locatedIPs[$ip];
        }
        if ( !IPUtils::isValid( $ip ) ) {
            throw new InvalidArgumentException( "$ip is not a valid IP address." );
        }
        if ( substr( $this->geoIPServiceURL, -1 ) !== '/' ) {
            $this->geoIPServiceURL .= '/';
        }
        $json = Http::get( $this->geoIPServiceURL . $ip, [
            'timeout' => '2',
        ] );
        if ( !$json ) {
            return null;
        }
        $returnObject = json_decode( $json );
        if ( $returnObject === null || !property_exists( $returnObject, 'country_code' ) ) {
            return null;
        }
        $this->locatedIPs[$ip] = $returnObject->country_code;
        return $this->locatedIPs[$ip];
    }
}