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