• Модуль: rest
  • Путь к файлу: ~/bitrix/modules/rest/classes/general/rest_provider.php
  • Класс: CRestProvider
  • Вызов: CRestProvider::methodsBatch
static function methodsBatch($arQuery, $start, CRestServer $server)
{
	$arQuery = array_change_key_case($arQuery, CASE_UPPER);

	$bHalt = (isset($arQuery['HALT'])) ? ((bool) $arQuery['HALT']) : false;

	$arResult = array(
		'result' => array(),
		'next' => array(),
		'total' => array(),
		'time' => array(),
		'error' => array(),
	);
	if(isset($arQuery['CMD']))
	{
		$cnt = 0;

		$authData = $server->getAuth();
		foreach ($arQuery['CMD'] as $key => $call)
		{
			if(($cnt++) < CRestUtil::BATCH_MAX_LENGTH)
			{
				if (!is_string($call))
				{
					continue;
				}
				$queryData = parse_url($call);

				$method = $queryData['path'];
				$query = $queryData['query'];

				$arParams = CRestUtil::ParseBatchQuery($query, $arResult);

				if($method === CRestUtil::METHOD_DOWNLOAD || $method === CRestUtil::METHOD_UPLOAD)
				{
					$res = array('error' => self::ERROR_BATCH_METHOD_NOT_ALLOWED, 'error_description' => 'Method is not allowed for batch usage');
				}
				else
				{
					if(is_array($authData))
					{
						foreach($authData as $authParam => $authValue)
						{
							$arParams[$authParam] = $authValue;
						}
					}

					$methods = [ToLower($method), $method];

					// try lowercase first, then original
					foreach ($methods as $restMethod)
					{
						$pseudoServer = new CRestServerBatchItem([
							'CLASS' => __CLASS__,
							'METHOD' => $restMethod,
							'QUERY' => $arParams
						], false);
						$pseudoServer->setApplicationId($server->getClientId());
						$pseudoServer->setAuthKeys(array_keys($authData));
						$pseudoServer->setAuthData($server->getAuthData());
						$pseudoServer->setAuthType($server->getAuthType());
						$res = $pseudoServer->process();

						unset($pseudoServer);

						// try original controller name if lower is not found
						if (is_array($res) && !empty($res['error']) && $res['error'] === 'ERROR_METHOD_NOT_FOUND')
						{
							continue;
						}

						// output result
						break;
					}
				}
			}
			else
			{

				$res = array('error' => self::ERROR_BATCH_LENGTH_EXCEEDED, 'error_description' => 'Max batch length exceeded');
			}

			if(is_array($res))
			{
				if(isset($res['error']))
				{
					$res['error'] = $res;
				}

				foreach ($res as $k=>$v)
				{
					$arResult[$k][$key] = $v;
				}
			}

			if(isset($res['error']) && $res['error'] && $bHalt)
			{
				break;
			}
		}
	}

	return array(
		'result' => $arResult['result'],
		'result_error' => $arResult['error'],
		'result_total' => $arResult['total'],
		'result_next' => $arResult['next'],
		'result_time' => $arResult['time'],
	);
}