GeoIP2-php/src/GeoIP2/Webservice/Client.php

188 lines
5.3 KiB
PHP
Raw Normal View History

2013-05-07 17:02:39 +00:00
<?php
namespace GeoIP2\Webservice;
use GeoIP2\Exception\GenericException;
2013-05-07 20:13:11 +00:00
use GeoIP2\Exception\HttpException;
use GeoIP2\Exception\WebserviceException;
2013-05-07 17:02:39 +00:00
use GeoIP2\Model\City;
use GeoIP2\Model\CityIspOrg;
2013-05-07 17:02:39 +00:00
use GeoIP2\Model\Country;
use GeoIP2\Model\Omni;
2013-05-07 18:17:38 +00:00
use Guzzle\Http\Client as GuzzleClient;
use Guzzle\Common\Exception\RuntimeException;
use Guzzle\Http\Exception\ClientErrorResponseException;
use Guzzle\Http\Exception\ServerErrorResponseException;
2013-05-07 17:06:57 +00:00
class Client
{
private $userId;
private $licenseKey;
private $languages;
2013-05-09 22:22:11 +00:00
private $host;
private $guzzleClient;
public function __construct(
$userId,
$licenseKey,
$languages = array('en'),
2013-05-09 22:22:11 +00:00
$host = 'geoip.maxmind.com',
$guzzleClient = null
) {
$this->userId = $userId;
$this->licenseKey = $licenseKey;
$this->languages = $languages;
2013-05-09 22:22:11 +00:00
$this->host = $host;
// To enable unit testing
$this->guzzleClient = $guzzleClient;
}
2013-05-07 20:13:11 +00:00
public function city($ipAddress = 'me')
{
return $this->responseFor('city', 'City', $ipAddress);
2013-05-07 20:13:11 +00:00
}
2013-05-07 17:39:06 +00:00
public function country($ipAddress = 'me')
{
return $this->responseFor('country', 'Country', $ipAddress);
}
public function cityIspOrg($ipAddress = 'me')
{
return $this->responseFor('city_isp_org', 'CityIspOrg', $ipAddress);
2013-05-07 20:13:11 +00:00
}
public function omni($ipAddress = 'me')
{
return $this->responseFor('omni', 'Omni', $ipAddress);
2013-05-07 20:13:11 +00:00
}
2013-05-07 17:39:06 +00:00
2013-05-09 22:22:11 +00:00
private function responseFor($endpoint, $class, $ipAddress)
{
2013-05-09 22:22:11 +00:00
$uri = implode('/', array($this->baseUri(), $endpoint, $ipAddress));
2013-05-07 20:13:11 +00:00
$client = $this->guzzleClient ?
$this->guzzleClient : new GuzzleClient();
$request = $client->get($uri, array('Accept' => 'application/json'));
$request->setAuth($this->userId, $this->licenseKey);
$ua = $request->getHeader('User-Agent');
$ua = "GeoIP2 PHP API ($ua)";
$request->setHeader('User-Agent', $ua);
2013-05-07 17:39:06 +00:00
$response = null;
2013-05-07 20:13:11 +00:00
try {
$response = $request->send();
} catch (ClientErrorResponseException $e) {
$this->handle4xx($e->getResponse(), $uri);
} catch (ServerErrorResponseException $e) {
$this->handle5xx($e->getResponse(), $uri);
2013-05-07 20:13:11 +00:00
}
if ($response && $response->isSuccessful()) {
$body = $this->handleSuccess($response, $uri);
$class = "GeoIP2\\Model\\" . $class;
return new $class($body, $this->languages);
} else {
$this->handleNon200($response, $uri);
2013-05-07 20:13:11 +00:00
}
}
private function handleSuccess($response, $uri)
{
if ($response->getContentLength() == 0) {
throw new GenericException(
"Received a 200 response for $uri but did not " .
"receive a HTTP body."
);
}
try {
return $response->json();
} catch (RuntimeException $e) {
throw new GenericException(
"Received a 200 response for $uri but could not decode " .
"the response as JSON: " . $e->getMessage()
);
}
2013-05-07 20:13:11 +00:00
}
private function handle4xx($response, $uri)
{
$status = $response->getStatusCode();
$body = array();
if ($response->getContentLength() > 0) {
if (strstr($response->getContentType(), 'json')) {
try {
$body = $response->json();
if (!isset($body['code']) || !isset($body['error'])) {
throw new GenericException(
'Response contains JSON but it does not specify ' .
'code or error keys: ' . $response->getBody()
);
}
} catch (RuntimeException $e) {
throw new HttpException(
"Received a $status error for $uri but it did not " .
"include the expected JSON body: " .
$e->getMessage(),
$status,
$uri
);
}
} else {
throw new HttpException(
"Received a $status error for $uri with the " .
"following body: " . $response->getBody(),
$status,
$uri
);
}
} else {
throw new HttpException(
"Received a $status error for $uri with no body",
$status,
$uri
);
}
2013-05-07 17:39:06 +00:00
throw new WebserviceException(
$body['error'],
$body['code'],
$status,
$uri
);
}
private function handle5xx($response, $uri)
{
$status = $response->getStatusCode();
2013-05-07 17:39:06 +00:00
throw new HttpException(
"Received a server error ($status) for $uri",
$status,
$uri
);
}
private function handleNon200($response, $uri)
{
$status = $response->getStatusCode();
throw new HttpException(
"Received a very surprising HTTP status " .
"($status) for $uri",
$status,
$uri
);
}
2013-05-09 22:22:11 +00:00
2013-05-09 22:23:37 +00:00
private function baseUri()
{
2013-05-09 22:22:11 +00:00
return 'https://' . $this->host . '/geoip/v2.0';
}
}