【问题标题】:403 CalDAV error: valid-calendar-object-resource403 CalDAV 错误:有效日历对象资源
【发布时间】:2017-11-23 17:59:49
【问题描述】:

我正在尝试在 iCloud 日历中创建一个新事件。我收到valid-calendar-object-resource 错误,根据spec 表示我的PUT 请求不符合Section 4.1 in the spec

但是,这是请求的主体,据我所知,它确实满足 4.1 中的所有要求:

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//sebbo.net//ical-generator//EN
BEGIN:VEVENT
UID:3xq8@the-calendar-api.herokuapp.com
SEQUENCE:0
DTSTAMP:20160113T023753Z
DTSTART:20160113T033753Z
DTEND:20160113T043753Z
SUMMARY:Example Event
DESCRIPTION:It works
END:VEVENT
END:VCALENDAR

该 iCalendar 数据有什么问题吗,或者错误是否在其他地方?

请求选项

对节点使用request

{"auth":{"user":"feifan@me.com","pass":"XXX"},"headers":{"Content-Type":"text/calendar","Depth":"1","User-Agent":"DAVKit/4.0.1 (730); CalendarStore/4.0.1 (973); iCal/4.0.1 (1374); Mac OS X/10.6.2 (10C540)"},"method":"PUT","url":"https://p05-caldav.icloud.com/267369040/calendars/home/","body":"BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//sebbo.net//ical-generator//EN\r\nBEGIN:VEVENT\r\nUID:cc2x@the-calendar-api.herokuapp.com\r\nSEQUENCE:0\r\nDTSTAMP:20160114T061844Z\r\nDTSTART:20160114T071844Z\r\nDTEND:20160114T081844Z\r\nSUMMARY:Example Event\r\nDESCRIPTION:It works\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n"}

回应:

<?xml version='1.0' encoding='UTF-8'?><error xmlns='DAV:'><valid-calendar-object-resource xmlns='urn:ietf:params:xml:ns:caldav'/></error>

CURL 尝试

curl -v -X PUT -H "Content-Type:text/calendar" -H "User-Agent:DAVKit/4.0.1 (730); CalendarStore/4.0.1 (973); iCal/4.0.1 (1374); Mac OS X/10.6.2 (10C540)" -u "feifan@me.com:XXXXX" --data-binary @- https://p05-caldav.icloud.com/267369040/calendars/home/  <<EOF
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//sebbo.net//ical-generator//EN
BEGIN:VEVENT
UID:3xq8@the-calendar-api.herokuapp.com
SEQUENCE:0
DTSTAMP:20160113T023753Z
DTSTART:20160113T033753Z
DTEND:20160113T043753Z
SUMMARY:Example Event
DESCRIPTION:It works
END:VEVENT
END:VCALENDAR
EOF

CURL 详细响应

Trying 17.248.128.211...
* Connected to p05-caldav.icloud.com (17.248.128.211) port 443 (#0)
* TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
* Server certificate: *.icloud.com
* Server certificate: Apple IST CA 2 - G1
* Server certificate: GeoTrust Global CA
* Server auth using Basic with user 'feifan@me.com'
> PUT /267369040/calendars/home/ HTTP/1.1
> Host: p05-caldav.icloud.com
> Authorization: Basic XXXXXX=
> Accept: */*
> Content-Type:text/calendar
> User-Agent:DAVKit/4.0.1 (730); CalendarStore/4.0.1 (973); iCal/4.0.1 (1374); Mac OS X/10.6.2 (10C540)
> Content-Length: 273
>
* upload completely sent off: 273 out of 273 bytes
< HTTP/1.1 403 Forbidden
< Content-Type: text/xml
< DAV: 1, access-control, calendar-access, calendar-schedule, calendar-auto-schedule, calendar-managed-attachments, calendarserver-sharing, calendarserver-subscribed, calendarserver-home-sync
< Server: iCloudCalendarServer 15G33
< Date: Thu, 14 Jan 2016 15:40:18 GMT
< X-Responding-Server: st11p02me-caldav042 11 a63660a6f7d1a25b5a7ed66dab0da843
< X-Transaction-Id: b22d6d88-e7dd-4766-a92a-b42dca0775f3
< Content-Length: 137
< Strict-Transport-Security: max-age=31536000; includeSubDomains
< Via: icloudedge:sv05p00ic-ztde010832:8401:15G126:San Jose
< X-Apple-Request-UUID: b22d6d88-e7dd-4766-a92a-b42dca0775f3
< Access-Control-Expose-Headers: X-Apple-Request-UUID
< Access-Control-Expose-Headers: Via
< x-apple-edge-info: AAAAAQA7aHR0cHM6Ly9wMDItY2FsZGF2LmljbG91ZC5jb206NDQzLzI2NzM2OTA0MC9jYWxlbmRhcnMvaG9tZS8ACXVuZGVmaW5lZAAA
<
* Connection #0 to host p05-caldav.icloud.com left intact
<?xml version='1.0' encoding='UTF-8'?><error xmlns='DAV:'><valid-calendar-object-resource xmlns='urn:ietf:params:xml:ns:caldav'/></error>

【问题讨论】:

  • 您是否在身份验证旁边添加了任何标题?您是把活动放到您的个人日历还是共享日历中?
  • 完整的 HTTP 交互(当然不包括 pwd)会很有趣(即 Charles 跟踪)。 iCalendar 数据是否以 LF 终止(而不仅仅是 CR LF)?我有点相信只有在解析器失败时才会引发“有效日历对象资源”错误,而不是在其他情况下。
  • 看起来 iCloud 同时接受 LF 和 CR LF。我仍然可以在两个线路终止的情况下成功上传事件。
  • 客户端是否呈现任何信封、前缀或后缀?看起来 iCloud 解析器相当宽容。即使我在文件开头插入像“yxcyvalid-calendar-data。
  • 我将 PUT 发送到我的 /home 日历,并设置内容类型标题。在更新的问题中请求详细信息和回复

标签: calendar http-status-code-403 caldav


【解决方案1】:

iCalendar 数据本身似乎很好,因为它对我有用。我可以将您的活动上传到我的帐户,它会显示在我的日历中。

请确认

  1. 您在PUT 事件时指定了正确的内容类型text/calendar
  2. 您正在写入的集合实际上支持事件。 iCloud 为 VEVENTs 和 VTODOs 使用单独的集合。虽然,如果我尝试写入 VTODO-only 集合,我会重定向到主日历集合而不是错误。

更新

根据您的要求再提供两个 cmets。

  1. 发送带有PUT 请求的Depth 标头没有任何意义,您应该删除它,但不会导致错误

  2. 您的 PUT 被定向到日历集合 URL,而不是集合的成员 URL。大多数服务器会立即拒绝。 iCloud 似乎接受了这一点并无论如何都会创建事件。但看起来你只能这样做一次。对日历集合 URL 的后续 PUT 请求将被拒绝,并出现 412 Precondition Failed 错误(即使 UID 不同),直到事件被删除。

    您应该附加一个随机文件名。使用包含 &lt;UID&gt;.ics 之类的事件的 UID 的内容是一种很好的做法,但您应该考虑首先删除 @,因为对于何时或是否对其进行编码存在很多混淆。

但是,我仍然无法使用此数据重现问题。

更新

好的,现在我可以重现它了。如上所述,问题在于您没有在 URL 中指定文件名。

像这样再次尝试 curl 请求:

curl -v -X PUT -H "Content-Type:text/calendar" -u "feifan@me.com:XXXXX" --data-binary @- https://p05-caldav.icloud.com/267369040/calendars/home/3xq8the-calendar-api.herokuapp.com.ics  <<EOF
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//sebbo.net//ical-generator//EN
BEGIN:VEVENT
UID:3xq8@the-calendar-api.herokuapp.com
SEQUENCE:0
DTSTAMP:20160113T023753Z
DTSTART:20160113T033753Z
DTEND:20160113T043753Z
SUMMARY:Example Event
DESCRIPTION:It works
END:VEVENT 
END:VCALENDAR
EOF

注意网址末尾的文件名。同样正如@hnh 所提到的,使用您自己的用户代理。不要让您的客户伪装成其他人。

【讨论】:

  • Marten,如果您将 VTODO 写入不支持它们的集合,则服务器必须返回 supported-calendar-component 前置条件。你看到的看起来像是支持老客户的黑客,但在那种情况下你不应该看到valid-calendar-object-resource。 (RFC 4791 5.2.3)
  • 很奇怪,我没能重现这个错误信息。上传具有冲突 UID 的事件以及上传完整的垃圾会返回不同的错误消息。
  • 完整的垃圾可能不会触发它,因为解析器可能无法启动。尝试一个最有效的 iCalendar,但缺少一些必需的属性。您还可以使用 grep 获取有效日历数据的 CalendarServer 源...
  • 我正在设置内容类型标头并写入我的 /home 日历……我已经用我发送的请求和响应标头更新了问题
  • 3.将 User-Agent 设置为你不是的东西可能会在服务器中触发不同的行为。不要那样做,使用自己的 UA。
【解决方案2】:

刚刚遇到相同的错误消息。我的解决方法是切换到POST 而不是PUTPOST 是创建新资源时的适当 HTTP 方法,而 PUT 用于替换现有资源。更改方法为我解决了这个问题。

在上述情况下,curl 命令的开头如下:

curl -v -X PUT ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-20
    • 1970-01-01
    • 1970-01-01
    • 2014-11-19
    • 1970-01-01
    • 2016-12-14
    • 1970-01-01
    相关资源
    最近更新 更多