dafcc7653857d09f71fbd4c19c4354884239d2b9
[citadel.git] / webcit / groupdav_get.c
1 /*
2  * $Id$
3  *
4  * Handles GroupDAV GET requests.
5  *
6  */
7
8 #include <ctype.h>
9 #include <stdlib.h>
10 #include <unistd.h>
11 #include <stdio.h>
12 #include <fcntl.h>
13 #include <signal.h>
14 #include <sys/types.h>
15 #include <sys/wait.h>
16 #include <sys/socket.h>
17 #include <limits.h>
18 #include <string.h>
19 #include <pwd.h>
20 #include <errno.h>
21 #include <stdarg.h>
22 #include <time.h>
23 #include <pthread.h>
24 #include "webcit.h"
25 #include "webserver.h"
26 #include "groupdav.h"
27
28
29 /*
30  * The pathname is always going to be /groupdav/room_name/euid
31  */
32 void groupdav_get(char *dav_pathname) {
33         char dav_roomname[SIZ];
34         char dav_uid[SIZ];
35         long dav_msgnum = (-1);
36         char buf[SIZ];
37         int n = 0;
38         int in_body = 0;
39         int found_content_type = 0;
40
41         /* First, break off the "/groupdav/" prefix */
42         remove_token(dav_pathname, 0, '/');
43         remove_token(dav_pathname, 0, '/');
44
45         /* Now extract the message euid */
46         n = num_tokens(dav_pathname, '/');
47         extract_token(dav_uid, dav_pathname, n-1, '/');
48         remove_token(dav_pathname, n-1, '/');
49
50         /* What's left is the room name.  Remove trailing slashes. */
51         if (dav_pathname[strlen(dav_pathname)-1] == '/') {
52                 dav_pathname[strlen(dav_pathname)-1] = 0;
53         }
54         strcpy(dav_roomname, dav_pathname);
55
56         /* Go to the correct room. */
57         if (strcasecmp(WC->wc_roomname, dav_roomname)) {
58                 gotoroom(dav_roomname);
59         }
60         if (strcasecmp(WC->wc_roomname, dav_roomname)) {
61                 wprintf("HTTP/1.1 404 not found\r\n");
62                 groupdav_common_headers();
63                 wprintf(
64                         "Content-Type: text/plain\r\n"
65                         "\r\n"
66                         "There is no folder called \"%s\" on this server.\r\n",
67                         dav_roomname
68                 );
69                 return;
70         }
71
72         dav_msgnum = locate_message_by_uid(dav_uid);
73         serv_printf("MSG2 %ld", dav_msgnum);
74         serv_gets(buf);
75         if (buf[0] != '1') {
76                 wprintf("HTTP/1.1 404 not found\r\n");
77                 groupdav_common_headers();
78                 wprintf(
79                         "Content-Type: text/plain\r\n"
80                         "\r\n"
81                         "Object \"%s\" was not found in the \"%s\" folder.\r\n",
82                         dav_uid,
83                         dav_roomname
84                 );
85                 return;
86         }
87
88         wprintf("HTTP/1.1 200 OK\r\n");
89         groupdav_common_headers();
90         wprintf("ETag: \"%ld\"\r\n", dav_msgnum);
91         while (serv_gets(buf), strcmp(buf, "000")) {
92                 if (!strncasecmp(buf, "Date: ", 6)) {
93                         wprintf("%s\r\n", buf);
94                 }
95                 if (!strncasecmp(buf, "Content-type: ", 14)) {
96                         wprintf("%s\r\n", buf);
97                         found_content_type = 1;
98                 }
99                 if ((strlen(buf) == 0) && (in_body == 0)) {
100                         if (!found_content_type) {
101                                 wprintf("Content-type: text/plain\r\n");
102                         }
103                         in_body = 1;
104                 }
105                 if (in_body) {
106                         wprintf("%s\r\n", buf);
107                 }
108         }
109 }