* Doxygen groups. Sorted the files into groups. so now we have a nice structure
[citadel.git] / webcit / groupdav_options.c
1 /*
2  * $Id$
3  *
4  * Handles DAV OPTIONS requests (experimental -- not required by GroupDAV)
5  * \ingroup WebcitHttpServerGDav
6  *
7  */
8
9 #include "webcit.h"
10 #include "webserver.h"
11 #include "groupdav.h"
12
13 /*
14  * The pathname is always going to be /groupdav/room_name/msg_num
15  */
16 void groupdav_options(char *dav_pathname) {
17         char dav_roomname[256];
18         char dav_uid[256];
19         long dav_msgnum = (-1);
20         char datestring[256];
21         time_t now;
22
23         now = time(NULL);
24         http_datestring(datestring, sizeof datestring, now);
25
26         extract_token(dav_roomname, dav_pathname, 2, '/', sizeof dav_roomname);
27         extract_token(dav_uid, dav_pathname, 3, '/', sizeof dav_uid);
28
29         /*
30          * If the room name is blank, the client is doing a top-level OPTIONS.
31          */
32         if (strlen(dav_roomname) == 0) {
33                 wprintf("HTTP/1.1 200 OK\r\n");
34                 groupdav_common_headers();
35                 wprintf("Date: %s\r\n", datestring);
36                 wprintf("Allow: OPTIONS, PROPFIND\r\n");
37                 wprintf("\r\n");
38                 return;
39         }
40
41         /* Go to the correct room. */
42         if (strcasecmp(WC->wc_roomname, dav_roomname)) {
43                 gotoroom(dav_roomname);
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         /*
87          * We got to this point, which means that the client is requesting
88          * an OPTIONS on the room itself.
89          */
90         wprintf("HTTP/1.1 200 OK\r\n");
91         groupdav_common_headers();
92         wprintf("Date: %s\r\n", datestring);
93         wprintf("Allow: OPTIONS, PROPFIND, GET, PUT\r\n");
94         wprintf("\r\n");
95 }