如何确定 VAlarm 是否因 CalDav 中的事件而更改?
How to find out if VAlarm changed for an Event in CalDav?
在玩 Google Calendar 和 CalDav 时,我意识到如果针对给定事件修改通知(警报),事件的 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 违规行为:
- CalDAV 指定服务器应使用强标签:https://www.rfc-editor.org/rfc/rfc4791#section-5.3.4
- 强 etags 几乎对应于位到位比较:https://www.rfc-editor.org/rfc/rfc2616#section-13.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 日历服务器在使用同步时暴露出同样的问题,我会感到非常惊讶。
在玩 Google Calendar 和 CalDav 时,我意识到如果针对给定事件修改通知(警报),事件的 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 违规行为:
- CalDAV 指定服务器应使用强标签:https://www.rfc-editor.org/rfc/rfc4791#section-5.3.4
- 强 etags 几乎对应于位到位比较:https://www.rfc-editor.org/rfc/rfc2616#section-13.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 日历服务器在使用同步时暴露出同样的问题,我会感到非常惊讶。