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
我目前正在为我的日历应用程序开发一个 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