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

138 lines
3.8 KiB
PHP
Raw Normal View History

2013-05-07 17:02:39 +00:00
<?php
namespace GeoIP2\Webservice;
use GeoIP2\Error\Generic;
2013-05-07 20:13:11 +00:00
use GeoIP2\Exception\HttpException;
2013-05-07 17:02:39 +00:00
use GeoIP2\Error\Webservice;
use GeoIP2\Model\City;
use GeoIP2\Model\CityISPOrg;
use GeoIP2\Model\Country;
use GeoIP2\Model\Omni;
2013-05-07 18:17:38 +00:00
use Guzzle\Http\Client as GuzzleClient;
2013-05-07 17:06:57 +00:00
class Client
{
private $userId;
private $licenseKey;
private $languages;
private $baseUri = 'https://geoip.maxmind.com/geoip/v2.0';
2013-05-07 17:39:06 +00:00
public function __construct($userId, $licenseKey, $languages=array('en'))
2013-05-07 17:39:06 +00:00
{
$this->userId = $userId;
$this->licenseKey = $licenseKey;
$this->languages = $languages;
2013-05-07 17:39:06 +00:00
}
public function city($ipAddress = 'me')
2013-05-07 17:39:06 +00:00
{
return $this->responseFor('city', 'City', $ipAddress);
2013-05-07 17:39:06 +00:00
}
public function country($ipAddress = 'me')
2013-05-07 17:39:06 +00:00
{
return $this->responseFor('country', 'Country', $ipAddress);
2013-05-07 17:39:06 +00:00
}
public function cityISPOrg($ipAddress = 'me')
2013-05-07 17:39:06 +00:00
{
return $this->responseFor('city_isp_org', 'CityISPOrg', $ipAddress);
2013-05-07 17:39:06 +00:00
}
public function omni($ipAddress = 'me')
2013-05-07 17:39:06 +00:00
{
return $this->responseFor('omni', 'Omni', $ipAddress);
2013-05-07 17:39:06 +00:00
}
private function responseFor($path, $class, $ipAddress)
2013-05-07 17:39:06 +00:00
{
$uri = implode('/', array($this->baseUri, $path, $ipAddress));
2013-05-07 20:13:11 +00:00
2013-05-07 18:17:38 +00:00
$client = new GuzzleClient();
$request = $client->get($uri, array('Accept' => 'application/json'));
$request->setAuth($this->userId, $this->licenseKey);
2013-05-07 20:13:11 +00:00
$ua = $request->getHeader('User-Agent');
$ua = "GeoIP2 PHP API ($ua)";
$request->setHeader('User-Agent', $ua);
2013-05-07 18:17:38 +00:00
$response = $request->send();
2013-05-07 20:13:11 +00:00
if ($response->isSuccessful()) {
$body = $this->handleSuccess($response, $uri);
$class = "GeoIP2\\Model\\" . $class;
return new $class($body, $this->languages);
2013-05-07 20:13:11 +00:00
}
2013-05-07 17:39:06 +00:00
}
2013-05-07 20:13:11 +00:00
private function handleSuccess($response, $uri)
2013-05-07 17:39:06 +00:00
{
2013-05-07 20:13:11 +00:00
// XXX - handle exceptions
try {
return $response->json();
}
// XXX - figure out what sort of exception to catch
catch (Exception $e) {
throw new GenericException("Received a 200 response for $uri but could not decode the response as JSON: " . $e->getMessage());
}
2013-05-07 17:39:06 +00:00
}
2013-05-07 20:13:11 +00:00
private function handleError($response, $uri)
2013-05-07 17:39:06 +00:00
{
2013-05-07 20:13:11 +00:00
$status = $response->getStatusCode();
if ($status >= 400 && $status <= 499) {
$this->handle4xx($response, $uri);
}
elseif ($status >= 500 && $status <= 599){
$this->handle5xx($response, $uri);
}
else {
$this->hanldeNon200($reponse, $uri);
}
2013-05-07 17:39:06 +00:00
}
2013-05-07 20:13:11 +00:00
private function handle4xx($response, $uri)
2013-05-07 17:39:06 +00:00
{
2013-05-07 20:13:11 +00:00
if ( $response->getContentLength() > 0 ) {
if( strstr($response->getContentType(), 'json')) {
try {
$body = $response->json();
if (!$body['code'] || $body['error'] ){
throw new GenericException('Response contains JSON but it does not specify code or error keys');
}
}
// XXX - don't catch all exceptions
catch (Exception $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: $content",
$status, $uri);
}
}
else {
throw new HttpException("Received a $status error for $uri with no body",
$status, $uri);
}
throw new WebserviceException($body['error'], $status, $uri);
2013-05-07 17:39:06 +00:00
}
2013-05-07 20:13:11 +00:00
private function handle5xx($response, $uri)
2013-05-07 17:39:06 +00:00
{
2013-05-07 20:13:11 +00:00
throw new HttpException("Received a server error ($status) for $uri",
$status,$uri);
2013-05-07 17:39:06 +00:00
}
2013-05-07 20:13:11 +00:00
private function handleNon200($response, $uri)
{
throw new HttpException("Received a very surprising HTTP status " .
"($status) for $uri",
$status, $uri);
}
}