- Модуль: main
- Путь к файлу: ~/bitrix/modules/main/classes/general/site_checker.php
- Класс: CSiteCheckerTest
- Вызов: CSiteCheckerTest::check_pull_stream
function check_pull_stream()
{
if (CModule::IncludeModule('pull'))
{
$text = md5(mt_rand(100000,999999));
$channelId = md5($text);
$id = CPullChannel::SignChannel($channelId);
if (CPullOptions::GetQueueServerStatus())
{
$isServerShared = CPullOptions::IsServerShared();
if($isServerShared && !BitrixPullSharedServerConfig::isRegistered())
{
$this->arTestVars['push_stream_fail'] = true;
return $this->Result(false, GetMessage("MAIN_SC_PULL_NOT_REGISTERED"));
}
else if (CPullOptions::GetQueueServerVersion() < 4)
{
$this->arTestVars['push_stream_warn'] = true;
return $this->Result(null, GetMessage("MAIN_SC_PULL_UNSUPPORTED_VERSION"));
}
else
{
if (!$ar = parse_url(str_replace('#DOMAIN#', $this->host, BitrixPullConfig::getPublishUrl($id))))
return $this->Result(false, GetMessage("MAIN_SC_PATH_PUB"));
$pub_domain = $ar['host'];
$pub_host = ($ar['scheme'] == 'https' ? 'ssl://' : '').$pub_domain;
$pub = $ar['path'].'?'.$ar['query'];
$pub_port = $ar['port'];
if (!$pub_port)
$pub_port = $ar['scheme'] == 'https' ? 443 : 80;
if($isServerShared)
{
$listenUrl = BitrixPullSharedServerConfig::getLongPollingUrl();
$listenUrl .= "?CHANNEL_ID=".$id . "&clientId=".BitrixPullSharedServerClient::getPublicLicenseCode();
}
else
{
$listenUrl = $this->ssl ? CPullOptions::GetListenSecureUrl($id) : CPullOptions::GetListenUrl($id);
}
if (!$ar = parse_url(str_replace('#DOMAIN#', $this->host, $listenUrl)))
return $this->Result(false, GetMessage("MAIN_SC_PATH_SUB"));
$sub_domain = $ar['host'];
$sub_host = ($ar['scheme'] == 'https' ? 'ssl://' : '').$sub_domain;
$sub = $ar['path'].'?'.$ar['query'];
$sub_port = $ar['port'];
if (!$sub_port)
$sub_port = $ar['scheme'] == 'https' ? 443 : 80;
}
}
else
{
$this->arTestVars['push_stream_fail'] = true;
return $this->Result(false, GetMessage("MAIN_SC_STREAM_DISABLED_2"));
}
}
else
{
$this->arTestVars['push_stream_fail'] = true;
return $this->Result(false, GetMessage("MAIN_NO_PULL"));
}
$ver = CPullOptions::GetQueueServerVersion();
$bNodeJS = $ver > 2;
echo 'Server version: '.$ver.($bNodeJS ? ' (Bitrix Push server)' : ' (nginx-push-stream-module)')."n";
$strRequest0 = 'POST '.$pub.' HTTP/1.0'."rn".
'Host: '.$pub_domain."rn".
'Content-Length: '.strlen($text)."rn".
"rn".
$text."rn";
$strRequest1 = 'GET '.$sub.' HTTP/1.0'."rn".
'If-Modified-Since: '.date('r', time() - 86400)."rn".
'Host: '.$sub_domain."rnrn";
$strRequest2 = 'DELETE '.$pub.' HTTP/1.0'."rn".
'Host: '.$sub_domain."rnrn";
if (!$bNodeJS)
{
// POST - to create a channel
if (!$res0 = $this->ConnectToHost($pub_host, $pub_port))
{
$this->arTestVars['push_stream_fail'] = true;
return $this->Result(false, GetMessage("MAIN_SC_NO_PUSH_STREAM_CONNECTION"));
}
fwrite($res0, $strRequest0);
fclose($res0);
}
// GET - connection
if (!$res1 = $this->ConnectToHost($sub_host, $sub_port))
{
$this->arTestVars['push_stream_fail'] = true;
return $this->Result(false, GetMessage("MAIN_SC_NO_SUB_CONNECTION_2"));
}
fwrite($res1, $strRequest1);
sleep(1); // we need some time to create channel
// POST - message
$postResult = CPullChannel::Send($channelId, $text, ['dont_wait_answer' => false]);
if(!$postResult)
{
$this->arTestVars['push_stream_fail'] = true;
return $this->Result(false, GetMessage("MAIN_SC_NO_PUSH_STREAM_CONNECTION"));
}
// GET - message
$strRes1 = fread($res1, 4096);
$retVal = true;
if (false === strpos($strRes1, $text))
{
// PrintHTTP($strRequest0, $strHeaders0, $strRes0);
PrintHTTP($strRequest1, $strHeaders1, $strRes1);
$this->arTestVars['push_stream_fail'] = true;
$retVal = $this->Result(false, GetMessage("MAIN_SC_PUSH_INCORRECT", ['#MODULE#' => $bNodeJS ? 'Bitrix Push server' : 'nginx-push-stream-module']));
}
// DELETE
if (!$res2 = $this->ConnectToHost($pub_host, $pub_port))
{
$this->arTestVars['push_stream_fail'] = true;
return $this->Result(false, GetMessage("MAIN_SC_NO_PUSH_STREAM_CONNECTION_2"));
}
fwrite($res2, $strRequest2);
fclose($res2);
if ($retVal == true && COption::GetOptionString('main', 'session_expand', 'Y') <> 'N' && (!defined("BX_SKIP_SESSION_EXPAND") || BX_SKIP_SESSION_EXPAND === false))
return $this->Result(null, GetMessage('MAIN_SC_WARN_EXPAND_SESSION'));
return $retVal;
}