]> code.citadel.org Git - citadel.git/blobdiff - webcit/webcit.c
* Moved to the new string tokenizer API
[citadel.git] / webcit / webcit.c
index 90777a928bff14375d6b814441bfd6afe2bce071..b615dbc5a81bf43d1575fde006f3c8583fbbb854 100644 (file)
@@ -364,13 +364,23 @@ void output_headers(      int do_httpheaders,     /* 1 = output HTTP headers
 
        if (do_httpheaders) {
                wprintf("Content-type: text/html\r\n"
-                       "Server: %s / %s\n", SERVER, serv_info.serv_software
+                       "Server: %s / %s\n"
+                       "Connection: close\r\n",
+                       SERVER, serv_info.serv_software
+               );
+       }
+
+       if (cache) {
+               wprintf("Pragma: public\r\n"
+                       "Cache-Control: max-age=3600, must-revalidate\r\n"
+                       "Last-modified: %s\r\n",
+                       httpnow
+               );
+       }
+       else {
+               wprintf("Pragma: no-cache\r\n"
+                       "Cache-Control: no-store\r\n"
                );
-               if (!cache)
-                       wprintf("Connection: close\r\n"
-                               "Pragma: no-cache\r\n"
-                               "Cache-Control: no-store\r\n"
-                       );
        }
 
        stuff_to_cookie(cookie, WC->wc_session, WC->wc_username,
@@ -425,10 +435,12 @@ void output_headers(      int do_httpheaders,     /* 1 = output HTTP headers
                wprintf("<div id=\"content\">\n");
 
                if (strlen(WC->ImportantMessage) > 0) {
+                       wprintf("<div id=\"fix_scrollbar_bug\">\n");
                        do_template("beginbox_nt");
                        wprintf("<SPAN CLASS=\"errormsg\">"
                                "%s</SPAN><br />\n", WC->ImportantMessage);
                        do_template("endbox");
+                       wprintf("</div>\n");
                        strcpy(WC->ImportantMessage, "");
                }
 
@@ -469,20 +481,44 @@ void check_for_instant_messages()
  */
 void http_transmit_thing(char *thing, size_t length, char *content_type,
                         int is_static) {
-       if (is_static) {
-               output_headers(0, 0, 0, 0, 0, 0, 1);
-       }
-       else {
-               output_headers(0, 0, 0, 0, 0, 0, 0);
-       }
+
+       output_headers(0, 0, 0, 0, 0, 0, is_static);
+
        wprintf("Content-type: %s\r\n"
-               "Content-length: %ld\r\n"
                "Server: %s\r\n"
-               "Connection: close\r\n"
-               "\r\n",
+               "Connection: close\r\n",
                content_type,
-               (long) length,
-               SERVER
+               SERVER);
+
+#ifdef HAVE_ZLIB
+       /* If we can send the data out compressed, please do so. */
+       if (WC->gzip_ok) {
+               char *compressed_data = NULL;
+               uLongf compressed_len;
+
+               compressed_len = (uLongf) ((length * 101) / 100) + 100;
+               compressed_data = malloc(compressed_len);
+
+               if (compress_gzip((Bytef *) compressed_data,
+                                 &compressed_len,
+                                 (Bytef *) thing,
+                                 (uLongf) length, Z_BEST_SPEED) == Z_OK) {
+                       wprintf("Content-encoding: gzip\r\n"
+                               "Content-length: %ld\r\n"
+                               "\r\n",
+                               (long) compressed_len
+                       );
+                       client_write(compressed_data, (size_t)compressed_len);
+                       free(compressed_data);
+                       return;
+               }
+       }
+#endif
+
+       /* No compression ... just send it out as-is */
+       wprintf("Content-length: %ld\r\n"
+               "\r\n",
+               (long) length
        );
        client_write(thing, (size_t)length);
 }
@@ -617,7 +653,7 @@ void output_mimepart()
        if (buf[0] == '2') {
                bytes = extract_long(&buf[4], 0);
                content = malloc(bytes + 2);
-               extract(content_type, &buf[4], 3);
+               extract_token(content_type, &buf[4], 3, '|', sizeof content_type);
                output_headers(0, 0, 0, 0, 0, 0, 0);
                read_server_binary(content, bytes);
                serv_puts("CLOS");
@@ -648,7 +684,7 @@ char *load_mimepart(long msgnum, char *partnum)
        serv_gets(buf);
        if (buf[0] == '2') {
                bytes = extract_long(&buf[4], 0);
-               extract(content_type, &buf[4], 3);
+               extract_token(content_type, &buf[4], 3, '|', sizeof content_type);
 
                content = malloc(bytes + 2);
                read_server_binary(content, bytes);
@@ -868,7 +904,7 @@ void session_loop(struct httprequest *req)
 
        strcpy(cmd, hptr->line);
        hptr = hptr->next;
-       extract_token(method, cmd, 0, ' ');
+       extract_token(method, cmd, 0, ' ', sizeof method);
        extract_action(action, cmd);
 
        while (hptr != NULL) {
@@ -878,12 +914,14 @@ void session_loop(struct httprequest *req)
                if (!strncasecmp(buf, "Cookie: webcit=", 15)) {
                        safestrncpy(cookie, &buf[15], sizeof cookie);
                        cookie_to_stuff(cookie, NULL,
-                                     c_username, c_password, c_roomname);
+                                       c_username, sizeof c_username,
+                                       c_password, sizeof c_password,
+                                       c_roomname, sizeof c_roomname);
                }
                else if (!strncasecmp(buf, "Authorization: Basic ", 21)) {
                        CtdlDecodeBase64(c_httpauth_string, &buf[21], strlen(&buf[21]));
-                       extract_token(c_httpauth_user, c_httpauth_string, 0, ':');
-                       extract_token(c_httpauth_pass, c_httpauth_string, 1, ':');
+                       extract_token(c_httpauth_user, c_httpauth_string, 0, ':', sizeof c_httpauth_user);
+                       extract_token(c_httpauth_pass, c_httpauth_string, 1, ':', sizeof c_httpauth_pass);
                }
                else if (!strncasecmp(buf, "Content-length: ", 16)) {
                        ContentLength = atoi(&buf[16]);
@@ -1195,8 +1233,6 @@ void session_loop(struct httprequest *req)
                save_edit("Your bio", "EBIO", 0);
        } else if (!strcasecmp(action, "confirm_move_msg")) {
                confirm_move_msg();
-       } else if (!strcasecmp(action, "confirm_delete_room")) {
-               confirm_delete_room();
        } else if (!strcasecmp(action, "delete_room")) {
                delete_room();
        } else if (!strcasecmp(action, "validate")) {
@@ -1320,6 +1356,8 @@ void session_loop(struct httprequest *req)
                display_inetconf();
        } else if (!strcasecmp(action, "save_inetconf")) {
                save_inetconf();
+       } else if (!strcasecmp(action, "setup_wizard")) {
+               do_setup_wizard();
        } else if (!strcasecmp(action, "diagnostics")) {
                output_headers(1, 1, 1, 0, 0, 0, 0);