CalDAV 客户端的 Report 方法不请求新的事件数据

CalDAV client's Report method not requesting for the new event data

我目前正在为我的日历应用程序开发一个 caldav 同步服务器层。我能够回答日历客户端的所有初始请求,目前仍坚持使用 REPORT 方法。

在日历上完成 PROPFIND 后,它会要求提供 CTag 和 Sync-Token。我确实通过提供 CTag 和 Sync-Token 来回答这个查询(目前模拟服务器,我动态生成这些值并为客户端提供服务)。

在接下来的查询中,请求的方法是日历上的REPORT,如下所示:

来自客户的请求:

REPORT URI  /users/admin%40a.de/calendar/ PROTOCOL HTTP/1.1
----------------------------------------
Accept-encoding  gzip, deflate
Accept  */*
Connection  keep-alive
Prefer  return=minimal
Host  **************
Brief  t
User-agent  Mac+OS+X/10.10.5 (14F27) CalendarAgent/316.1
Depth  1
Authorization  Basic YWRtaW5AYS5kZTpwYXNz
Accept-language  en-us
Content-type  text/xml
Content-length  260
Request body: <?xml version="1.0" encoding="UTF-8"?>
<A:sync-collection xmlns:A="DAV:">
  <A:sync-token>http://calserver.org/ns/sync-token/1</A:sync-token>
  <A:sync-level>1</A:sync-level>
  <A:prop>
    <A:getcontenttype/>
    <A:getetag/>
  </A:prop>
</A:sync-collection>

服务器响应:

响应头

Content-type: text/calendar;  charset=UTF-8
Connection:   keep-alive
Date  Thu, 17 Dec 2015 19:35:40 GMT
Transfer-encoding  chunked
Http/1.1  207 Multi-Status

响应正文

<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\" xmlns:E=\"urn:ietf:params:xml:ns:carddav\">
<D:response>
 <D:propstat>
  <D:href>/calendar/2601ddd19c1001.ics</D:href>
  <D:prop>
         <D:getcontenttype>text/calendar</D:getcontenttype>
         <D:getetag>"334411222s12"</D:getetag>
  </D:prop>
  <D:status>HTTP/1.1 200 OK</D:status>
 </D:propstat>
</D:response>
</D:multistatus>

现在我的问题是,在服务器响应中,我通过提供新的ETag值回答REPORT方法已经创建了一个新事件,但是客户端没有请求数据??

我应该如何以及何时提供新活动的日历数据以及客户的请求是什么???

  • 内容类型不应该是text/xml,应该是text/calendar
  • etag 需要用双引号括起来。
  • 我很确定按照您的方式在 uri 中使用 + 是个坏主意。如果您想对 space 进行编码,请改用 %20,但最好完全避免任何类型的特殊编码。
  • 对同步收集报告的响应还必须在响应正文中包含当前同步​​令牌。参见 https://www.rfc-editor.org/rfc/rfc6578#section-6.4

对多次编辑感到困惑,但响应 header 中的内容类型绝对应该是 text/xml

内容类型:text/xml;字符集=UTF-8