Search code examples
ioscalendarwebdavcaldav

Developing Carddav/Caldav Server. Events disappear clientside on iOS after syncing


I am currently developing a carddav / caldav server. I can already communicate with lots of clients on windows / windows phone / android. Now I tryed syncing with iOS. Addressbook syncing works fine but the calendar app behaves strange. It syncs all the calendars and appointments and shows them correctly.It even links the participants in an event to the contact in the addressbook. But once syncing is finished, the calendars and appointments disappear completely. Anybody has a hint?

My testdevice is an IPad 2 with iOS 8.3 (12F69).

Here is the communication. I am leaving out the requests without Authorization Header. Also i had to edit the hostname but it is the same during all requests.

I don't answer a lot of the properties iOS asks. But since all appointments show correctly during a short time, these shouldn't be needed. Also a lot of them are not part of the caldav specification (but still placed in the same xmlns?).

Initial Propfind

Request

PROPFIND host:9998/.well-known/caldav HTTP/1.1
Host: host:9998
User-Agent: iOS/8.3 (12F69) accountsd/1.0
Accept-Language: de-de
Accept-Encoding: gzip, deflate
Accept: */*
Content-Type: text/xml
Prefer: return=minimal
Depth: 0
Connection: keep-alive
Authorization: Basic ZmdoZ2poZ2g6a2dmZ2hqaA==
Content-Length: 181
Brief: t

<?xml version="1.0" encoding="UTF-8"?>
<A:propfind xmlns:A="DAV:">
  <A:prop>
    <A:current-user-principal/>
    <A:principal-URL/>
    <A:resourcetype/>
  </A:prop>
</A:propfind>

Response

HTTP/1.1 207 Multi-Status
Server: Apache-Coyote/1.1
Allow: OPTIONS, GET, HEAD, DELETE, PROPFIND, PUT, REPORT
DAV: 1, 3, extended-mkcol, addressbook, access-control, calendar-access
MS-Author-Via: DAV
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Connection: Keep-Alive
Keep-Alive: timeout=5, max=100
Accept-Ranges: bytes
Content-Type: text/xml
Content-Length: 791
Date: Tue, 15 Dec 2015 08:25:22 GMT

<?xml version="1.0" encoding="UTF-8"?>
<d:multistatus xmlns:d="DAV:" xmlns:cal="urn:ietf:params:xml:ns:caldav" xmlns:card="urn:ietf:params:xml:ns:carddav" xmlns:cs="http://calendarserver.org/ns/">
  <d:response>
    <d:href>/.well-known/caldav/</d:href>
    <d:propstat>
      <d:prop>
        <d:resourcetype>
          <d:collection/>
        </d:resourcetype>
        <d:current-user-principal>
          <d:href>/.well-known/caldav/DEVELOPMENT/principals/Robert%20Glaser/</d:href>
        </d:current-user-principal>
        <d:principal-url>
          <d:href>/.well-known/caldav/DEVELOPMENT/principals/Robert%20Glaser/</d:href>
        </d:principal-url>
      </d:prop>
      <d:status>HTTP/1.1 200 OK</d:status>
    </d:propstat>
  </d:response>
</d:multistatus>

Options

Request

OPTIONS http://host:9998/.well-known/caldav/DEVELOPMENT/principals/Robert%20Glaser/ HTTP/1.1
Host: host:9998
Authorization: Basic bW5iam5ia2tqaHZmOm1oZ2o=
Accept-Encoding: gzip, deflate
Accept: */*
Content-Length: 0
Accept-Language: de-de
Connection: keep-alive
User-Agent: iOS/8.3 (12F69) accountsd/1.0

Response

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Allow: OPTIONS, GET, HEAD, DELETE, PROPFIND, PUT, REPORT
DAV: 1, 3, extended-mkcol, addressbook, access-control, calendar-access
MS-Author-Via: DAV
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Connection: Keep-Alive
Keep-Alive: timeout=5, max=100
Accept-Ranges: bytes
Content-Type: text/xml
Content-Length: 0
Date: Tue, 15 Dec 2015 08:25:22 GMT

Propfind (I don't answer a lot of properties here)

Request

PROPFIND host:9998/.well-known/caldav/DEVELOPMENT/principals/Robert%20Glaser/ HTTP/1.1
Host: host:9998
User-Agent: iOS/8.3 (12F69) dataaccessd/1.0
Accept-Language: de-de
Accept-Encoding: gzip, deflate
Accept: */*
Content-Type: text/xml
Prefer: return=minimal
Depth: 0
Connection: keep-alive
Authorization: Basic bW5iam5ia2tqaHZmOm1oZ2o=
Content-Length: 743
Brief: t
<A:propfind xmlns:A="DAV:">
  <A:prop>
    <B:calendar-home-set xmlns:B="urn:ietf:params:xml:ns:caldav"/>
    <B:calendar-user-address-set xmlns:B="urn:ietf:params:xml:ns:caldav"/>
    <A:current-user-principal/>
    <A:displayname/>
    <C:dropbox-home-URL xmlns:C="http://calendarserver.org/ns/"/>
    <C:email-address-set xmlns:C="http://calendarserver.org/ns/"/>
    <C:notification-URL xmlns:C="http://calendarserver.org/ns/"/>
    <A:principal-collection-set/>
    <A:principal-URL/>
    <A:resource-id/>
    <B:schedule-inbox-URL xmlns:B="urn:ietf:params:xml:ns:caldav"/>
    <B:schedule-outbox-URL xmlns:B="urn:ietf:params:xml:ns:caldav"/>
    <A:supported-report-set/>
  </A:prop>
</A:propfind>

Response

HTTP/1.1 207 Multi-Status
Server: Apache-Coyote/1.1
Allow: OPTIONS, GET, HEAD, DELETE, PROPFIND, PUT, REPORT
DAV: 1, 3, extended-mkcol, addressbook, access-control, calendar-access
MS-Author-Via: DAV
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Connection: Keep-Alive
Keep-Alive: timeout=5, max=100
Accept-Ranges: bytes
Content-Type: text/xml
Content-Length: 958
Date: Tue, 15 Dec 2015 08:25:48 GMT

<?xml version="1.0" encoding="UTF-8"?>
<d:multistatus xmlns:d="DAV:" xmlns:cal="urn:ietf:params:xml:ns:caldav" xmlns:card="urn:ietf:params:xml:ns:carddav" xmlns:cs="http://calendarserver.org/ns/">
  <d:response>
    <d:href>/.well-known/caldav/DEVELOPMENT/principals/Robert%20Glaser/</d:href>
    <d:propstat>
      <d:prop>
        <d:displayname>Robert Glaser</d:displayname>
        <d:current-user-principal>
          <d:href>/.well-known/caldav/DEVELOPMENT/principals/Robert%20Glaser/</d:href>
        </d:current-user-principal>
        <cal:calendar-home-set>
          <d:href>/.well-known/caldav/DEVELOPMENT/calendars/Robert%20Glaser/</d:href>
        </cal:calendar-home-set>
        <d:principal-url>
          <d:href>/.well-known/caldav/DEVELOPMENT/principals/Robert%20Glaser/</d:href>
        </d:principal-url>
      </d:prop>
      <d:status>HTTP/1.1 200 OK</d:status>
    </d:propstat>
  </d:response>
</d:multistatus>

Propfind

Request

PROPFIND http://host:9998/.well-known/carddav/DEVELOPMENT/principals/Robert%20Glaser/ HTTP/1.1
Host: host:9998
User-Agent: iOS/8.3 (12F69) dataaccessd/1.0
Accept-Language: de-de
Accept-Encoding: gzip, deflate
Accept: */*
Content-Type: text/xml
Prefer: return=minimal
Depth: 0
Connection: keep-alive
Authorization: Basic Z2poZ2o6amhqamo=
Content-Length: 439
Brief: t

<?xml version="1.0" encoding="UTF-8"?>
<A:propfind xmlns:A="DAV:">
  <A:prop>
    <D:addressbook-home-set xmlns:D="urn:ietf:params:xml:ns:carddav"/>
    <D:directory-gateway xmlns:D="urn:ietf:params:xml:ns:carddav"/>
    <A:displayname/>
    <C:email-address-set xmlns:C="http://calendarserver.org/ns/"/>
    <A:principal-collection-set/>
    <A:principal-URL/>
    <A:resource-id/>
    <A:supported-report-set/>
  </A:prop>
</A:propfind>

Response

HTTP/1.1 207 Multi-Status
Server: Apache-Coyote/1.1
Allow: OPTIONS, GET, HEAD, DELETE, PROPFIND, PUT, REPORT
DAV: 1, 3, extended-mkcol, addressbook, access-control, calendar-access
MS-Author-Via: DAV
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Connection: Keep-Alive
Keep-Alive: timeout=5, max=100
Accept-Ranges: bytes
Content-Type: text/xml
Content-Length: 795
Date: Tue, 15 Dec 2015 08:25:48 GMT

<?xml version="1.0" encoding="UTF-8"?>
<d:multistatus xmlns:d="DAV:" xmlns:cal="urn:ietf:params:xml:ns:caldav" xmlns:card="urn:ietf:params:xml:ns:carddav" xmlns:cs="http://calendarserver.org/ns/">
  <d:response>
    <d:href>/.well-known/carddav/DEVELOPMENT/principals/Robert%20Glaser/</d:href>
    <d:propstat>
      <d:prop>
        <d:displayname>Robert Glaser</d:displayname>
        <card:addressbook-home-set>
          <d:href>/.well-known/carddav/DEVELOPMENT/addressbooks/</d:href>
        </card:addressbook-home-set>
        <d:principal-url>
          <d:href>/.well-known/carddav/DEVELOPMENT/principals/Robert%20Glaser/</d:href>
        </d:principal-url>
      </d:prop>
      <d:status>HTTP/1.1 200 OK</d:status>
    </d:propstat>
  </d:response>
</d:multistatus>

Propfind

Request

PROPFIND http://host:9998/.well-known/caldav/DEVELOPMENT/calendars/Robert%20Glaser/ HTTP/1.1
Host: host:9998
User-Agent: iOS/8.3 (12F69) dataaccessd/1.0
Accept-Language: de-de
Accept-Encoding: gzip, deflate
Accept: */*
Content-Type: text/xml
Prefer: return=minimal
Depth: 1
Connection: keep-alive
Authorization: Basic bW5iam5ia2tqaHZmOm1oZ2o=
Content-Length: 2097
Brief: t

<?xml version="1.0" encoding="UTF-8"?>
<A:propfind xmlns:A="DAV:">
  <A:prop>
    <A:add-member/>
    <C:allowed-sharing-modes xmlns:C="http://calendarserver.org/ns/"/>
    <F:autoprovisioned xmlns:F="http://apple.com/ns/ical/"/>
    <E:bulk-requests xmlns:E="http://me.com/_namespace/"/>
    <F:calendar-color xmlns:F="http://apple.com/ns/ical/"/>
    <B:calendar-description xmlns:B="urn:ietf:params:xml:ns:caldav"/>
    <B:calendar-free-busy-set xmlns:B="urn:ietf:params:xml:ns:caldav"/>
    <F:calendar-order xmlns:F="http://apple.com/ns/ical/"/>
    <B:calendar-timezone xmlns:B="urn:ietf:params:xml:ns:caldav"/>
    <A:current-user-privilege-set/>
    <B:default-alarm-vevent-date xmlns:B="urn:ietf:params:xml:ns:caldav"/>
    <B:default-alarm-vevent-datetime xmlns:B="urn:ietf:params:xml:ns:caldav"/>
    <A:displayname/>
    <C:getctag xmlns:C="http://calendarserver.org/ns/"/>
    <F:language-code xmlns:F="http://apple.com/ns/ical/"/>
    <F:location-code xmlns:F="http://apple.com/ns/ical/"/>
    <A:owner/>
    <C:pre-publish-url xmlns:C="http://calendarserver.org/ns/"/>
    <C:publish-url xmlns:C="http://calendarserver.org/ns/"/>
    <C:push-transports xmlns:C="http://calendarserver.org/ns/"/>
    <C:pushkey xmlns:C="http://calendarserver.org/ns/"/>
    <A:quota-available-bytes/>
    <A:quota-used-bytes/>
    <F:refreshrate xmlns:F="http://apple.com/ns/ical/"/>
    <A:resource-id/>
    <A:resourcetype/>
    <B:schedule-calendar-transp xmlns:B="urn:ietf:params:xml:ns:caldav"/>
    <B:schedule-default-calendar-URL xmlns:B="urn:ietf:params:xml:ns:caldav"/>
    <C:source xmlns:C="http://calendarserver.org/ns/"/>
    <C:subscribed-strip-alarms xmlns:C="http://calendarserver.org/ns/"/>
    <C:subscribed-strip-attachments xmlns:C="http://calendarserver.org/ns/"/>
    <C:subscribed-strip-todos xmlns:C="http://calendarserver.org/ns/"/>
    <B:supported-calendar-component-set xmlns:B="urn:ietf:params:xml:ns:caldav"/>
    <B:supported-calendar-component-sets xmlns:B="urn:ietf:params:xml:ns:caldav"/>
    <A:supported-report-set/>
    <A:sync-token/>
  </A:prop>
</A:propfind>

Response

HTTP/1.1 207 Multi-Status
Server: Apache-Coyote/1.1
Allow: OPTIONS, GET, HEAD, DELETE, PROPFIND, PUT, REPORT
DAV: 1, 3, extended-mkcol, addressbook, access-control, calendar-access
MS-Author-Via: DAV
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Connection: Keep-Alive
Keep-Alive: timeout=5, max=100
Accept-Ranges: bytes
Content-Type: text/xml
Content-Length: 2984
Date: Tue, 15 Dec 2015 08:25:49 GMT

<?xml version="1.0" encoding="UTF-8"?>
<d:multistatus xmlns:d="DAV:" xmlns:cal="urn:ietf:params:xml:ns:caldav" xmlns:card="urn:ietf:params:xml:ns:carddav" xmlns:cs="http://calendarserver.org/ns/">
  <d:response>
    <d:href>/.well-known/caldav/DEVELOPMENT/calendars/Robert%20Glaser/</d:href>
    <d:propstat>
      <d:prop>
        <d:resourcetype>
          <d:collection/>
        </d:resourcetype>
        <cs:getctag/>
        <d:displayname>Robert Glaser</d:displayname>
        <d:current-user-privilege-set>
          <d:privilege>
            <d:all/>
          </d:privilege>
          <d:privilege>
            <d:read/>
          </d:privilege>
          <d:privilege>
            <d:read-acl/>
          </d:privilege>
          <d:privilege>
            <d:write/>
          </d:privilege>
          <d:privilege>
            <d:write-content/>
          </d:privilege>
          <d:privilege>
            <d:read-current-user-privilege-set/>
          </d:privilege>
        </d:current-user-privilege-set>
        <d:owner>
          <d:href>/.well-known/caldav/DEVELOPMENT/principals/Robert%20Glaser/</d:href>
        </d:owner>
      </d:prop>
      <d:status>HTTP/1.1 200 OK</d:status>
    </d:propstat>
  </d:response>
  <d:response>
    <d:href>/.well-known/caldav/DEVELOPMENT/calendars/Robert%20Glaser/Alle%20Termine/</d:href>
    <d:propstat>
      <d:prop>
        <d:resourcetype>
          <d:collection/>
          <cal:calendar/>
        </d:resourcetype>
        <cs:getctag>669801837942</cs:getctag>
        <d:displayname>Alle Termine</d:displayname>
        <d:supported-report-set>
          <d:supported-report>
            <d:report>
              <cal:calendar-multiget/>
            </d:report>
          </d:supported-report>
          <d:supported-report>
            <d:report>
              <cal:calendar-query/>
            </d:report>
          </d:supported-report>
        </d:supported-report-set>
        <d:current-user-privilege-set>
          <d:privilege>
            <d:all/>
          </d:privilege>
          <d:privilege>
            <d:read/>
          </d:privilege>
          <d:privilege>
            <d:read-acl/>
          </d:privilege>
          <d:privilege>
            <d:write/>
          </d:privilege>
          <d:privilege>
            <d:write-content/>
          </d:privilege>
          <d:privilege>
            <d:read-current-user-privilege-set/>
          </d:privilege>
        </d:current-user-privilege-set>
        <cal:supported-calendar-component-set>
          <cal:comp name="VEVENT"/>
          <cal:comp name="VTIMEZONE"/>
        </cal:supported-calendar-component-set>
        <d:owner>
          <d:href>/.well-known/caldav/DEVELOPMENT/principals/Robert%20Glaser/</d:href>
        </d:owner>
      </d:prop>
      <d:status>HTTP/1.1 200 OK</d:status>
    </d:propstat>
  </d:response>
</d:multistatus>

Proppatch (not implemented

Request

PROPPATCH http://host:9998/.well-known/caldav/DEVELOPMENT/calendars/Robert%20Glaser/Alle%20Termine/ HTTP/1.1
Host: host:9998
Authorization: Basic bW5iam5ia2tqaHZmOm1oZ2o=
Accept-Encoding: gzip, deflate
Content-Type: text/xml
Accept-Language: de-de
Content-Length: 198
Accept: */*
Connection: keep-alive
User-Agent: iOS/8.3 (12F69) dataaccessd/1.0

<?xml version="1.0" encoding="UTF-8"?>
<A:propertyupdate xmlns:A="DAV:"><A:set><A:prop><F:calendar-order xmlns:F="http://apple.com/ns/ical/">0</F:calendar-order></A:prop></A:set></A:propertyupdate>

Response

HTTP/1.1 501 Not Implemented
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=utf-8
Content-Language: en
Content-Length: 1029
Date: Tue, 15 Dec 2015 08:25:49 GMT
Connection: close

<!DOCTYPE html><html><head><title>Apache Tomcat/8.0.24 - Error report</title><style type="text/css">H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}A.name {color : black;}.line {height: 1px; background-color: #525D76; border: none;}</style> </head><body><h1>HTTP Status 501 - </h1><div class="line"></div><p><b>type</b> Status report</p><p><b>message</b> <u></u></p><p><b>description</b> <u>The server does not support the functionality needed to fulfill this request.</u></p><hr class="line"><h3>Apache Tomcat/8.0.24</h3></body></html>

Propfind

Request

PROPFIND http://host:9998/.well-known/caldav/DEVELOPMENT/principals/Robert%20Glaser/ HTTP/1.1
Host: host:9998
User-Agent: iOS/8.3 (12F69) dataaccessd/1.0
Accept-Language: de-de
Accept-Encoding: gzip, deflate
Accept: */*
Content-Type: text/xml
Prefer: return=minimal
Depth: 0
Connection: keep-alive
Authorization: Basic bW5iam5ia2tqaHZmOm1oZ2o=
Content-Length: 267
Brief: t

<?xml version="1.0" encoding="UTF-8"?>
<A:propfind xmlns:A="DAV:">
  <A:prop>
    <B:calendar-user-address-set xmlns:B="urn:ietf:params:xml:ns:caldav"/>
    <A:displayname/>
    <C:email-address-set xmlns:C="http://calendarserver.org/ns/"/>
  </A:prop>
</A:propfind>

Response

HTTP/1.1 207 Multi-Status
Server: Apache-Coyote/1.1
Allow: OPTIONS, GET, HEAD, DELETE, PROPFIND, PUT, REPORT
DAV: 1, 3, extended-mkcol, addressbook, access-control, calendar-access
MS-Author-Via: DAV
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Connection: Keep-Alive
Keep-Alive: timeout=5, max=100
Accept-Ranges: bytes
Content-Type: text/xml
Content-Length: 500
Date: Tue, 15 Dec 2015 08:25:49 GMT

<?xml version="1.0" encoding="UTF-8"?>
<d:multistatus xmlns:d="DAV:" xmlns:cal="urn:ietf:params:xml:ns:caldav" xmlns:card="urn:ietf:params:xml:ns:carddav" xmlns:cs="http://calendarserver.org/ns/">
  <d:response>
    <d:href>/.well-known/caldav/DEVELOPMENT/principals/Robert%20Glaser/</d:href>
    <d:propstat>
      <d:prop>
        <d:displayname>Robert Glaser</d:displayname>
      </d:prop>
      <d:status>HTTP/1.1 200 OK</d:status>
    </d:propstat>
  </d:response>
</d:multistatus>

MKCALENDAR (not implemented)

Request

MKCALENDAR http://host:9998/.well-known/caldav/DEVELOPMENT/calendars/Robert%20Glaser/B39676BE-F124-475E-9ED2-B8756951DF29/ HTTP/1.1
Host: host:9998
Authorization: Basic bW5iam5ia2tqaHZmOm1oZ2o=
Accept-Encoding: gzip, deflate
Content-Type: text/xml
Accept-Language: de-de
Content-Length: 1046
Accept: */*
Connection: keep-alive
User-Agent: iOS/8.3 (12F69) dataaccessd/1.0

<?xml version="1.0" encoding="UTF-8"?>
<B:mkcalendar xmlns:B="urn:ietf:params:xml:ns:caldav">
  <A:set xmlns:A="DAV:">
    <A:prop>
      <F:calendar-order xmlns:F="http://apple.com/ns/ical/">0</F:calendar-order>
      <B:calendar-timezone>BEGIN:VCALENDAR&#13;
VERSION:2.0&#13;
CALSCALE:GREGORIAN&#13;
BEGIN:VTIMEZONE&#13;
TZID:Europe/Berlin&#13;
BEGIN:DAYLIGHT&#13;
TZOFFSETFROM:+0100&#13;
TZNAME:MESZ&#13;
TZOFFSETTO:+0200&#13;
RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU&#13;
DTSTART:19810329T020000&#13;
END:DAYLIGHT&#13;
BEGIN:STANDARD&#13;
TZOFFSETFROM:+0200&#13;
TZNAME:MEZ&#13;
TZOFFSETTO:+0100&#13;
RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU&#13;
DTSTART:19961027T030000&#13;
END:STANDARD&#13;
END:VTIMEZONE&#13;
END:VCALENDAR&#13;
</B:calendar-timezone>
      <A:displayname>Erinnerungen</A:displayname>
      <B:calendar-free-busy-set>
        <NO/>
      </B:calendar-free-busy-set>
      <B:supported-calendar-component-set>
        <B:comp name="VTODO"/>
      </B:supported-calendar-component-set>
    </A:prop>
  </A:set>
</B:mkcalendar>

Response

HTTP/1.1 501 Not Implemented
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=utf-8
Content-Language: en
Content-Length: 1029
Date: Tue, 15 Dec 2015 08:25:49 GMT
Connection: close

<!DOCTYPE html><html><head><title>Apache Tomcat/8.0.24 - Error report</title><style type="text/css">H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}A.name {color : black;}.line {height: 1px; background-color: #525D76; border: none;}</style> </head><body><h1>HTTP Status 501 - </h1><div class="line"></div><p><b>type</b> Status report</p><p><b>message</b> <u></u></p><p><b>description</b> <u>The server does not support the functionality needed to fulfill this request.</u></p><hr class="line"><h3>Apache Tomcat/8.0.24</h3></body></html>

Propfind (on the calendar, i don't answer the sync token here)

PROPFIND http://host:9998/.well-known/caldav/DEVELOPMENT/calendars/Robert%20Glaser/Alle%20Termine/ HTTP/1.1
Host: host:9998
User-Agent: iOS/8.3 (12F69) dataaccessd/1.0
Accept-Language: de-de
Accept-Encoding: gzip, deflate
Accept: */*
Content-Type: text/xml
Prefer: return=minimal
Depth: 0
Connection: keep-alive
Authorization: Basic bW5iam5ia2tqaHZmOm1oZ2o=
Content-Length: 181
Brief: t

<?xml version="1.0" encoding="UTF-8"?>
<A:propfind xmlns:A="DAV:">
  <A:prop>
    <C:getctag xmlns:C="http://calendarserver.org/ns/"/>
    <A:sync-token/>
  </A:prop>
</A:propfind>

Response

HTTP/1.1 207 Multi-Status
Server: Apache-Coyote/1.1
Allow: OPTIONS, GET, HEAD, DELETE, PROPFIND, PUT, REPORT
DAV: 1, 3, extended-mkcol, addressbook, access-control, calendar-access
MS-Author-Via: DAV
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Connection: Keep-Alive
Keep-Alive: timeout=5, max=100
Accept-Ranges: bytes
Content-Type: text/xml
Content-Length: 507
Date: Tue, 15 Dec 2015 08:25:51 GMT

<?xml version="1.0" encoding="UTF-8"?>
<d:multistatus xmlns:d="DAV:" xmlns:cal="urn:ietf:params:xml:ns:caldav" xmlns:card="urn:ietf:params:xml:ns:carddav" xmlns:cs="http://calendarserver.org/ns/">
  <d:response>
    <d:href>/.well-known/caldav/DEVELOPMENT/calendars/Robert%20Glaser/Alle%20Termine/</d:href>
    <d:propstat>
      <d:prop>
        <cs:getctag>669801837942</cs:getctag>
      </d:prop>
      <d:status>HTTP/1.1 200 OK</d:status>
    </d:propstat>
  </d:response>
</d:multistatus>

Propfind (to find all the appointments)

Request

PROPFIND host:9998/.well-known/caldav/DEVELOPMENT/calendars/Robert%20Glaser/Alle%20Termine/ HTTP/1.1
Host: host:9998
User-Agent: iOS/8.3 (12F69) dataaccessd/1.0
Accept-Language: de-de
Accept-Encoding: gzip, deflate
Accept: */*
Content-Type: text/xml
Prefer: return=minimal
Depth: 1
Connection: keep-alive
Authorization: Basic bW5iam5ia2tqaHZmOm1oZ2o=
Content-Length: 145
Brief: t

<?xml version="1.0" encoding="UTF-8"?>
<A:propfind xmlns:A="DAV:">
  <A:prop>
    <A:getcontenttype/>
    <A:getetag/>
  </A:prop>
</A:propfind>

Response (there are for more appointments in the response, i show only the first here, but they look all the same with different hrefs)

HTTP/1.1 207 Multi-Status
Server: Apache-Coyote/1.1
Allow: OPTIONS, GET, HEAD, DELETE, PROPFIND, PUT, REPORT
DAV: 1, 3, extended-mkcol, addressbook, access-control, calendar-access
MS-Author-Via: DAV
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Connection: Keep-Alive
Keep-Alive: timeout=5, max=100
Accept-Ranges: bytes
Content-Type: text/xml
Transfer-Encoding: chunked
Date: Tue, 15 Dec 2015 08:25:54 GMT

2000
<?xml version="1.0" encoding="UTF-8"?>
<d:multistatus xmlns:d="DAV:" xmlns:cal="urn:ietf:params:xml:ns:caldav" xmlns:card="urn:ietf:params:xml:ns:carddav" xmlns:cs="http://calendarserver.org/ns/">
  <d:response>
    <d:href>/.well-known/caldav/DEVELOPMENT/calendars/Robert%20Glaser/Alle%20Termine/</d:href>
    <d:propstat>
      <d:prop/>
      <d:status>HTTP/1.1 200 OK</d:status>
    </d:propstat>
  </d:response>
  <d:response>
    <d:href>/.well-known/caldav/DEVELOPMENT/calendars/Robert%20Glaser/Alle%20Termine/0075712608923743A35868DB6A589A31.ics</d:href>
    <d:propstat>
      <d:prop>
        <d:getetag>1241532994</d:getetag>
        <d:getcontenttype>text/calendar</d:getcontenttype>
      </d:prop>
      <d:status>HTTP/1.1 200 OK</d:status>
    </d:propstat>
  </d:response>
</d:multistatus>

Report (to download all the appointments, again leaving out the other hrefs)

Request

REPORT http://host:9998/.well-known/caldav/DEVELOPMENT/calendars/Robert%20Glaser/Alle%20Termine/ HTTP/1.1
Host: host:9998
Authorization: Basic bW5iam5ia2tqaHZmOm1oZ2o=
Accept-Encoding: gzip, deflate
Content-Type: text/xml
Accept-Language: de-de
Content-Length: 7677
Accept: */*
Connection: keep-alive
User-Agent: iOS/8.3 (12F69) dataaccessd/1.0

<?xml version="1.0" encoding="UTF-8"?>
<B:calendar-multiget xmlns:B="urn:ietf:params:xml:ns:caldav">
  <A:prop xmlns:A="DAV:">
    <A:getetag/>
    <B:calendar-data/>
    <C:created-by xmlns:C="http://calendarserver.org/ns/"/>
    <C:updated-by xmlns:C="http://calendarserver.org/ns/"/>
    <B:schedule-tag/>
  </A:prop>
  <A:href xmlns:A="DAV:">/.well-known/caldav/DEVELOPMENT/calendars/Robert%20Glaser/Alle%20Termine/50EAF942E0AB35A1B81792F7AAB6027E.ics</A:href>
</B:calendar-multiget>

Response

HTTP/1.1 207 Multi-Status
Server: Apache-Coyote/1.1
Allow: OPTIONS, GET, HEAD, DELETE, PROPFIND, PUT, REPORT
DAV: 1, 3, extended-mkcol, addressbook, access-control, calendar-access
MS-Author-Via: DAV
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Connection: Keep-Alive
Keep-Alive: timeout=5, max=100
Accept-Ranges: bytes
Content-Type: text/xml;charset=utf-8
Date: Tue, 15 Dec 2015 08:25:58 GMT
Content-Length: 58259

<?xml version="1.0" encoding="UTF-8"?>
<d:multistatus xmlns:d="DAV:" xmlns:cal="urn:ietf:params:xml:ns:caldav" xmlns:card="urn:ietf:params:xml:ns:carddav" xmlns:cs="http://calendarserver.org/ns/">
  <d:response>
    <d:href>/.well-known/caldav/DEVELOPMENT/calendars/Robert%20Glaser/Alle%20Termine/50EAF942E0AB35A1B81792F7AAB6027E.ics</d:href>
    <d:propstat>
      <d:prop>
        <d:getetag>1447948122</d:getetag>
        <cal:calendar-data>BEGIN:VCALENDAR&#13;
CALSCALE:GREGORIAN&#13;
VERSION:2.0&#13;
PRODID:-//DE/RND/DAV/CALDAV &#13;
BEGIN:VEVENT&#13;
DTSTAMP:20151215T082555Z&#13;
CLASS:PUBLIC&#13;
DESCRIPTION:&#13;
DTSTART:20151120T070000Z&#13;
DTEND:20151120T073000Z&#13;
SUMMARY:NeuerMehrTeilnehmerTermin&#13;
TRANSP:OPAQUE&#13;
ATTENDEE;CN=Robert Glaser;PARTSTAT=ACCEPTED:mailto:[email protected]&#13;
RESOURCES:Audi A6&#13;
UID:50EAF942E0AB35A1B81792F7AAB6027E&#13;
CREATED:20151119T154839Z&#13;
LAST-MODIFIED:20151119T154839Z&#13;
END:VEVENT&#13;
END:VCALENDAR&#13;
</cal:calendar-data>
      </d:prop>
      <d:status>HTTP/1.1 200 OK</d:status>
    </d:propstat>
  </d:response>
</d:multistatus>

After this, there are 4 more REPORT requests to get all the appointments. Afterwards, there is a propfind request in the root directory of the host which i can't post because of the 30.000 characters limit. I can't answer this request since it doesn't reach my servlet.

Thanks for any help.


Solution

  • Here's my notes:

    1. The entire caldav server being under .well-known is weird. The .well-known path is meant to just redirect to the real location. It shouldn't break, but it's possible.
    2. In general it's a good thing to avoid percent-encoding in urls, such as your principal path. Again, it shouldn't be an issue, but I have seen clients trip up.
    3. Your etags need to be surrounded by double quotes (also in the d:etag elements).

    But I think the real culprit is that you don't support either the sync-token or the ctag. Client's should work fine without them, but the reality that I've seen is that some don't. I feel that this is the most likely problem, because the issue you describe has to do with syncing after the initial sync. Virtually any client will use the ctag (and many now use the sync-token) to figure out if anything changed in a collection.