EN · DE · RU · FR · ES

#1865: CarddavTestClient.kt

projectforge-carddav/src/test/kotlin/org/projectforge/carddav/CarddavTestClient.kt Утилита тестирования / инструмент разработки — пакет org.projectforge.carddav, projectforge-carddav/src/test/kotlin/org/projectforge/carddav/CarddavTestClient.kt 468 строк · 372 кода · 60 комментариев · 36 пустых
Автономный тестовый клиент CardDAV с функцией main() и классом HTTP-клиента. Используется для ручного тестирования и отладки CardDAV-сервера. Поддерживает запросы OPTIONS/PROPFIND/GET/REPORT, коллекции sync-token, получение VCard с анализом PHOTO и пакетный экспорт всех контактов. Включает обширные закомментированные тестовые последовательности, показывающие итеративную разработку поддержки протокола CardDAV.

Архитектура

Это инструмент отладки разработчика, а не модульный тест. Он имеет точку входа main() и работает как автономный CardDAV-клиент для тестирования реализации сервера. Файл содержит обширный закомментированный код, показывающий эволюцию тестирования протокола CardDAV.

Импорты и зависимости

ИмпортНазначение
org.apache.hc.client5.http.*Apache HttpClient 5 для HTTP-взаимодействия (HttpGet, CloseableHttpClient, HttpClients, ClassicHttpResponse, ContentType, HttpEntity, HttpClientResponseHandler, StringEntity, ClassicRequestBuilder, HttpCoreContext)
org.projectforge.common.extensions.abbreviateФункция-расширение Kotlin для усечения длинных строк в выводе лога
java.util.Base64Кодировщик Base64 JDK для заголовка HTTP Basic Authentication

Структура класса: CardDavTestClient

Параметры конструктора

Внутренний класс: ResponseData

Простой класс данных, содержащий content: String, status: Int и headers: String из HTTP-ответов.

Аутентификация

Использует HTTP Basic Authentication с заголовком Authorization: Basic {base64(username:password)}, формируемым один раз при инициализации.

Обработчик ответов

Функциональный HttpClientResponseHandler, который читает сущность ответа как текст в кодировке UTF-8 и извлекает код статуса и заголовки.

Ключевые методы

run() — Стандартная тестовая последовательность

Выполняет поток протокола CardDAV: OPTIONS → GET (VCard) → GET (фото). Большая часть исходного тестового кода (PROPFIND, REPORT, sync-collection) закомментирована, но примеры XML-тел запросов сохранены для справки.

fetchAllVCards() — Пакетный экспорт VCard

Загружает все VCard с сервера с помощью запроса REPORT addressbook-query CardDAV, сохраняет каждую VCard в /tmp/carddav-vcards/ и анализирует записи PHOTO. Выводит статистику по:

Этот метод сыграл ключевую роль в отладке обработки фото в CardDAV (режимы URL и встроенных изображений).

sendRequest() — Универсальный HTTP-запрос

Формирует и выполняет HTTP-запросы с настраиваемым методом, путём, телом, аутентификацией и логированием. Использует ClassicRequestBuilder из Apache HttpClient 5.

analyzePhoto(vcard) — Парсер свойства PHOTO

Анализирует данные VCard для определения режима кодирования фото:

Обрабатывает перенос строк VCard (строки продолжения, начинающиеся с пробела).

Главная функция — CLI-интерфейс

Использование: CardDavTestClient <имя_пользователя> <dav-токен> [--fetch-all]
  --fetch-all: Загрузить все VCard с сервера и сохранить в /tmp/carddav-vcards/

Позиционные аргументы: имя пользователя, DAV-токен, опциональный базовый URL, опциональный токен синхронизации.

Файл содержит закомментированные справочные данные, показывающие реальные ответы CardDAV-сервера:
Запрос с методом=OPTIONS для Milton (uri=/users/username/, session-id=null)
Ошибка базовой аутентификации, заголовок 'authorization' не найден.
Обнаружен вызов PROPFIND: /users/username/
PROPFIND для Milton (uri=/users/username/addressBooks/default/
REPORT для Milton (uri=/users/username/addressBooks/default/
Это показывает, что CardDAV-сервер изначально был построен на фреймворке WebDAV Milton, а текущая реализация реализует этот протокол нативно.
Файл служит одновременно тестовым клиентом и живой документацией реализации протокола CardDAV. Закомментированные тела запросов PROPFIND/REPORT являются валидным XML CardDAV, документирующим ожидаемое поведение сервера.

История Git

868d6abb7 2025 -> 2026
bbf6b792c VCard upload: специальная обработка поля формы.
f2ceb72f1 CardDav: относительные photo-urls.
63081666f Заголовки исходных файлов: 2024 -> 2025.
943947aaa Адреса: поддержка gif и jpeg (также для carddav сервера).
fc6301b43 WIP: CardDavServer.
c4062ed97 WIP: Carddav
40e554cbe WIP: Carddav