/** * 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; }
/** * 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; }