Синхронизация протокола CalDAV и поведение разных клиентов

В настоящее время я пытаюсь реализовать "простой" CALDAV-интерфейс только для чтения для системы. Но протокол синхронизации и CALDAV-клиенты доставляют мне некоторые головные боли.

Основным тестовым клиентом, который я использую, является macos-calendar (sierra). Начальное рукопожатие (принцип DAV, поиск по календарю) и начальная загрузка данных работают. Я получаю несколько отчетов: запросы календаря. Проблема заключается в добавочной синхронизации после начальной загрузки. Есть два подхода:

  • Через расширение WebSync (REPORT:sync-collection и sync-token prop) моя главная проблема заключается в том, что предоставление sync-токена с сервера не является тривиальным в моей системе. Изменения и новые данные - это не проблема, а физическое удаление (еще не зарегистрированное в пользовательском контексте) и изменения в области назначений групп и / или ролей. Может быть, мне нужно рассмотреть, чтобы в сложных случаях аннулировать токен синхронизации и позволить клиенту выполнить сброс без синхронизации? Неприятным обходным решением может быть сохранение идентификаторов элементов календаря, отправленных клиенту, и проверка каждого запроса на их наличие и, если необходимо, ответы на них с не найденным для каждого элемента календаря, удаленного или находящегося за пределами области видимости. Но это будет означать, что я храню клиентское состояние на сервере, который не звучит правильно и может быть подвержен ошибкам.

  • Посредством базовой синхронизации протоколов (ответ на ОТЧЕТ: календарь-запрос и propfind (глубина =1) не запрашивают никакой активной веб-синхронизации), это также в принципе уже работает для новых и измененных данных. Но макос-календарь не удаляет элементы, которые не являются частью ответа коллекции (propfind with deep =1). Согласно протоколу клиент должен определить удаленные элементы и удалить их, но в моем случае этого не происходит. Есть идеи здесь? Для моей системы в настоящее время было бы идеально использовать этот подход, хотя производительность может быть не идеальной.

С ios-Calendar я столкнулся с еще одной проблемой:

  • Начальное рукопожатие как-то работает, поскольку запросы в сети приходят и отвечают.

  • Но затем приходит запрос MKCALENDAR (вместо запроса календаря или propfind для элементов), который отвечает 403, поскольку я также не предоставляю его в заголовке Allow-ответа ответа опций. запрос выглядит так:

MKCALENDAR /services/cal/_userid/220EDB4A-F00C-41C9-B78F-10781BBA77E4/ HTTP/1.1 Host: 127.0.0.1:8003 Content-Type: text/xml User-Agent: iOS/10.0.1 (14A403) dataaccessd/1.0 <?xml version="1.0" encoding="UTF-8"?> <B:mkcalendar xmlns:B="urn:ietf:params:xml:ns:caldav"> <A:set xmlns:A="DAV:"> <A:prop> <B:calendar-free-busy-set> <NO/> </B:calendar-free-busy-set> <D:calendar-order xmlns:D="http://apple.com/ns/ical/">1</D:calendar-order> <A:displayname>Kalender</A:displayname> <B:calendar-timezone>BEGIN:VCALENDAR ...deleted.... </B:calendar-timezone> <B:supported-calendar-component-set> <B:comp name="VEVENT"/> </B:supported-calendar-component-set> </A:prop> </A:set> </B:mkcalendar>

  • Ничего не происходит потом.

  • Кто-нибудь испытывает это? Почему ios-calendar пытается сделать mkcalendar, хотя у меня есть коллекция календаря как тип ресурса?

С Молнией Громовой Птицы:

  • Начальное рукопожатие с календарем-сборником работает

  • На запрос propfind и multiget для элементов отвечает iCal-Items.

  • Но они не отображаются и в журнале ошибок я получаю:

  • Предупреждение: CalDAV: сбой: CalDAV: ошибка: получен статус 200 при получении данных календаря для отладочного прокси, ноль

  • (текст на немецком языке: код ошибки: 0x80004005) Предупреждение: Fehler beim Lesen von Daten für Kalender: отладочный прокси. Allerdings ist dieser Fehler wahrscheinlich vernachlässigbar, daher versucht das Programm fortzufahren. Код Фехлера: 0x80004005. Beschreibung: CalDAV: Ошибка: получен статус 200 при извлечении данных календаря для отладочного прокси, ноль

  • (текст на немецком языке: код ошибки: READ_FAILED) Предупреждение: Fehler beim Lesen von Daten für Kalender: отладочный прокси. Allerdings ist dieser Fehler wahrscheinlich vernachlässigbar, daher versucht das Programm fortzufahren. Код Fehler: READ_FAILED. Beschreibung:

  • http канал Listener OnDataAvailable нарушение договора

  • хотя похожий ответ работает и в макос-календаре - может ли это быть проблемой кодирования?

Любые намеки высоко ценятся!

2 ответа

Решение

Это действительно довольно широкий вопрос. Но позвольте мне обратиться к некоторым вещам:

Через расширение WebSync (REPORT:sync-collection и sync-token prop) моя главная проблема заключается в том, что предоставление sync-токена с сервера не является тривиальным в моей системе

Даже если вам тяжело, вы должны действительно попытаться придумать что-то здесь. Даже если это означает хранение некоторой дополнительной информации на сервере. Синхронизация более эффективна. (Идея: может быть, вы можете хотя бы установить флаг, когда что-то действительно будет удалено, и только тогда срок действия токена синхронизации истечет?)

Посредством базовой протокольной синхронизации (ответьте на REPORT:calendar-query и propfind (deep =1))

Который из, calendar-range-query или же PROPFIND? Совершенно разные вещи...

это также работает в принципе для новых и измененных данных. Но макос-календарь не удаляет элементы, которые не являются частью ответа коллекции (propfind with deep =1).

Если мы говорим о запросе календарного диапазона, клиент не может предварительно удалить элементы, так как он не знает, покинули ли они диапазон (против удаления).

С PROPFIND это должно сделать это. Если у вас есть доказательства этого, возможно, создайте еще один вопрос со всеми соответствующими деталями.

С ios-Calendar я сталкиваюсь с другой проблемой: ... приходит запрос MKCALENDAR...

Это, вероятно, означает, что он не может найти календарь планирования по умолчанию, никакого календаря вообще, ни с соответствующим свойством типа компонента. Или все то же самое для задач (приложение напоминаний, та же учетная запись). Какова полезная нагрузка MKCALENDAR? Трудно диагностировать без подробностей, если вы не можете это выяснить, задайте конкретный вопрос по этому вопросу со всеми соответствующими деталями (например, XML, который вы отправляете в ответ на домашний запрос).

Молния Громовой Птицы

Не могу много сказать об этом, возможно, многое зависит от версии и того, какие расширения вы используете. AFAIK многие люди используют расширения ScalableOGo Thunderbird, чтобы получить правильный Cal/CardDAV с Thunderbird.

Для Thunderbird/Lightning вы можете включить calendar.debug.log а также calendar.debug.log.verbose в расширенном редакторе конфигурации и перезапустите. Вы можете найти это в Options > Advanced > General > Config Editor, Это даст вам более подробные http запросы и информацию о том, что не удалось. Вы также можете подключить удаленный отладчик и посмотреть на сетевой монитор или установить точки останова в коде.

Что касается Thunderbird/Lightning, обратите внимание, что мы используем сочетание предыдущих и текущих версий черновика webdav-sync. Я не могу много сказать из сообщения об ошибке, так как оно очень общее, но похоже, что в результатах есть что-то неожиданное.

Может быть, имеет смысл сравнить рукопожатие между существующим сервером (например, Sabre / DAV) и клиентом, а затем посмотреть, в чем разница между вашим общением и их.

Также вас может заинтересовать CalDAVTester от Apple, который проверяет совместимость серверов. Обратите внимание, что он содержит различные тесты для яблок. Сотрудники CalConnect работают вместе с Apple, чтобы сделать его более удобным для использования и разделить специфичные для Apple тесты. Поскольку ваш сервер предназначен только для чтения, не ожидайте, что все будет работать, но вы можете охотиться за исправлением определенных тестов.

Другие вопросы по тегам