• Модуль: dav
  • Путь к файлу: ~/bitrix/modules/dav/classes/general/groupdavclient.php
  • Класс: CDavGroupdavClient
  • Вызов: CDavGroupdavClient::GetResponse
private function GetResponse()
{
	if (!$this->connected)
		return null;

	$arHeaders = array();
	$body = "";

	while ($line = fgets($this->fp, 4096))
	{
		if ($line == "rn")
			break;

		$arHeaders[] = trim($line);
	}

	if (count($arHeaders) <= 0)
		return null;

	$bChunked = $bConnectionClosed = false;
	$contentLength = null;
	foreach ($arHeaders as $value)
	{
		if (!$bChunked && preg_match("#Transfer-Encoding:s*chunked#i", $value))
			$bChunked = true;
		if (!$bConnectionClosed && preg_match('#Connection:s*close#i', $value))
			$bConnectionClosed = true;
		if (is_null($contentLength))
		{
			if (preg_match('#Content-Length:s*([0-9]*)#i', $value, $arMatches))
				$contentLength = intval($arMatches[1]);
			if (preg_match('#HTTP/1.1s+204#i', $value))
				$contentLength = 0;
		}
	}

	if ($bChunked)
	{
		do
		{
			$line = fgets($this->fp, 4096);
			$line = mb_strtolower($line);

			$chunkSize = "";
			$i = 0;
			while ($i < mb_strlen($line))
			{
				$c = mb_substr($line, $i, 1);
				if (in_array($c, array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f")))
					$chunkSize .= $c;
				else
					break;
				$i++;
			}

			$chunkSize = hexdec($chunkSize);

			if ($chunkSize > 0)
			{
				$lb = $chunkSize;
				$body1 = '';
				$crutchCnt = 0;
				while ($lb > 0)
				{
					$d = fread($this->fp, $lb);
					if ($d === false)
						break;

					if ($d === '')
					{
						$crutchCnt++;
						if ($crutchCnt > 10)
							break;
					}
					else
					{
						$crutchCnt = 0;

						$body1 .= $d;
						$lb = $chunkSize - ((function_exists('mb_strlen')? mb_strlen($body1, 'latin1') : mb_strlen($body1)));
					}
				}
				$body .= $body1;
			}

			fgets($this->fp, 4096);
		}
		while ($chunkSize);
	}
	elseif ($contentLength === 0)
	{
	}
	elseif ($contentLength > 0)
	{
		$lb = $contentLength;
		while ($lb > 0)
		{
			$d = fread($this->fp, $lb);
			if ($d === false)
				break;

			$body .= $d;
			$lb = $contentLength - (function_exists('mb_strlen')? mb_strlen($body, 'latin1') : mb_strlen($body));
		}
	}
	else
	{
		socket_set_timeout($this->fp, 0);

		while (!feof($this->fp))
		{
			$d = fread($this->fp, 4096);
			if ($d === false)
				break;

			$body .= $d;
			if (mb_substr($body, -9) == "rnrn0rnrn")
			{
				$body = mb_substr($body, 0, -9);
				break;
			}
		}

		socket_set_timeout($this->fp, $this->socketTimeout);
	}

	if ($bConnectionClosed)
		$this->Disconnect();

	$response = new CDavGroupdavClientResponce($arHeaders, $body);

	$httpVersion = $response->GetStatus('version');
	if (is_null($httpVersion) || ($httpVersion != 'HTTP/1.1' && $httpVersion != 'HTTP/1.0'))
		return null;

	return $response;
}