iCal calendar push

There’s a common misconception that iCal uses WebDAV to upload calendars to remove servers. This bites me every so often, as I wrote the Dopplr iCal upload code and people tend to assume that if iCal can upload calendars, so should any other local calendar client that uses WebDAV. And they can’t – things break.

iCal actually does the simplest thing that could possibly work, and I love it for this. You give it a upload url, a username, and a password. The calendar you’re uploading has a name. iCal url-encodes the calendar name, and builds a calendar URL that looks like http://upload_url/calendar_name.ics. Then it does an HTTP PUT (authenticated with the username and password) of the contents of the calendar to that URL. Then it gives the url to the user and tells them that their calendar is here.

(As an aside, this means that you can upload more than one calendar into Dopplr, as long as they all have different names.)

That’s it. Exactly one HTTP call, one verb (Well, ok, there’s another verb. When you unpublish something, iCal sends an HTTP DELETE. But you knew that). It’s a subset of WebDAV, which is why iCal can also publish to WebDAV servers. But I was able to implement 60% of the iCal upload feature in Dopplr during the tea break in the middle of the meeting where someone came up with the idea, because adding support for a single extra verb to a single extra path is easy. Implementing WebDAV? Harder to get right.

So much for CALDAV

Even if my main calendar is a synced CALDAV calendar, I can’t put things into it from the iPhone. Creating new calendar entries creates a new calendar on the local machine on the next sync, with the entry in it. To make things worse, this new calendar isn’t synced by default, so the entry disappears from the phone, where I added it. So the feature is useless to me – I like being able to create calendar entries on the phone.