' . filesize($full) . '';
$mod = $full !== null ? gmdate('D, d M Y H:i:s', filemtime($full)) . ' GMT' : '';
return '' . htmlspecialchars($href) . '' . $size
. '' . $mod . '' . ($isDir ? '' : '') . ''
. 'HTTP/1.1 200 OK';
};
switch ($method) {
case 'MKCOL':
if (file_exists($file)) { http_response_code(405); exit; }
if (!is_dir(dirname($file))) { http_response_code(409); exit; }
mkdir($file, 0755);
http_response_code(201);
break;
case 'PUT':
if (!is_dir(dirname($file))) { http_response_code(409); exit; }
$data = (string) file_get_contents('php://input');
if (file_exists($root . '/.truncate')) $data = substr($data, 0, (int) (strlen($data) / 2));
$existed = file_exists($file);
file_put_contents($file, $data);
http_response_code($existed ? 204 : 201);
break;
case 'DELETE':
if (!file_exists($file)) { http_response_code(404); exit; }
is_dir($file) ? @rmdir($file) : unlink($file);
http_response_code(204);
break;
case 'HEAD':
case 'GET':
if (!is_file($file)) { http_response_code(404); exit; }
header('Content-Length: ' . filesize($file));
if ($method === 'GET') readfile($file);
break;
case 'PROPFIND':
if (!file_exists($file) && $rel !== '') { http_response_code(404); exit; }
$xml = '';
$xml .= $entry($path, basename($rel), $rel === '' ? null : $file);
if (is_dir($file) && ($_SERVER['HTTP_DEPTH'] ?? '1') !== '0') {
foreach (scandir($file) ?: [] as $e) {
if ($e === '.' || $e === '..' || $e[0] === '.') continue;
$xml .= $entry(rtrim($path, '/') . '/' . rawurlencode($e), $e, $file . '/' . $e);
}
}
$xml .= '';
http_response_code(207);
header('Content-Type: application/xml; charset=utf-8');
echo $xml;
break;
default:
http_response_code(405);
}