diff options
Diffstat (limited to 'Postman/Postman-Mail/google-api-php-client-1.1.2/src/Google/Http/REST.php')
-rw-r--r-- | Postman/Postman-Mail/google-api-php-client-1.1.2/src/Google/Http/REST.php | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/Postman/Postman-Mail/google-api-php-client-1.1.2/src/Google/Http/REST.php b/Postman/Postman-Mail/google-api-php-client-1.1.2/src/Google/Http/REST.php new file mode 100644 index 0000000..2e0e677 --- /dev/null +++ b/Postman/Postman-Mail/google-api-php-client-1.1.2/src/Google/Http/REST.php @@ -0,0 +1,147 @@ +<?php +/* + * Copyright 2010 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +require_once realpath(dirname(__FILE__) . '/../../../autoload.php'); + +/** + * This class implements the RESTful transport of apiServiceRequest()'s + * + * @author Chris Chabot <chabotc@google.com> + * @author Chirag Shah <chirags@google.com> + */ +class Postman_Google_Http_REST +{ + /** + * Executes a Postman_Google_Http_Request + * + * @param Postman_Google_Client $client + * @param Postman_Google_Http_Request $req + * @return array decoded result + * @throws Postman_Google_Service_Exception on server side error (ie: not authenticated, + * invalid or malformed post body, invalid url) + */ + public static function execute(Postman_Google_Client $client, Postman_Google_Http_Request $req) + { + $httpRequest = $client->getIo()->makeRequest($req); + $httpRequest->setExpectedClass($req->getExpectedClass()); + return self::decodeHttpResponse($httpRequest, $client); + } + + /** + * Decode an HTTP Response. + * @static + * @throws Postman_Google_Service_Exception + * @param Postman_Google_Http_Request $response The http response to be decoded. + * @param Postman_Google_Client $client + * @return mixed|null + */ + public static function decodeHttpResponse($response, Postman_Google_Client $client = null) + { + $code = $response->getResponseHttpCode(); + $body = $response->getResponseBody(); + $decoded = null; + + if ((intVal($code)) >= 300) { + $decoded = json_decode($body, true); + $err = 'Error calling ' . $response->getRequestMethod() . ' ' . $response->getUrl(); + if (isset($decoded['error']) && + isset($decoded['error']['message']) && + isset($decoded['error']['code'])) { + // if we're getting a json encoded error definition, use that instead of the raw response + // body for improved readability + $err .= ": ({$decoded['error']['code']}) {$decoded['error']['message']}"; + } else { + $err .= ": ($code) $body"; + } + + $errors = null; + // Specific check for APIs which don't return error details, such as Blogger. + if (isset($decoded['error']) && isset($decoded['error']['errors'])) { + $errors = $decoded['error']['errors']; + } + + if ($client) { + $client->getLogger()->error( + $err, + array('code' => $code, 'errors' => $errors) + ); + } + throw new Postman_Google_Service_Exception($err, $code, null, $errors); + } + + // Only attempt to decode the response, if the response code wasn't (204) 'no content' + if ($code != '204') { + $decoded = json_decode($body, true); + if ($decoded === null || $decoded === "") { + $error = "Invalid json in service response: $body"; + if ($client) { + $client->getLogger()->error($error); + } + throw new Postman_Google_Service_Exception($error); + } + + if ($response->getExpectedClass()) { + $class = $response->getExpectedClass(); + $decoded = new $class($decoded); + } + } + return $decoded; + } + + /** + * Parse/expand request parameters and create a fully qualified + * request uri. + * @static + * @param string $servicePath + * @param string $restPath + * @param array $params + * @return string $requestUrl + */ + public static function createRequestUri($servicePath, $restPath, $params) + { + $requestUrl = $servicePath . $restPath; + $uriTemplateVars = array(); + $queryVars = array(); + foreach ($params as $paramName => $paramSpec) { + if ($paramSpec['type'] == 'boolean') { + $paramSpec['value'] = ($paramSpec['value']) ? 'true' : 'false'; + } + if ($paramSpec['location'] == 'path') { + $uriTemplateVars[$paramName] = $paramSpec['value']; + } else if ($paramSpec['location'] == 'query') { + if (isset($paramSpec['repeated']) && is_array($paramSpec['value'])) { + foreach ($paramSpec['value'] as $value) { + $queryVars[] = $paramName . '=' . rawurlencode($value); + } + } else { + $queryVars[] = $paramName . '=' . rawurlencode($paramSpec['value']); + } + } + } + + if (count($uriTemplateVars)) { + $uriTemplateParser = new Postman_Google_Utils_URITemplate(); + $requestUrl = $uriTemplateParser->parse($requestUrl, $uriTemplateVars); + } + + if (count($queryVars)) { + $requestUrl .= '?' . implode($queryVars, '&'); + } + + return $requestUrl; + } +} |