2015-05-13 27 views
1

我已经有了一个CalDAV日历,并且想要从中删除所有待办事项,然后删除它们。如何从Perl获取CalDAV日历中的所有待办事项列表?

Cal :: DAV或HTTP :: DAV模块可能是要走的路,但是如何做我想做的事却一点也不清楚,对CalDAV没有多少了解,我希望避免:-)

+0

请求格式请问这是Perl的?否则,您可以使用Cadaver连接到todolist集合,并执行'rm *'... – hnh

+0

那么,如果您可以向我展示在Cadaver中执行的顺序,则可以将Perl包装在其中:-)我快速查看昨晚在尸体上,不记得我为什么放弃它。 – Elbin

+0

Cadaver是一款不适合包装的交互式工具。我不确定你是否只想这样做(以批量方式)或者真正构建成脚本。 @哈维的答案应该做你想做的。 CalDAV待办事项列表仅仅是一个WebDAV集合。您可以通过简单的PROPFIND检索项目URL,并且可以通过常规HTTP DELETE删除它们。 – hnh

回答

0

下面是一个使用原始套接字手动连接和发送请​​求的示例 - 我发现使用类似lwp的库或http只是因为需要重写标头而变得繁琐。

引用从http://sabre.io/dav/building-a-caldav-client/

#!/usr/bin/env perl 
use strict 'vars'; 
use warnings; 
use Socket; 

# initialize host and port 
my $host = 'www.example.com'; 
my $port = 80; 

# contact the server 
open_tcp(F, $host, $port) 
    or die 'Could not connect to server'; 

# Send request data 
while (my $request = <DATA>) { 
    print F $request; 
} 

# Get Response 
while (my $response = <F>) { 
    print "Response:> $response"; 
} 

close(F); 

# TCP Helper 
sub open_tcp 
{ 
    # get parameters 
    my ($FS, $dest, $port) = @_; 

    my $proto = getprotobyname('tcp'); 
    socket($FS, PF_INET, SOCK_STREAM, $proto); 
    my $sin = sockaddr_in($port,inet_aton($dest)); 
    connect($FS,$sin); 

    my $old_fh = select($FS); 
    $| = 1; # don't buffer output 
    select($old_fh); 
} 

__DATA__ 
REPORT /calendars/johndoe/home/ HTTP/1.1 
Depth: 1 
Prefer: return-minimal 
Content-Type: application/xml; charset=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:comp-filter name="VTODO" /> 
     </c:comp-filter> 
    </c:filter> 
</c:calendar-query> 
+1

谢谢 - 这让我有一部分。我所说的服务器使用https,所以我创建了基于HTTP :: Tiny的东西。我从CalDAV服务器获得回应,但不是预期的VTODO项目... – Elbin