]> code.citadel.org Git - citadel.git/blob - webcit/groupdav_options.c
groupdav_propfind.c: continued fleshing out the DAV features
[citadel.git] / webcit / groupdav_options.c
1 /*
2  * $Id$
3  *
4  * Handles DAV OPTIONS requests (experimental -- not required by GroupDAV)
5  *
6  */
7
8 #include "webcit.h"
9 #include "webserver.h"
10 #include "groupdav.h"
11
12 /*
13  * The pathname is always going to be /groupdav/room_name/msg_num
14  */
15 void groupdav_options(char *dav_pathname) {
16         char dav_roomname[256];
17         char dav_uid[256];
18         long dav_msgnum = (-1);
19         char datestring[256];
20         time_t now;
21
22         now = time(NULL);
23         http_datestring(datestring, sizeof datestring, now);
24
25         extract_token(dav_roomname, dav_pathname, 2, '/', sizeof dav_roomname);
26         extract_token(dav_uid, dav_pathname, 3, '/', sizeof dav_uid);
27
28         /*
29          * If the room name is blank, the client is doing a top-level OPTIONS.
30          */
31         if (strlen(dav_roomname) == 0) {
32                 wprintf("HTTP/1.1 200 OK\r\n");
33                 groupdav_common_headers();
34                 wprintf("Date: %s\r\n", datestring);
35                 wprintf("Allow: OPTIONS, PROPFIND\r\n");
36                 wprintf("\r\n");
37                 return;
38         }
39
40         /* Go to the correct room. */
41         if (strcasecmp(WC->wc_roomname, dav_roomname)) {
42                 gotoroom(dav_roomname);
43         }
44
45         if (strcasecmp(WC->wc_roomname, dav_roomname)) {
46                 wprintf("HTTP/1.1 404 not found\r\n");
47                 groupdav_common_headers();
48                 wprintf("Date: %s\r\n", datestring);
49                 wprintf(
50                         "Content-Type: text/plain\r\n"
51                         "\r\n"
52                         "There is no folder called \"%s\" on this server.\r\n",
53                         dav_roomname
54                 );
55                 return;
56         }
57
58         /* If dav_uid is non-empty, client is requesting an OPTIONS on
59          * a specific item in the room.
60          */
61         if (strlen(dav_uid) > 0) {
62
63                 dav_msgnum = locate_message_by_uid(dav_uid);
64                 if (dav_msgnum < 0) {
65                         wprintf("HTTP/1.1 404 not found\r\n");
66                         groupdav_common_headers();
67                         wprintf(
68                                 "Content-Type: text/plain\r\n"
69                                 "\r\n"
70                                 "Object \"%s\" was not found in the \"%s\" folder.\r\n",
71                                 dav_uid,
72                                 dav_roomname
73                         );
74                         return;
75                 }
76
77                 wprintf("HTTP/1.1 200 OK\r\n");
78                 groupdav_common_headers();
79                 wprintf("Date: %s\r\n", datestring);
80                 wprintf("Allow: OPTIONS, PROPFIND, GET, PUT, DELETE\r\n");
81                 wprintf("\r\n");
82                 return;
83         }
84
85         /*
86          * We got to this point, which means that the client is requesting
87          * an OPTIONS on the room itself.
88          */
89         wprintf("HTTP/1.1 200 OK\r\n");
90         groupdav_common_headers();
91         wprintf("Date: %s\r\n", datestring);
92         wprintf("Allow: OPTIONS, PROPFIND, GET, PUT\r\n");
93         wprintf("\r\n");
94 }