/** * Decode an HTTP Response. * @static * @throws Google_Service_Exception * @param Google_Http_Request $response The http response to be decoded. * @return mixed|null */ public static function decodeHttpResponse($response) { $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']; } throw new 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 === "") { throw new Google_Service_Exception("Invalid json in service response: {$body}"); } if ($response->getExpectedClass()) { $class = $response->getExpectedClass(); $decoded = new $class($decoded); } } return $decoded; }
/** * Send the next part of the file to upload. * @param [$chunk] the next set of bytes to send. If false will used $data passed * at construct time. */ public function nextChunk($chunk = false) { if (false == $this->resumeUri) { $this->resumeUri = $this->getResumeUri(); } if (false == $chunk) { $chunk = substr($this->data, $this->progress, $this->chunkSize); } $lastBytePos = $this->progress + strlen($chunk) - 1; $headers = array('content-range' => "bytes {$this->progress}-{$lastBytePos}/{$this->size}", 'content-type' => $this->request->getRequestHeader('content-type'), 'content-length' => $this->chunkSize, 'expect' => ''); $httpRequest = new Google_Http_Request($this->resumeUri, 'PUT', $headers, $chunk); if ($this->client->getClassConfig("Google_Http_Request", "enable_gzip_for_uploads")) { $httpRequest->enableGzip(); } else { $httpRequest->disableGzip(); } $response = $this->client->getIo()->makeRequest($httpRequest); $response->setExpectedClass($this->request->getExpectedClass()); $code = $response->getResponseHttpCode(); $this->httpResultCode = $code; if (308 == $code) { // Track the amount uploaded. $range = explode('-', $response->getResponseHeader('range')); $this->progress = $range[1] + 1; // Allow for changing upload URLs. $location = $response->getResponseHeader('location'); if ($location) { $this->resumeUri = $location; } // No problems, but upload not complete. return false; } else { return Google_Http_REST::decodeHttpResponse($response); } }
public function testRequestParameters() { $url = 'http://localhost:8080/foo/bar?foo=a&foo=b&wowee=oh+my'; $url2 = 'http://localhost:8080/foo/bar?foo=a&foo=b&wowee=oh+my&hi=there'; $request = new Google_Http_Request($url); $request->setExpectedClass("Google_Client"); $this->assertEquals(2, count($request->getQueryParams())); $request->setQueryParam("hi", "there"); $this->assertEquals($url2, $request->getUrl()); $this->assertEquals("Google_Client", $request->getExpectedClass()); $urlPath = "/foo/bar"; $request = new Google_Http_Request($urlPath); $this->assertEquals($urlPath, $request->getUrl()); $request->setBaseComponent("http://example.com"); $this->assertEquals("http://example.com" . $urlPath, $request->getUrl()); $url3a = 'http://localhost:8080/foo/bar'; $url3b = 'foo=a&foo=b&wowee=oh+my'; $url3c = 'foo=a&foo=b&wowee=oh+my&hi=there'; $request = new Google_Http_Request($url3a . "?" . $url3b, "POST"); $request->setQueryParam("hi", "there"); $request->maybeMoveParametersToBody(); $this->assertEquals($url3a, $request->getUrl()); $this->assertEquals($url3c, $request->getPostBody()); $url4 = 'http://localhost:8080/upload/foo/bar?foo=a&foo=b&wowee=oh+my&hi=there'; $request = new Google_Http_Request($url); $this->assertEquals(2, count($request->getQueryParams())); $request->setQueryParam("hi", "there"); $base = $request->getBaseComponent(); $request->setBaseComponent($base . '/upload'); $this->assertEquals($url4, $request->getUrl()); }
/** * Sends a PUT-Request to google drive and parses the response, * setting the appropiate variables from the response() * * @param Google_Http_Request $httpRequest the Reuqest which will be send * * @return false|mixed false when the upload is unfinished or the decoded http response * */ private function makePutRequest(Google_Http_Request $httpRequest) { if ($this->client->getClassConfig("Google_Http_Request", "enable_gzip_for_uploads")) { $httpRequest->enableGzip(); } else { $httpRequest->disableGzip(); } $response = $this->client->getIo()->makeRequest($httpRequest); $response->setExpectedClass($this->request->getExpectedClass()); $code = $response->getResponseHttpCode(); $this->httpResultCode = $code; if (308 == $code) { // Track the amount uploaded. $range = explode('-', $response->getResponseHeader('range')); $this->progress = $range[1] + 1; // Allow for changing upload URLs. $location = $response->getResponseHeader('location'); if ($location) { $this->resumeUri = $location; } // No problems, but upload not complete. return false; } else { return Google_Http_REST::decodeHttpResponse($response, $this->client); } }
public function testRequestParameters() { $url = 'http://localhost:8080/foo/bar?foo=a&foo=b&wowee=oh+my'; $url2 = 'http://localhost:8080/foo/bar?foo=a&foo=b&wowee=oh+my&hi=there'; $request = new Google_Http_Request($this->getClient(), $url); $request->setExpectedClass("Google_Client"); $this->assertEquals(2, count($request->getQueryParams())); $request->setQueryParam("hi", "there"); $this->assertEquals($url2, $request->getUrl()); $this->assertEquals("Google_Client", $request->getExpectedClass()); $url3a = 'http://localhost:8080/foo/bar'; $url3b = 'foo=a&foo=b&wowee=oh+my'; $url3c = 'foo=a&foo=b&wowee=oh+my&hi=there'; $request = new Google_Http_Request($this->getClient(), $url3a . "?" . $url3b, "POST"); $request->setQueryParam("hi", "there"); $request->maybeMoveParametersToBody(); $this->assertEquals($url3a, $request->getUrl()); $this->assertEquals($url3c, $request->getPostBody()); }
/** * Decode an HTTP Response. * @static * @throws Google_Service_Exception * @param Google_Http_Request $response The http response to be decoded. * @param Google_Client $client * @return mixed|null */ public static function decodeHttpResponse($response, 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']; } $map = null; if ($client) { $client->getLogger()->error($err, array('code' => $code, 'errors' => $errors)); $map = $client->getClassConfig('Google_Service_Exception', 'retry_map'); } //throw new Google_Service_Exception($err, $code, null, $errors, $map); echo json_encode(array('status' => FALSE, 'response-code' => $code, 'response' => $err, 'message' => $errors, "map" => $map)); die; } // 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 Google_Service_Exception($error); echo json_encode(array('status' => FALSE, 'response-code' => $code, 'response' => $error, 'message' => $body)); die; } if ($response->getExpectedClass()) { $class = $response->getExpectedClass(); $decoded = new $class($decoded); } } return $decoded; }