/**
  * Call all API service that are in queue
  *
  * @return object
  */
 public function doQueue()
 {
     if (count($this->callsQueue) == 0) {
         $this->isMultiRequest = false;
         return null;
     }
     $startTime = microtime(true);
     $params = array();
     $files = array();
     $this->log("service url: [" . $this->config->getServiceUrl() . "]");
     // append the basic params
     $this->addParam($params, "apiVersion", $this->apiVersion);
     $this->addParam($params, "format", $this->config->getFormat());
     $this->addParam($params, "clientTag", $this->config->getClientTag());
     $this->addParam($params, "ignoreNull", true);
     $url = $this->config->getServiceUrl() . "/api_v3/index.php?service=";
     if ($this->isMultiRequest) {
         $url .= "multirequest";
         $i = 1;
         foreach ($this->callsQueue as $call) {
             $callParams = $call->getParamsForMultiRequest($i);
             $callFiles = $call->getFilesForMultiRequest($i);
             $params = array_merge($params, $callParams);
             $files = array_merge($files, $callFiles);
             $i++;
         }
     } else {
         $call = $this->callsQueue[0];
         $url .= $call->service . "&action=" . $call->action;
         $params = array_merge($params, $call->params);
         $files = $call->files;
     }
     // reset
     $this->callsQueue = array();
     $this->isMultiRequest = false;
     $signature = $this->signature($params);
     $this->addParam($params, "kalsig", $signature);
     list($postResult, $error) = $this->doHttpRequest($url, $params, $files);
     if ($error) {
         throw new ClientException($error, ClientException::ERROR_GENERIC);
     } else {
         $this->log("result (serialized): " . $postResult);
         if ($this->config->getFormat() == self::KALTURA_SERVICE_FORMAT_XML) {
             $result = $this->unmarshal($postResult);
             if (is_null($result)) {
                 throw new ClientException("failed to unserialize server result\n{$postResult}", ClientException::ERROR_UNSERIALIZE_FAILED);
             }
         } else {
             throw new ClientException("unsupported format: {$postResult}", ClientException::ERROR_FORMAT_NOT_SUPPORTED);
         }
     }
     $endTime = microtime(true);
     $this->log("execution time for [" . $url . "]: [" . ($endTime - $startTime) . "]");
     return $result;
 }
Example #2
0
 /**
  * Curl HTTP POST Request
  *
  * @param string $url
  * @param array $params
  * @return array of result, error code and error
  */
 private function doCurl($url, $params = array(), $files = array())
 {
     $this->responseHeaders = array();
     $requestHeaders = $this->config->getRequestHeaders();
     $params = $this->jsonEncode($params);
     $this->log("curl: {$url}");
     $this->log("post: {$params}");
     if ($this->config->getFormat() == self::KALTURA_SERVICE_FORMAT_JSON) {
         $requestHeaders[] = 'Accept: application/json';
     }
     $cookies = array();
     $ch = curl_init();
     curl_setopt($ch, CURLOPT_URL, $url);
     curl_setopt($ch, CURLOPT_POST, 1);
     if (count($files) > 0) {
         $params = array('json' => $params);
         foreach ($files as $key => $file) {
             // The usage of the @filename API for file uploading is
             // deprecated since PHP 5.5. CURLFile must be used instead.
             if (PHP_VERSION_ID >= 50500) {
                 $params[$key] = new \CURLFile($file);
             } else {
                 $params[$key] = "@" . $file;
                 // let curl know its a file
             }
         }
         curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
     } else {
         $requestHeaders[] = 'Content-Type: application/json';
         curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
     }
     curl_setopt($ch, CURLOPT_ENCODING, 'gzip,deflate');
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
     curl_setopt($ch, CURLOPT_USERAGENT, $this->config->getUserAgent());
     if (count($files) > 0) {
         curl_setopt($ch, CURLOPT_TIMEOUT, 0);
     } else {
         curl_setopt($ch, CURLOPT_TIMEOUT, $this->config->getCurlTimeout());
     }
     if ($this->config->getStartZendDebuggerSession() === true) {
         $zendDebuggerParams = $this->getZendDebuggerParams($url);
         $cookies = array_merge($cookies, $zendDebuggerParams);
     }
     if (count($cookies) > 0) {
         $cookiesStr = http_build_query($cookies, null, '; ');
         curl_setopt($ch, CURLOPT_COOKIE, $cookiesStr);
     }
     if ($this->config->getProxyHost()) {
         curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, true);
         curl_setopt($ch, CURLOPT_PROXY, $this->config->getProxyHost());
         if ($this->config->getProxyPort()) {
             curl_setopt($ch, CURLOPT_PROXYPORT, $this->config->getProxyPort());
         }
         if ($this->config->getProxyUser()) {
             curl_setopt($ch, CURLOPT_PROXYUSERPWD, $this->config->getProxyUser() . ':' . $this->config->getProxyPassword());
         }
         if ($this->config->getProxyType() === 'SOCKS5') {
             curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
         }
     }
     // Set SSL verification
     if (!$this->config->getVerifySSL()) {
         curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
         curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
     }
     // Set custom headers
     curl_setopt($ch, CURLOPT_HTTPHEADER, $requestHeaders);
     // Save response headers
     curl_setopt($ch, CURLOPT_HEADERFUNCTION, array($this, 'readHeader'));
     $result = curl_exec($ch);
     $curlErrorCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
     $curlError = curl_error($ch);
     curl_close($ch);
     return array($result, $curlErrorCode, $curlError);
 }
 /**
  * Call all API service that are in queue
  *
  * @return object
  */
 public function doQueue()
 {
     if (count($this->callsQueue) == 0) {
         $this->multiRequestReturnType = null;
         return null;
     }
     $startTime = microtime(true);
     $params = array();
     $files = array();
     $this->log("service url: [" . $this->config->getServiceUrl() . "]");
     // append the basic params
     $this->addParam($params, "apiVersion", $this->apiVersion);
     $this->addParam($params, "format", $this->config->getFormat());
     $this->addParam($params, "clientTag", $this->config->getClientTag());
     $this->addParam($params, "ignoreNull", true);
     $url = $this->config->getServiceUrl() . "/api_v3/index.php?service=";
     if (!is_null($this->multiRequestReturnType)) {
         $url .= "multirequest";
         $i = 1;
         foreach ($this->callsQueue as $call) {
             $callParams = $call->getParamsForMultiRequest($i);
             $callFiles = $call->getFilesForMultiRequest($i);
             $params = array_merge($params, $callParams);
             $files = array_merge($files, $callFiles);
             $i++;
         }
     } else {
         $call = $this->callsQueue[0];
         $url .= $call->service . "&action=" . $call->action;
         $params = array_merge($params, $call->params);
         $files = $call->files;
     }
     // reset
     $this->callsQueue = array();
     $signature = $this->signature($params);
     $this->addParam($params, "kalsig", $signature);
     list($postResult, $errorCode, $error) = $this->doHttpRequest($url, $params, $files);
     if ($error || $errorCode != 200) {
         $error .= ". RC : {$errorCode}";
         throw new ClientException($error, ClientException::ERROR_GENERIC);
     } else {
         // print server debug info to log
         $serverName = null;
         $serverSession = null;
         foreach ($this->responseHeaders as $curHeader) {
             $splittedHeader = explode(':', $curHeader, 2);
             if ($splittedHeader[0] == 'X-Me') {
                 $serverName = trim($splittedHeader[1]);
             } else {
                 if ($splittedHeader[0] == 'X-Kaltura-Session') {
                     $serverSession = trim($splittedHeader[1]);
                 }
             }
         }
         if (!is_null($serverName) || !is_null($serverSession)) {
             $this->log("server: [{$serverName}], session: [{$serverSession}]");
         }
         $this->log("result (serialized): " . $postResult);
         if ($this->config->getFormat() != self::KALTURA_SERVICE_FORMAT_XML) {
             throw new ClientException("unsupported format: {$postResult}", ClientException::ERROR_FORMAT_NOT_SUPPORTED);
         }
     }
     $endTime = microtime(true);
     $this->log("execution time for [" . $url . "]: [" . ($endTime - $startTime) . "]");
     return $postResult;
 }