CalDav 동기화 구조

img1

Principal 요청

HTTP PROFIND 방식을 사용하며 Basic Auth로 인증한다.

HTTP 1.1 PROPFIND
url : /
Depth : 0 
Auth : Basic Auth 
Body : 
<?xml version='1.0' encoding='utf-8'?>
<ns0:propfind xmlns:C="urn:ietf:params:xml:ns:caldav" xmlns:D="DAV" xmlns:ns0="DAV:">
    <ns0:prop>
        <ns0:current-user-principal/>
    </ns0:prop>
</ns0:propfind>

HomeSet 요청

HTTP PROFIND 방식을 사용하며 Basic Auth로 인증한다.

HTTP 1.1 PROPFIND
url : /
Depth : 0 
Auth : Basic Auth 
Body : 

<?xml version='1.0' encoding='utf-8'?>
<ns0:propfind xmlns:C="urn:ietf:params:xml:ns:caldav" xmlns:D="DAV" xmlns:ns0="DAV:">
    <ns0:prop>
        <C:calendar-home-set/>
    </ns0:prop>
</ns0:propfind>

Calendar 요청

HTTP PROFIND 방식을 사용하며 Basic Auth로 인증한다.

HTTP 1.1 PROPFIND
url : /
Depth : 1 
Auth : Basic Auth 
Body : 

<?xml version='1.0' encoding='utf-8'?>
<ns0:propfind xmlns:C="urn:ietf:params:xml:ns:caldav" xmlns:D="DAV" xmlns:ns0="DAV:">
    <ns0:prop>
        <ns0:resourcetype/>
    </ns0:prop>
</ns0:propfind>

CTag 요청

HTTP PROFIND 방식을 사용하며 Basic Auth로 인증한다.

HTTP 1.1 PROPFIND
url : /
Depth : 1 
Auth : Basic Auth 
Body : 

<?xml version='1.0' encoding='utf-8'?>
<d:propfind xmlns:d="DAV:" xmlns:cs="http://calendarserver.org/ns/">
    <d:prop>
        <d:displayname />
        <cs:getctag />
    </d:prop>
</d:propfind>

ETag 요청

HTTP PROFIND 방식을 사용하며 Basic Auth로 인증한다.

HTTP 1.1 PROPFIND
url : /
Depth : 1 
Auth : Basic Auth 
Body : 

<?xml version='1.0' encoding='utf-8'?>
<c:calendar-query xmlns:d="DAV:" xmlns:c="urn:ietf:params:xml:ns:caldav">
    <d:prop>
        <d:getetag />
        <c:calendar-data />
    </d:prop>
    <c:filter>
        <c:comp-filter name="VCALENDAR" />
    </c:filter>
</c:calendar-query>

img1

위와 같은 과정을 python으로 구현하여 오픈소스화 하였다.

현재 네이버와 애플 caldav 서버에 대해 연동 테스트를 마쳤고, 좀 더 가공해 라이브러리로 배포할 예정이다.

다음 포스팅에서는 python으로 실제로 caldav를 동기화 하는 방법에 대해 알아보자