* fix groupdav handling
[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(void)
16 {
17         wcsession *WCC = WC;
18         StrBuf *dav_roomname;
19         StrBuf *dav_uid;
20         long dav_msgnum = (-1);
21         char datestring[256];
22         time_t now;
23
24         now = time(NULL);
25         http_datestring(datestring, sizeof datestring, now);
26
27         dav_roomname = NewStrBuf();
28         dav_uid = NewStrBuf();
29         StrBufExtract_token(dav_roomname, WCC->Hdr->HR.ReqLine, 0, '/');
30         StrBufExtract_token(dav_uid, WCC->Hdr->HR.ReqLine, 1, '/');
31
32         /*
33          * If the room name is blank, the client is doing a top-level OPTIONS.
34          */
35         if (StrLength(dav_roomname) == 0) {
36                 hprintf("HTTP/1.1 200 OK\r\n");
37                 groupdav_common_headers();
38                 hprintf("Date: %s\r\n", datestring);
39                 hprintf("DAV: 1\r\n");
40                 hprintf("Allow: OPTIONS, PROPFIND\r\n");
41                 hprintf("\r\n");
42                 begin_burst();
43                 end_burst();
44                 FreeStrBuf(&dav_roomname);
45                 FreeStrBuf(&dav_uid);
46                 return;
47         }
48
49         /* Go to the correct room. */
50         if (strcasecmp(ChrPtr(WC->wc_roomname), ChrPtr(dav_roomname))) {
51                 gotoroom(dav_roomname);
52         }
53
54         if (strcasecmp(ChrPtr(WC->wc_roomname), ChrPtr(dav_roomname))) {
55                 hprintf("HTTP/1.1 404 not found\r\n");
56                 groupdav_common_headers();
57                 hprintf("Date: %s\r\n", datestring);
58                 hprintf(
59                         "Content-Type: text/plain\r\n"
60                         "\r\n"
61                         "There is no folder called \"%s\" on this server.\r\n",
62                         ChrPtr(dav_roomname)
63                 );
64                 begin_burst();
65                 end_burst();
66                 FreeStrBuf(&dav_roomname);
67                 FreeStrBuf(&dav_uid);
68                 return;
69         }
70
71         /* If dav_uid is non-empty, client is requesting an OPTIONS on
72          * a specific item in the room.
73          */
74         if (StrLength(dav_uid) != 0) {
75
76                 dav_msgnum = locate_message_by_uid(ChrPtr(dav_uid));
77                 if (dav_msgnum < 0) {
78                         hprintf("HTTP/1.1 404 not found\r\n");
79                         groupdav_common_headers();
80                         hprintf(
81                                 "Content-Type: text/plain\r\n"
82                                 "\r\n"
83                                 "Object \"%s\" was not found in the \"%s\" folder.\r\n",
84                                 ChrPtr(dav_uid),
85                                 ChrPtr(dav_roomname)
86                         );
87                         FreeStrBuf(&dav_roomname);
88                         FreeStrBuf(&dav_uid);
89                         begin_burst();end_burst();return;
90                 }
91
92                 hprintf("HTTP/1.1 200 OK\r\n");
93                 groupdav_common_headers();
94                 hprintf("Date: %s\r\n", datestring);
95                 hprintf("DAV: 1\r\n");
96                 hprintf("Allow: OPTIONS, PROPFIND, GET, PUT, DELETE\r\n");
97                 hprintf("\r\n");
98                 begin_burst();
99                 end_burst();
100                 FreeStrBuf(&dav_roomname);
101                 FreeStrBuf(&dav_uid);
102                 return;
103         }
104
105         FreeStrBuf(&dav_roomname);
106         FreeStrBuf(&dav_uid);
107
108         /*
109          * We got to this point, which means that the client is requesting
110          * an OPTIONS on the room itself.
111          */
112         hprintf("HTTP/1.1 200 OK\r\n");
113         groupdav_common_headers();
114         hprintf("Date: %s\r\n", datestring);
115         hprintf("DAV: 1\r\n");
116         hprintf("Allow: OPTIONS, PROPFIND, GET, PUT\r\n");
117         hprintf("\r\n");
118         begin_burst();
119         end_burst();
120 }