• Модуль: dav
  • Путь к файлу: ~/bitrix/modules/dav/classes/general/webdav.php
  • Класс: CDavWebDav
  • Вызов: CDavWebDav::PUTWrapper
protected function PUTWrapper($handler = "PUT")
{
	/** @var CDavRequest $request */
	$request = $this->request;
	$response = $this->response;

	if (!$this->CheckLockStatus($request->GetPath()))
	{
		$response->SetHttpStatus("423 Locked");
		return;
	}

	$arContentParameters = $request->GetContentParameters();

	$errorMessage = "";
	if (!strncmp($arContentParameters["CONTENT_TYPE"], "multipart/", 10))
	{
		$errorMessage = "The service does not support mulipart PUT requests";
	}
	elseif (array_key_exists("CONTENT_ENCODING", $arContentParameters))
	{
		$errorMessage = str_replace("#VAL#", $arContentParameters["CONTENT_ENCODING"],
			"The service does not support '#VAL#' content encoding");
	}
	elseif (array_key_exists("HTTP_CONTENT_MD5", $arContentParameters))
	{
		$errorMessage = "The service does not support content MD5 checksum verification";
	}
	else
	{
		// RFC 2616 2.6: The recipient of the entity MUST NOT ignore any Content-* (e.g. Content-Range) headers that it
		// does not understand or implement and MUST return a 501 (Not Implemented) response in such cases.
		foreach ($arContentParameters as $key => $value)
		{
			if (!in_array($key, array('CONTENT_ENCODING', 'CONTENT_LANGUAGE', 'CONTENT_LENGTH', 'CONTENT_LOCATION', 'CONTENT_RANGE', 'CONTENT_TYPE', 'CONTENT_MD5')))
			{
				$errorMessage = str_replace("#VAL#", $value, "The service does not support '#VAL#'");
				break;
			}
		}
	}

	if ($errorMessage <> '')
	{
		$response->GenerateError("501 not implemented", $errorMessage);
		return;
	}

	if (array_key_exists("CONTENT_RANGE", $arContentParameters))	// RFC 2616 14.16
	{
		if (!preg_match('@bytess+(d+)-(d+)/((d+)|*)@', $arContentParameters["CONTENT_RANGE"], $matches))
		{
			$response->GenerateError("400 bad request", "The service does only support single byte ranges");
			return;
		}

		$range = array("START" => $matches[1], "END" => $matches[2]);
		if (is_numeric($matches[3]))
			$range["TOTAL_LENGTH"] = $matches[3];

		$arContentParameters["CONTENT_RANGE"] = $range;
	}

	$arResult = array();
	$stat = $this->$handler($arResult);

	if ($stat === false)
	{
		$stat = "403 Forbidden";
	}
	elseif (is_resource($stat) && get_resource_type($stat) === 'stream')
	{
		$inputStream = fopen('php://input', 'rb');

		@set_time_limit(0);
		$stream = $stat;
		$stat = $arResult['new'] ? '201 Created' : '204 No Content';

		if (!empty($arContentParameters["CONTENT_RANGE"]))
		{
			if (0 == fseek($stream, $arContentParameters["CONTENT_RANGE"]['START'], SEEK_SET))
			{
				$length = $arContentParameters["CONTENT_RANGE"]['END'] - $arContentParameters["CONTENT_RANGE"]['START'] + 1;
				if (!fwrite($stream, fread($inputStream, $length)))
				{
					$stat = '403 Forbidden';
				}
			}
			else
			{
				$stat = '403 Forbidden';
			}
		}
		else
		{
			while (!feof($inputStream))
			{
				$xxx = fread($inputStream, 8192);
				if (false === fwrite($stream, $xxx))
				{
					$stat = '403 Forbidden';
					break;
				}
			}
		}
		fclose($stream);

		if (method_exists($this, 'PutCommit') && !$this->PutCommit($arResult))
		{
			$stat = '409 Conflict';
		}
	}

	$response->SetHttpStatus($stat);
	$response->AddHeader('Location: ' . ($request->GetParameter("HTTPS") === "on" ? "https" : "http").'://'.$request->GetParameter('HTTP_HOST').$request->getPath());
}