- Модуль: webservice
- Путь к файлу: ~/bitrix/modules/webservice/classes/general/soap/soapserver.php
- Класс: fetchingCWSSOAPResponser
- Вызов: CWSSOAPResponser::ProcessRequestBody
function ProcessRequestBody(&$cserver, $body)
{
$functionName = $body->name();
$namespaceURI = $body->namespaceURI();
$requestNode = $body;
// If this is request name in functionName, get functionName.
if (!in_array($functionName, $this->FunctionList)
and isset($this->MessageTags[$functionName])
)
{
$functionName = $this->MessageTags[$functionName];
}
if (!in_array($functionName, $this->FunctionList))
{
CSOAPServer::ShowSOAPFault("Trying to access unregistered function: ".$functionName);
return true;
}
$objectName = "";
$params = array();
$paramsDecoder = new CSOAPResponse($functionName, $namespaceURI);
$paramsDecoder->setTypensVars($this->TypensVars);
if (!isset($this->TypensVars[$functionName]) or
!isset($this->TypensVars[$functionName]["myclassname"]) or
!isset($this->TypensVars[$functionName]["input"])
)
{
CSOAPServer::ShowSOAPFault("Requested function has no type specified: ".$functionName);
return true;
}
$objectName = $this->TypensVars[$functionName]["myclassname"];
$inputParams = $this->TypensVars[$functionName]["input"];
$httpAuth = "N";
if (isset($this->TypensVars[$functionName]["httpauth"]))
{
$httpAuth = $this->TypensVars[$functionName]["httpauth"];
}
if ($httpAuth == "Y" and !CWebService::MethodRequireHTTPAuth($objectName, $functionName))
{
CSOAPServer::ShowSOAPFault("Requested function requires HTTP Basic Auth to be done before.");
return true;
}
$requestParams = array(); // reorganize params
foreach ($requestNode->children() as $parameterNode)
{
if (!$parameterNode->name())
continue;
$requestParams[$parameterNode->name()] = $parameterNode;
}
// check parameters/decode // check strict params
foreach ($inputParams as $pname => $param)
{
$decoded = null;
if (isset($requestParams[$pname]))
{
$decoded = $paramsDecoder->decodeDataTypes($requestParams[$pname]);
}
if (is_object($decoded) and (get_class($decoded) == "CSOAPFault" or get_class($decoded) == "csoapfault"))
{
CSOAPServer::ShowSOAPFault($decoded);
return true;
}
if (
!isset($decoded) and (!isset($param["strict"])
or (isset($param["strict"]) and $param["strict"] == "strict"))
)
{
CSOAPServer::ShowSOAPFault("Request has not enough params of strict type to be decoded. ");
return true;
}
$params[] = $decoded;
}
unset($paramsDecoder);
$object = null;
if (class_exists($objectName))
$object = new $objectName;
if (is_object($object) && method_exists($object, $functionName))
{
$this->ShowResponse(
$cserver,
$functionName,
$namespaceURI,
call_user_func_array(
array($object, $functionName),
$params
)
);
}
else if (!class_exists($objectName))
{
$this->ShowResponse(
$cserver,
$functionName,
$namespaceURI,
new CSOAPFault('Server Error', 'Object not found')
);
}
else
{
$this->ShowResponse(
$cserver,
$functionName,
$namespaceURI,
new CSOAPFault('Server Error', 'Method not found')
);
}
return true;
}