Ejemplo n.º 1
0
 /**
  * Execute an HTTP Request
  *
  * @param Google_Http_Request $request the http request to be executed
  * @return array containing response headers, body, and http code
  * @throws Google_IO_Exception on curl or IO error
  */
 public function executeRequest(Google_Http_Request $request)
 {
     $curl = curl_init();
     if ($request->getPostBody()) {
         curl_setopt($curl, CURLOPT_POSTFIELDS, $request->getPostBody());
     }
     $requestHeaders = $request->getRequestHeaders();
     if ($requestHeaders && is_array($requestHeaders)) {
         $curlHeaders = array();
         foreach ($requestHeaders as $k => $v) {
             $curlHeaders[] = "{$k}: {$v}";
         }
         if (isset($this->options[CURLOPT_HTTPHEADER])) {
             if (is_array($this->options[CURLOPT_HTTPHEADER])) {
                 foreach ($this->options[CURLOPT_HTTPHEADER] as $optionHeader) {
                     $curlHeaders[] = $optionHeader;
                 }
             }
             unset($this->options[CURLOPT_HTTPHEADER]);
         }
         curl_setopt($curl, CURLOPT_HTTPHEADER, $curlHeaders);
     }
     curl_setopt($curl, CURLOPT_URL, $request->getUrl());
     curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $request->getRequestMethod());
     curl_setopt($curl, CURLOPT_USERAGENT, $request->getUserAgent());
     curl_setopt($curl, CURLOPT_FOLLOWLOCATION, false);
     curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
     // 1 is CURL_SSLVERSION_TLSv1, which is not always defined in PHP.
     curl_setopt($curl, CURLOPT_SSLVERSION, 1);
     curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
     curl_setopt($curl, CURLOPT_HEADER, true);
     if ($request->canGzip()) {
         curl_setopt($curl, CURLOPT_ENCODING, 'gzip,deflate');
     }
     $options = $this->client->getClassConfig('Google_IO_Curl', 'options');
     if (is_array($options)) {
         $this->setOptions($options);
     }
     foreach ($this->options as $key => $var) {
         curl_setopt($curl, $key, $var);
     }
     if (!isset($this->options[CURLOPT_CAINFO])) {
         curl_setopt($curl, CURLOPT_CAINFO, dirname(__FILE__) . '/cacerts.pem');
     }
     $this->client->getLogger()->debug('cURL request', array('url' => $request->getUrl(), 'method' => $request->getRequestMethod(), 'headers' => $requestHeaders, 'body' => $request->getPostBody()));
     $response = curl_exec($curl);
     if ($response === false) {
         $error = curl_error($curl);
         $code = curl_errno($curl);
         $map = $this->client->getClassConfig('Google_IO_Exception', 'retry_map');
         $this->client->getLogger()->error('cURL ' . $error);
         throw new Google_IO_Exception($error, $code, null, $map);
     }
     $headerSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
     list($responseHeaders, $responseBody) = $this->parseHttpResponse($response, $headerSize);
     $responseCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
     $this->client->getLogger()->debug('cURL response', array('code' => $responseCode, 'headers' => $responseHeaders, 'body' => $responseBody));
     return array($responseBody, $responseHeaders, $responseCode);
 }
Ejemplo n.º 2
0
 /**
  * Execute an HTTP Request
  *
  * @param Google_HttpRequest $request the http request to be executed
  * @return Google_HttpRequest http request with the response http code,
  * response headers and response body filled in
  * @throws Google_IO_Exception on curl or IO error
  */
 public function executeRequest(Google_Http_Request $request)
 {
     $default_options = stream_context_get_options(stream_context_get_default());
     $requestHttpContext = array_key_exists('http', $default_options) ? $default_options['http'] : array();
     if ($request->getPostBody()) {
         $requestHttpContext["content"] = $request->getPostBody();
     }
     $requestHeaders = $request->getRequestHeaders();
     if ($requestHeaders && is_array($requestHeaders)) {
         $headers = "";
         foreach ($requestHeaders as $k => $v) {
             $headers .= "{$k}: {$v}\r\n";
         }
         $requestHttpContext["header"] = $headers;
     }
     $requestHttpContext["method"] = $request->getRequestMethod();
     $requestHttpContext["user_agent"] = $request->getUserAgent();
     $requestSslContext = array_key_exists('ssl', $default_options) ? $default_options['ssl'] : array();
     if (!array_key_exists("cafile", $requestSslContext)) {
         $requestSslContext["cafile"] = dirname(__FILE__) . '/cacerts.pem';
     }
     $options = array("http" => array_merge(self::$DEFAULT_HTTP_CONTEXT, $requestHttpContext), "ssl" => array_merge(self::$DEFAULT_SSL_CONTEXT, $requestSslContext));
     $context = stream_context_create($options);
     $url = $request->getUrl();
     if ($request->canGzip()) {
         $url = self::ZLIB . $url;
     }
     // We are trapping any thrown errors in this method only and
     // throwing an exception.
     $this->trappedErrorNumber = null;
     $this->trappedErrorString = null;
     // START - error trap.
     set_error_handler(array($this, 'trapError'));
     $fh = fopen($url, 'r', false, $context);
     restore_error_handler();
     // END - error trap.
     if ($this->trappedErrorNumber) {
         throw new Google_IO_Exception(sprintf("HTTP Error: Unable to connect: '%s'", $this->trappedErrorString), $this->trappedErrorNumber);
     }
     $response_data = false;
     $respHttpCode = self::UNKNOWN_CODE;
     if ($fh) {
         if (isset($this->options[self::TIMEOUT])) {
             stream_set_timeout($fh, $this->options[self::TIMEOUT]);
         }
         $response_data = stream_get_contents($fh);
         fclose($fh);
         $respHttpCode = $this->getHttpResponseCode($http_response_header);
     }
     if (false === $response_data) {
         throw new Google_IO_Exception(sprintf("HTTP Error: Unable to connect: '%s'", $respHttpCode), $respHttpCode);
     }
     $responseHeaders = $this->getHttpResponseHeaders($http_response_header);
     return array($response_data, $responseHeaders, $respHttpCode);
 }
Ejemplo n.º 3
0
 /**
  * Execute an HTTP Request
  *
  * @param Google_HttpRequest $request the http request to be executed
  *
  * @return Google_HttpRequest  http request with the response http code,
  *                             response headers and response body filled in
  * @throws Google_IO_Exception on curl or IO error
  */
 public function executeRequest(Google_Http_Request $request)
 {
     $default_options = stream_context_get_options(stream_context_get_default());
     $requestHttpContext = array_key_exists('http', $default_options) ? $default_options['http'] : array();
     if ($request->getPostBody()) {
         $requestHttpContext["content"] = $request->getPostBody();
     }
     $requestHeaders = $request->getRequestHeaders();
     if ($requestHeaders && is_array($requestHeaders)) {
         $headers = "";
         foreach ($requestHeaders as $k => $v) {
             $headers .= "{$k}: {$v}\r\n";
         }
         $requestHttpContext["header"] = $headers;
     }
     $requestHttpContext["method"] = $request->getRequestMethod();
     $requestHttpContext["user_agent"] = $request->getUserAgent();
     $requestSslContext = array_key_exists('ssl', $default_options) ? $default_options['ssl'] : array();
     if (!array_key_exists("cafile", $requestSslContext)) {
         $requestSslContext["cafile"] = dirname(__FILE__) . '/cacerts.pem';
     }
     $options = array("http" => array_merge(self::$DEFAULT_HTTP_CONTEXT, $requestHttpContext), "ssl" => array_merge(self::$DEFAULT_SSL_CONTEXT, $requestSslContext));
     $context = stream_context_create($options);
     $url = $request->getUrl();
     if ($request->canGzip()) {
         $url = self::ZLIB . $url;
     }
     // Not entirely happy about this, but supressing the warning from the
     // fopen seems like the best situation here - we can't do anything
     // useful with it, and failure to connect is a legitimate run
     // time situation.
     @($fh = fopen($url, 'r', false, $context));
     $response_data = false;
     $respHttpCode = self::UNKNOWN_CODE;
     if ($fh) {
         if (isset($this->options[self::TIMEOUT])) {
             stream_set_timeout($fh, $this->options[self::TIMEOUT]);
         }
         $response_data = stream_get_contents($fh);
         fclose($fh);
         $respHttpCode = $this->getHttpResponseCode($http_response_header);
     }
     if (false === $response_data) {
         throw new Google_IO_Exception(sprintf("HTTP Error: Unable to connect: '%s'", $respHttpCode), $respHttpCode);
     }
     $responseHeaders = $this->getHttpResponseHeaders($http_response_header);
     return array($response_data, $responseHeaders, $respHttpCode);
 }
Ejemplo n.º 4
0
 private function getResumeUri()
 {
     $result = null;
     $body = $this->request->getPostBody();
     if ($body) {
         $headers = array('content-type' => 'application/json; charset=UTF-8', 'content-length' => Google_Utils::getStrLen($body), 'x-upload-content-type' => $this->mimeType, 'x-upload-content-length' => $this->size, 'expect' => '');
         $this->request->setRequestHeaders($headers);
     }
     $response = $this->client->getIo()->makeRequest($this->request);
     $location = $response->getResponseHeader('location');
     $code = $response->getResponseHttpCode();
     if (200 == $code && true == $location) {
         return $location;
     }
     $message = $code;
     $body = @json_decode($response->getResponseBody());
     if (!empty($body->error->errors)) {
         $message .= ': ';
         foreach ($body->error->errors as $error) {
             $message .= "{$error->domain}, {$error->message};";
         }
         $message = rtrim($message, ';');
     }
     $error = "Failed to start the resumable upload (HTTP {$message})";
     $this->client->getLogger()->error($error);
     throw new Google_Exception($error);
 }
Ejemplo n.º 5
0
 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());
 }
Ejemplo n.º 6
0
 /**
  * Execute an HTTP Request
  *
  * @param Google_Http_Request $request the http request to be executed
  * @return array containing response headers, body, and http code
  * @throws Google_IO_Exception on curl or IO error
  */
 public function executeRequest(Google_Http_Request $request)
 {
     $client = $this->getGuzzleClient();
     $options = array('exceptions' => true);
     $method = $request->getRequestMethod();
     if (strcasecmp($method, 'get') == 0) {
         $req = $client->get($request->getUrl(), $request->getRequestHeaders(), $options);
     } elseif (strcasecmp($method, 'post') == 0) {
         $req = $client->post($request->getUrl(), $request->getRequestHeaders(), $request->getPostBody(), $options);
     } elseif (strcasecmp($method, 'delete') == 0) {
         $req = $client->delete($request->getUrl(), $request->getRequestHeaders(), null, $options);
     } elseif (strcasecmp($method, 'put') == 0) {
         $req = $client->put($request->getUrl(), $request->getRequestHeaders(), $request->getPostBody(), $options);
     } else {
         throw new Google_IO_Exception(__CLASS__ . '#' . __LINE__ . ' Request method not supported');
     }
     if ($request->canGzip()) {
         $req->addHeader('Accept-Encoding', 'gzip,deflate');
     }
     $this->client->getLogger()->debug('guzzle request', array('url' => $request->getUrl(), 'method' => $request->getRequestMethod(), 'headers' => $req->getHeaders(), 'body' => $request->getPostBody()));
     try {
         $result = $client->send($req);
         $rawHeaders = $result->getRawHeaders();
         $responseHeaders = $this->getHttpResponseHeaders($rawHeaders);
         $responseBody = $result->getBody();
         $responseCode = $result->getStatusCode();
     } catch (Exception $ex) {
         // check if http response info can be retrieved from exception
         // this gives calling service opportunity to handle failures
         if ($ex instanceof Guzzle\Http\Exception\BadResponseException) {
             $response = $ex->getResponse();
             $responseBody = $response->getBody();
             $rawHeaders = $response->getRawHeaders();
             $responseHeaders = $this->getHttpResponseHeaders($rawHeaders);
             $responseCode = $response->getStatusCode();
         } else {
             throw $ex;
         }
     }
     $this->client->getLogger()->debug('guzzle response', array('code' => $responseCode, 'headers' => $responseHeaders, 'body' => $responseBody));
     return array($responseBody, $responseHeaders, $responseCode);
 }
Ejemplo n.º 7
0
 /**
  * Execute an HTTP Request
  *
  * @param Google_HttpRequest $request the http request to be executed
  * @return Google_HttpRequest http request with the response http code,
  * response headers and response body filled in
  * @throws Google_IO_Exception on curl or IO error
  */
 public function executeRequest(Google_Http_Request $request)
 {
     $curl = curl_init();
     if ($request->getPostBody()) {
         curl_setopt($curl, CURLOPT_POSTFIELDS, $request->getPostBody());
     }
     $requestHeaders = $request->getRequestHeaders();
     if ($requestHeaders && is_array($requestHeaders)) {
         $curlHeaders = array();
         foreach ($requestHeaders as $k => $v) {
             $curlHeaders[] = "{$k}: {$v}";
         }
         curl_setopt($curl, CURLOPT_HTTPHEADER, $curlHeaders);
     }
     curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $request->getRequestMethod());
     curl_setopt($curl, CURLOPT_USERAGENT, $request->getUserAgent());
     curl_setopt($curl, CURLOPT_FOLLOWLOCATION, false);
     curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
     curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
     curl_setopt($curl, CURLOPT_HEADER, true);
     curl_setopt($curl, CURLOPT_URL, $request->getUrl());
     if ($request->canGzip()) {
         curl_setopt($curl, CURLOPT_ENCODING, 'gzip,deflate');
     }
     foreach ($this->options as $key => $var) {
         curl_setopt($curl, $key, $var);
     }
     if (!isset($this->options[CURLOPT_CAINFO])) {
         curl_setopt($curl, CURLOPT_CAINFO, dirname(__FILE__) . '/cacerts.pem');
     }
     $response = curl_exec($curl);
     if ($response === false) {
         throw new Google_IO_Exception(curl_error($curl));
     }
     $headerSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
     $responseBody = substr($response, $headerSize);
     $responseHeaderString = substr($response, 0, $headerSize);
     $responseHeaders = $this->getHttpResponseHeaders($responseHeaderString);
     $responseCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
     return array($responseBody, $responseHeaders, $responseCode);
 }
 public function testProcess()
 {
     $client = $this->getClient();
     $data = 'foo';
     // Test data *only* uploads.
     $request = new Google_Http_Request('http://www.example.com', 'POST');
     $media = new Google_Http_MediaFileUpload($client, $request, 'image/png', $data, false);
     $this->assertEquals($data, $request->getPostBody());
     // Test resumable (meta data) - we want to send the metadata, not the app data.
     $request = new Google_Http_Request('http://www.example.com', 'POST');
     $reqData = json_encode("hello");
     $request->setPostBody($reqData);
     $media = new Google_Http_MediaFileUpload($client, $request, 'image/png', $data, true);
     $this->assertEquals(json_decode($reqData), $request->getPostBody());
     // Test multipart - we are sending encoded meta data and post data
     $request = new Google_Http_Request('http://www.example.com', 'POST');
     $reqData = json_encode("hello");
     $request->setPostBody($reqData);
     $media = new Google_Http_MediaFileUpload($client, $request, 'image/png', $data, false);
     $this->assertContains($reqData, $request->getPostBody());
     $this->assertContains(base64_encode($data), $request->getPostBody());
 }
Ejemplo n.º 9
0
 private function getResumeUri()
 {
     $result = null;
     $body = $this->request->getPostBody();
     if ($body) {
         $headers = array('content-type' => 'application/json; charset=UTF-8', 'content-length' => Google_Utils::getStrLen($body), 'x-upload-content-type' => $this->mimeType, 'x-upload-content-length' => $this->size, 'expect' => '');
         $this->request->setRequestHeaders($headers);
     }
     $response = $this->client->getIo()->makeRequest($this->request);
     $location = $response->getResponseHeader('location');
     $code = $response->getResponseHttpCode();
     if (200 == $code && true == $location) {
         return $location;
     }
     throw new Google_Exception("Failed to start the resumable upload");
 }
 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());
 }
Ejemplo n.º 11
0
 /**
  * @visible for testing
  * Process an http request that contains an enclosed entity.
  * @param Google_Http_Request $request
  * @return Google_Http_Request Processed request with the enclosed entity.
  */
 public function processEntityRequest(Google_Http_Request $request)
 {
     $postBody = $request->getPostBody();
     $contentType = $request->getRequestHeader("content-type");
     // Set the default content-type as application/x-www-form-urlencoded.
     if (false == $contentType) {
         $contentType = self::FORM_URLENCODED;
         $request->setRequestHeaders(array('content-type' => $contentType));
     }
     // Force the payload to match the content-type asserted in the header.
     if ($contentType == self::FORM_URLENCODED && is_array($postBody)) {
         $postBody = http_build_query($postBody, '', '&');
         $request->setPostBody($postBody);
     }
     // Make sure the content-length header is set.
     if (!$postBody || is_string($postBody)) {
         $postsLength = strlen($postBody);
         $request->setRequestHeaders(array('content-length' => $postsLength));
     }
     return $request;
 }
Ejemplo n.º 12
0
 /**
  * Execute an API request.
  *
  * This is a copy/paste from the parent class that uses Moodle's implementation
  * of curl. Portions have been removed or altered.
  *
  * @param Google_Http_Request $request the http request to be executed
  * @return Google_Http_Request http request with the response http code, response
  * headers and response body filled in
  * @throws Google_IO_Exception on curl or IO error
  */
 public function executeRequest(Google_Http_Request $request)
 {
     $curl = new curl();
     if ($request->getPostBody()) {
         $curl->setopt(array('CURLOPT_POSTFIELDS' => $request->getPostBody()));
     }
     $requestHeaders = $request->getRequestHeaders();
     if ($requestHeaders && is_array($requestHeaders)) {
         $curlHeaders = array();
         foreach ($requestHeaders as $k => $v) {
             $curlHeaders[] = "{$k}: {$v}";
         }
         $curl->setopt(array('CURLOPT_HTTPHEADER' => $curlHeaders));
     }
     $curl->setopt(array('CURLOPT_URL' => $request->getUrl()));
     $curl->setopt(array('CURLOPT_CUSTOMREQUEST' => $request->getRequestMethod()));
     $curl->setopt(array('CURLOPT_USERAGENT' => $request->getUserAgent()));
     $curl->setopt(array('CURLOPT_FOLLOWLOCATION' => false));
     $curl->setopt(array('CURLOPT_SSL_VERIFYPEER' => true));
     $curl->setopt(array('CURLOPT_RETURNTRANSFER' => true));
     $curl->setopt(array('CURLOPT_HEADER' => true));
     if ($request->canGzip()) {
         $curl->setopt(array('CURLOPT_ENCODING' => 'gzip,deflate'));
     }
     $curl->setopt($this->options);
     $respdata = $this->do_request($curl, $request);
     $infos = $curl->get_info();
     $respheadersize = $infos['header_size'];
     $resphttpcode = (int) $infos['http_code'];
     $curlerrornum = $curl->get_errno();
     $curlerror = $curl->error;
     if ($respdata != CURLE_OK) {
         throw new Google_IO_Exception($curlerror);
     }
     list($responseHeaders, $responseBody) = $this->parseHttpResponse($respdata, $respheadersize);
     return array($responseBody, $responseHeaders, $resphttpcode);
 }
Ejemplo n.º 13
0
 /**
  * Execute an HTTP Request
  *
  * @param Google_Http_Request $request the http request to be executed
  * @return array containing response headers, body, and http code
  * @throws Google_IO_Exception on curl or IO error
  */
 public function executeRequest(Google_Http_Request $request)
 {
     $default_options = stream_context_get_options(stream_context_get_default());
     $requestHttpContext = array_key_exists('http', $default_options) ? $default_options['http'] : array();
     if ($request->getPostBody()) {
         $requestHttpContext["content"] = $request->getPostBody();
     }
     $requestHeaders = $request->getRequestHeaders();
     if ($requestHeaders && is_array($requestHeaders)) {
         $headers = "";
         foreach ($requestHeaders as $k => $v) {
             $headers .= "{$k}: {$v}\r\n";
         }
         $requestHttpContext["header"] = $headers;
     }
     $requestHttpContext["method"] = $request->getRequestMethod();
     $requestHttpContext["user_agent"] = $request->getUserAgent();
     $requestSslContext = array_key_exists('ssl', $default_options) ? $default_options['ssl'] : array();
     # UpdraftPlus patch
     //     if (!array_key_exists("cafile", $requestSslContext)) {
     //       $requestSslContext["cafile"] = dirname(__FILE__) . '/cacerts.pem';
     //     }
     $url = $request->getUrl();
     if (preg_match('#^https?://([^/]+)/#', $url, $umatches)) {
         $cname = $umatches[1];
     } else {
         $cname = false;
     }
     # UpdraftPlus patch
     // Added
     if (empty($this->options['disable_verify_peer'])) {
         $requestSslContext['verify_peer'] = true;
         if (version_compare(PHP_VERSION, '5.6.0', '>=')) {
             if (!empty($cname)) {
                 $requestSslContext['peer_name'] = $cname;
             }
         } else {
             if (!empty($cname)) {
                 $requestSslContext['CN_match'] = $cname;
                 $retry_on_fail = true;
             }
         }
     } else {
         $requestSslContext['allow_self_signed'] = true;
     }
     if (!empty($this->options['cafile'])) {
         $requestSslContext['cafile'] = $this->options['cafile'];
     }
     $options = array("http" => array_merge(self::$DEFAULT_HTTP_CONTEXT, $requestHttpContext), "ssl" => array_merge($requestSslContext));
     $context = stream_context_create($options);
     # UpdraftPlus patch
     //     $url = $request->getUrl();
     if ($request->canGzip()) {
         $url = self::ZLIB . $url;
     }
     $this->client->getLogger()->debug('Stream request', array('url' => $url, 'method' => $request->getRequestMethod(), 'headers' => $requestHeaders, 'body' => $request->getPostBody()));
     // We are trapping any thrown errors in this method only and
     // throwing an exception.
     $this->trappedErrorNumber = null;
     $this->trappedErrorString = null;
     // START - error trap.
     set_error_handler(array($this, 'trapError'));
     $fh = fopen($url, 'r', false, $context);
     # UpdraftPLus patch
     if (!$fh && isset($retry_on_fail) && !empty($cname) && 'www.googleapis.com' == $cname) {
         // Reset
         $this->trappedErrorNumber = null;
         $this->trappedErrorString = null;
         global $updraftplus;
         $updraftplus->log("Using Stream, and fopen failed; retrying different CN match to try to overcome");
         // www.googleapis.com does not match the cert now being presented - *.storage.googleapis.com; presumably, PHP's stream handler isn't handling alternative names properly. Rather than turn off all verification, let's retry with a new name to match.
         $options['ssl']['CN_match'] = 'www.storage.googleapis.com';
         $context = stream_context_create($options);
         $fh = fopen($url, 'r', false, $context);
     }
     restore_error_handler();
     // END - error trap.
     if ($this->trappedErrorNumber) {
         $error = sprintf("HTTP Error: Unable to connect: '%s'", $this->trappedErrorString);
         $this->client->getLogger()->error('Stream ' . $error);
         throw new Google_IO_Exception($error, $this->trappedErrorNumber);
     }
     $response_data = false;
     $respHttpCode = self::UNKNOWN_CODE;
     if ($fh) {
         if (isset($this->options[self::TIMEOUT])) {
             stream_set_timeout($fh, $this->options[self::TIMEOUT]);
         }
         $response_data = stream_get_contents($fh);
         fclose($fh);
         $respHttpCode = $this->getHttpResponseCode($http_response_header);
     }
     if (false === $response_data) {
         $error = sprintf("HTTP Error: Unable to connect: '%s'", $respHttpCode);
         $this->client->getLogger()->error('Stream ' . $error);
         throw new Google_IO_Exception($error, $respHttpCode);
     }
     $responseHeaders = $this->getHttpResponseHeaders($http_response_header);
     $this->client->getLogger()->debug('Stream response', array('code' => $respHttpCode, 'headers' => $responseHeaders, 'body' => $response_data));
     return array($response_data, $responseHeaders, $respHttpCode);
 }
 /**
  * Replace the execute method, so we can test against the contents
  *
  * Don't actually do anything, just return a faked up response
  *
  * @param Google_Http_Request $request the http request to be executed
  * @return array containing response headers, body, and http code
  */
 public function executeRequest(Google_Http_Request $request)
 {
     PHPUnit_Framework_Assert::assertEquals($this->str_request_body_for_testing, $request->getPostBody());
     PHPUnit_Framework_Assert::assertEquals($this->str_request_url_for_testing, $request->getUrl());
     return array($this->str_expected_response, [], '200');
 }