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

标签 http webdav caldav

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

当 PROPFIND 在 Calendar 上完成时,它会要求 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 中使用 + 是个坏主意。如果您想对空格进行编码,请改用 %20,但最好完全避免任何类型的特殊编码。
  • 对同步收集报告的响应还必须在响应正文中包含当前同步​​ token 。参见 https://www.rfc-editor.org/rfc/rfc6578#section-6.4

关于http - CalDAV 客户端的 Report 方法不请求新的事件数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34343468/

相关文章:

security - 网络抓取工具能否绕过良好的 throttle 保护?

java - 如何发送参数值包含空格的 GET 请求?

java - Jakarta commons HTTPClient 无法使用 php 在我的 apache 服务器上发送发布请求

tomcat - tomcat webdav 是否支持carddav?

webdav - WebDAV PROPFIND 方法中 Depth header 的含义

c# - 如何使用 webdav 将文件上传到文件夹?

php - 如何在 SabreDAV PHP 服务器中为 CalDAV 实现自定义 ACL

Java 的 HttpURLConnection 不支持 REPORT/PROPFIND - 我该怎么办?

python - 通过 RRULE 和 DTSTART 从重复事件中获取日期

安卓:未知主机异常