From 76a40bb2a15220273affe6333bcbbe868cbe36b3 Mon Sep 17 00:00:00 2001 From: Gregory Oschwald Date: Tue, 7 May 2013 13:13:11 -0700 Subject: [PATCH] Filled in Client code --- src/GeoIP2/Exception/HTTPException.php | 0 src/GeoIP2/Exception/HttpException.php | 14 ++++ src/GeoIP2/Model/City.php | 4 ++ src/GeoIP2/Webservice/Client.php | 88 ++++++++++++++++++++++---- 4 files changed, 94 insertions(+), 12 deletions(-) delete mode 100644 src/GeoIP2/Exception/HTTPException.php create mode 100644 src/GeoIP2/Exception/HttpException.php diff --git a/src/GeoIP2/Exception/HTTPException.php b/src/GeoIP2/Exception/HTTPException.php deleted file mode 100644 index e69de29..0000000 diff --git a/src/GeoIP2/Exception/HttpException.php b/src/GeoIP2/Exception/HttpException.php new file mode 100644 index 0000000..5f85854 --- /dev/null +++ b/src/GeoIP2/Exception/HttpException.php @@ -0,0 +1,14 @@ +user_id = $user_id; $this->license_key = $license_key; + $this->language = $language; } public function city($ip_address = 'me') { - return $this->response_for('city', $ip_address); + return $this->response_for('city', 'City', $ip_address); } public function country($ip_address = 'me') { - return $this->response_for('country', $ip_address); + return $this->response_for('country', 'Country', $ip_address); } public function cityISPOrg($ip_address = 'me') { - return $this->response_for('city_isp_org', $ip_address); + return $this->response_for('city_isp_org', 'CityISPOrg', $ip_address); } public function omni($ip_address = 'me') { - return $this->response_for('omni', $ip_address); + return $this->response_for('omni', 'Omni', $ip_address); } - private function response_for($path, $ip_address) + private function response_for($path, $class, $ip_address) { $uri = implode('/', array($this->base_uri, $path, $ip_address)); + $client = new GuzzleClient(); $request = $client->get($uri, array('Accept' => 'application/json')); $request->setAuth($this->user_id, $this->license_key); + $ua = $request->getHeader('User-Agent'); + $ua = "GeoIP2 PHP API ($ua)"; + $request->setHeader('User-Agent', $ua); + $response = $request->send(); - echo $response->getBody(); + + if ($response->isSuccessful()) { + $body = $this->handleSuccess($response, $uri); + $class = "GeoIP2\\Model\\" . $class; + return new $class($body, $this->language); + } } - private function handle_success($response, $uri) + private function handleSuccess($response, $uri) { + // 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()); + + } } - private function handle_error($response, $uri) + private function handleError($response, $uri) { + $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); + } } - private function handle_4xx($response, $uri) + private function handle4xx($response, $uri) { + 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); } - private function handle_5xx($response, $uri) + private function handle5xx($response, $uri) { + throw new HttpException("Received a server error ($status) for $uri", + $status,$uri); } + private function handleNon200($response, $uri) + { + throw new HttpException("Received a very surprising HTTP status " . + "($status) for $uri", + $status, $uri); + } } \ No newline at end of file