- Модуль: 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'],
);
}