User Agent String: CardDAV-Sync (Android) (like iOS/5.0.1 (9A405) dataaccessd/1.0) gzip
OpenGrouwpare Coils Client Id: 11e687c2-4cea-4464-a31c-5d9f97f8c6f4
Status: Working, as of 0.1.49pre
Appears to support Service Discovery. But it does not perform a GET and follow the 301 redirect... it performs a PROPFIND. Is that standard?
Coils correctly responds to the well_known PROPFIND with a 301 to /dav/Contacts. This results in a PROPFIND of /dav/Contacts/ asking about the current user principal.
PROPFIND /dav/Contacts/ HTTP/1.0 Connection: close Content-Type: application/xml; charset="utf-8" Depth: 0 Content-Length: 123 User-Agent: CardDAV-Sync (Android) (like iOS/5.0.1 (9A405) dataaccessd/1.0) gzip Authorization: Basic YXdpbGxpYW06OmZyZWQxMg== Accept-Encoding: gzip <?xml version="1.0" encoding="utf-8" ?> <A:propfind xmlns:A="DAV:"> <A:prop><A:current-user-principal/></A:prop> </A:propfind>
Response
<?xml version="1.0" encoding="utf-8"?> <D:multistatus xmlns:G="http://groupdav.org/" xmlns:E="urn:ietf:params:xml:ns:carddav" xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav" xmlns:B="http://icewarp.com/ns/" xmlns:A="http://apache.org/dav/props/"> <D:response><D:href>/dav/Contacts</D:href> <D:propstat> <D:status>HTTP/1.1 200 OK</D:status> <D:prop> <D:current-user-principal><D:href>/dav/Contacts/</D:href></D:current-user-principal> </D:prop> </D:propstat> </D:response> </D:multistatus>
The client then sends a PROPFIND to the URL of the current user principal.
PROPFIND /dav/Contacts/ HTTP/1.0 Connection: close Content-Type: application/xml; charset="utf-8" Depth: 0 Content-Length: 162 User-Agent: CardDAV-Sync (Android) (like iOS/5.0.1 (9A405) dataaccessd/1.0) gzip Authorization: Basic YXdpbGxpYW06OmZyZWQxMg== Accept-Encoding: gzip <?xml version="1.0" encoding="utf-8" ?> <A:propfind xmlns:B="urn:ietf:params:xml:ns:carddav" xmlns:A="DAV:"> <A:prop> <B:addressbook-home-set/> </A:prop> </A:propfind>
Response
HTTP/1.0 207 Multistatus Server: BaseHTTP/0.3 Python/2.7.3 Date: Tue, 27 Nov 2012 23:30:07 GMT Content-Length: 530 Content-Type: text/xml; charset="utf-8" X-Dav-Error: 200 No error Ms-Author-Via: DAV <?xml version="1.0" encoding="utf-8"?> <D:multistatus xmlns:G="http://groupdav.org/" xmlns:E="urn:ietf:params:xml:ns:carddav" xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav" xmlns:B="http://icewarp.com/ns/" xmlns:A="http://apache.org/dav/props/"> <D:response> <D:href>/dav/Contacts/</D:href> <D:propstat> <D:status>HTTP/1.1 200 OK</D:status> <D:prop> <E:addressbook-home-set><D:href>/dav/Contacts</D:href></E:addressbook-home-set> </D:prop> </D:propstat> </D:response> </D:multistatus>
Request
PROPFIND /dav/Contacts/ HTTP/1.0 Host: coils.wmmi.net Connection: close Content-Type: application/xml; charset="utf-8" Depth: 1 Content-Length: 129 User-Agent: CardDAV-Sync (Android) (like iOS/5.0.1 (9A405) dataaccessd/1.0) gzip Authorization: Basic YXdpbGxpYW06ZnJlZDEy Accept-Encoding: gzip <?xml version="1.0" encoding="utf-8" ?> <A:propfind xmlns:A="DAV:"> <A:prop> <A:displayname/> <A:resourcetype/> </A:prop> </A:propfind>
Response
HTTP/1.0 207 Multistatus Server: BaseHTTP/0.3 Python/2.7.3 Date: Tue, 27 Nov 2012 23:30:07 GMT Content-Length: 1109 Content-Type: text/xml; charset="utf-8" X-Dav-Error: 200 No error Ms-Author-Via: DAV <?xml version="1.0" encoding="utf-8"?> <D:multistatus xmlns:G="http://groupdav.org/" xmlns:E="urn:ietf:params:xml:ns:carddav" xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav" xmlns:B="http://icewarp.com/ns/" xmlns:A="http://apache.org/dav/props/"> <D:response> <D:href>/dav/Contacts/</D:href> <D:propstat> <D:status>HTTP/1.1 200 OK</D:status> <D:prop> <D:resourcetype><D:collection/></D:resourcetype> <D:displayname>Contacts</D:displayname> </D:prop> </D:propstat> </D:response> <D:response><D:href>/dav/Contacts/All/</D:href> <D:propstat> <D:status>HTTP/1.1 200 OK</D:status> <D:prop> <D:resourcetype><D:collection/><E:addressbook/></D:resourcetype> <D:displayname>All</D:displayname> </D:prop> </D:propstat> </D:response> <D:response><D:href>/dav/Contacts/Favorites/</D:href> <D:propstat> <D:status>HTTP/1.1 200 OK</D:status> <D:prop> <D:resourcetype><D:collection/><E:addressbook/></D:resourcetype> <D:displayname>Favorites</D:displayname> </D:prop> </D:propstat> </D:response> </D:multistatus>
The client then displays a list of Contact folders from which to create an address book!
Example VCard
BEGIN:VCARD VERSION:3.0 N:Smith;George;;; ADR;TYPE=HOME:;;555 Pandora Dr;Podunk;Gr;99999; EMAIL;TYPE=INTERNET;TYPE=HOME:george@example.net FN:George Smith TEL;TYPE=CELL:1 11.222.3333 PRODID:-//dmfs.org//mimedir.vcard//EN REV:20121128T110559Z UID:4ef1363f-0aac-4bec-ab2f-72498d74af49 END:VCARD
Tickets: #70
Wiki: CardDAV
Wiki: Clients
Wiki: ServiceDiscovery
Wiki: WebDAV