如何确定 VAlarm 是否因 CalDav 中的事件而更改?

How to find out if VAlarm changed for an Event in CalDav?

在玩 Google CalendarCalDav 时,我意识到如果针对给定事件修改通知(警报),事件的 ETag 不会改变。

现在,比较 ETags 对于找出给定事件何时发生变化至关重要(在 CalDav 中)。


我用来找出 ETag 的请求是

<?xml version=\"1.0\" encoding=\"utf-8\"?><d:propfind xmlns:d=\"DAV:\" xmlns:cs=\"http://calendarserver.org/ns/\"><d:prop><d:getetag /></d:prop></d:propfind>

哪个会 return 像

<?xml version="1.0" encoding="UTF-8"?>
<D:multistatus xmlns:D="DAV:" xmlns:caldav="urn:ietf:params:xml:ns:caldav" xmlns:cs="http://calendarserver.org/ns/" xmlns:ical="http://apple.com/ns/ical/">

  <D:response xmlns:carddav="urn:ietf:params:xml:ns:carddav" xmlns:cm="http://cal.me.com/_namespace/" xmlns:md="urn:mobileme:davservices">
    <D:href>/caldav/v2/myemail@gmail.com/events/</D:href>
    <D:propstat>
      <D:status>HTTP/1.1 200 OK</D:status>
    </D:propstat>
  </D:response>

  <D:response xmlns:carddav="urn:ietf:params:xml:ns:carddav" xmlns:cm="http://cal.me.com/_namespace/" xmlns:md="urn:mobileme:davservices">
    <D:href>/caldav/v2/myemail%40gmail.com/events/xqrjsgs1gj35cpub2nnumntm5j%40google.com.ics</D:href>
    <D:propstat>
      <D:status>HTTP/1.1 200 OK</D:status>
      <D:prop>
        <D:getetag>"63723144835"</D:getetag>
      </D:prop>
    </D:propstat>
  </D:response>

</D:multistatus>

现在,在您修改 Google 日历中该事件的通知后,您仍然会得到相同的 ETag:

<D:getetag>"63723144835"</D:getetag>

为了查明事件中的 notification/Alarm 何时发生变化,我还需要查找其他内容吗?或者,我做错了什么吗?

在 Google CalDAV 实施方面,这绝对听起来像是 bug/protocol 违规行为:

  1. CalDAV 指定服务器应使用强标签:https://www.rfc-editor.org/rfc/rfc4791#section-5.3.4
  2. 强 etags 几乎对应于位到位比较:https://www.rfc-editor.org/rfc/rfc2616#section-13.3.3
  3. 即使返回弱 etag 有充分的理由,您返回的内容(例如“63723144835”)也不符合弱 etag 语法。应该看起来像“W/63723144835”(参见 https://www.rfc-editor.org/rfc/rfc2616#section-3.11

综上所述,您真的应该考虑使用 WebDAV 同步 (https://www.rfc-editor.org/rfc/rfc6578) 来监视给定日历集合中的更改。如果 Google 日历服务器在使用同步时暴露出同样的问题,我会感到非常惊讶。