Lendo os dados do calendário da Apple / iCloud usando PHP / CalDAV

Eu estou tentando encontrar rapidamente o tempo livre / ocupado, buscando os eventos de calendário para um calendário do iCloud via CalDAV. Consigo obter os calendários disponíveis e, de acordo com a documentaçãoAqui ou usando oBiblioteca cliente DAViCal Buscar as informações do calendário para um determinado intervalo de datas deve ser tão simples quanto enviar essa solicitação xml REPORT para um URL de calendário (por exemplo,https://caldav.icloud.com/..userid../calendars/work/):

<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:comp-filter name="VEVENT">
            <C:time-range start="20131115T000000Z" end="20131201T000000Z"/>
          </C:comp-filter>
</c:comp-filter>
</c:filter>
</c:calendar-query>

que é essencialmente o que oGetEvents() função faz na biblioteca DAViCal. No entanto, estou apenas obtendo o URL para cada entrada de calendário na resposta, em vez dos próprios dados do calendário:

<?xml version='1.0' encoding='UTF-8'?><multistatus xmlns='DAV:'>
  <response>
<href>/..userid../calendars/work/8D2D90EB-BD23-4137-AD22-70D971C587F2.ics</href>
<propstat>
  <prop>
    <getetag>"C=7734@U=b09ce345-d654-491e-bb4a-55358e7019d9"</getetag>
    <getcontenttype>text/calendar</getcontenttype>
  </prop>
  <status>HTTP/1.1 200 OK</status>
</propstat>
</response>
 <response>
<href>/..userid../calendars/work/AA2385AB-EA58-4625-AF87-6D4FB9405686.ics</href>
<propstat>
  <prop>
    <getetag>"C=7733@U=b09ce345-d654-491e-bb4a-55358e7019d9"</getetag>
    <getcontenttype>text/calendar</getcontenttype>
  </prop>
  <status>HTTP/1.1 200 OK</status>
</propstat>
</response>
...
</multistatus>

É claro que posso fazer uma solicitação GET para cada item de calendário individual, mas obviamente isso é muito lento. Existe um truque para obter os dados do calendário baixados em uma solicitação?

questionAnswers(2)

yourAnswerToTheQuestion