]> code.citadel.org Git - citadel.git/blobdiff - webcit/webcit.c
* do linebuffered reading from server
[citadel.git] / webcit / webcit.c
index 7abf512d6a739da4944fa51af6e2dcde7926fda2..8647deec2b3fc7aefb5a8b24963b41b4b5462ebb 100644 (file)
@@ -108,6 +108,7 @@ void output_headers(        int do_httpheaders,     /* 1 = output HTTP headers
                        int suppress_check,     /* 1 = suppress check for instant messages          */
                        int cache               /* 1 = allow browser to cache this page             */
 ) {
+       wcsession *WCC = WC;
        char cookie[1024];
        char httpnow[128];
 
@@ -115,12 +116,17 @@ void output_headers(      int do_httpheaders,     /* 1 = output HTTP headers
        http_datestring(httpnow, sizeof httpnow, time(NULL));
 
        if (do_httpheaders) {
-               hprintf("Content-type: text/html; charset=utf-8\r\n"
-                       "Server: %s / %s\n"
-                       "Connection: close\r\n",
-                       PACKAGE_STRING, 
-                       ChrPtr(serv_info.serv_software)
-               );
+               if (WCC->serv_info != NULL)
+                       hprintf("Content-type: text/html; charset=utf-8\r\n"
+                               "Server: %s / %s\n"
+                               "Connection: close\r\n",
+                               PACKAGE_STRING, 
+                               ChrPtr(WCC->serv_info->serv_software));
+               else
+                       hprintf("Content-type: text/html; charset=utf-8\r\n"
+                               "Server: %s / [n/a]\n"
+                               "Connection: close\r\n",
+                               PACKAGE_STRING);
        }
 
        if (cache) {
@@ -145,8 +151,8 @@ void output_headers(        int do_httpheaders,     /* 1 = output HTTP headers
        }
 
        stuff_to_cookie(cookie, 1024, 
-                       WC->wc_session, WC->wc_username,
-                       WC->wc_password, WC->wc_roomname);
+                       WCC->wc_session, WCC->wc_username,
+                       WCC->wc_password, WCC->wc_roomname);
 
        if (unset_cookies) {
                hprintf("Set-cookie: webcit=%s; path=/\r\n", unset);
@@ -168,14 +174,15 @@ void output_headers(      int do_httpheaders,     /* 1 = output HTTP headers
                        escputs(WC->ImportantMessage);
                        wprintf("</span><br />\n"
                                "</div>\n"
-                               "<script type=\"text/javascript\">\n"
-                               "        setTimeout('hide_imsg_popup()', 5000); \n"
-                               "</script>\n");
-                       WC->ImportantMessage[0] = 0;
+                       );
+                       StrBufAppendPrintf(WCC->trailing_javascript,
+                               "setTimeout('hide_imsg_popup()', 5000); \n"
+                       );
+                       WCC->ImportantMessage[0] = 0;
                }
 
-               if ( (WC->logged_in) && (!unset_cookies) ) {
-                       DoTemplate(HKEY("iconbar"), NULL, &NoCtx);
+               if ( (WCC->logged_in) && (!unset_cookies) ) {
+                 //DoTemplate(HKEY("iconbar"), NULL, &NoCtx);
                        page_popup();
                }
 
@@ -194,7 +201,7 @@ void output_headers(        int do_httpheaders,     /* 1 = output HTTP headers
 void output_custom_content_header(const char *ctype) {
   hprintf("HTTP/1.1 200 OK\r\n");
   hprintf("Content-type: %s; charset=utf-8\r\n",ctype);
-  hprintf("Server: %s / %s\r\n", PACKAGE_STRING, ChrPtr(serv_info.serv_software));
+  hprintf("Server: %s / %s\r\n", PACKAGE_STRING, ChrPtr(WC->serv_info->serv_software));
   hprintf("Connection: close\r\n");
 }
 
@@ -368,11 +375,12 @@ void blank_page(void) {
  * A template has been requested
  */
 void url_do_template(void) {
+       const StrBuf *MimeType;
        const StrBuf *Tmpl = sbstr("template");
        begin_burst();
-       output_headers(1, 0, 0, 0, 1, 0);
-       DoTemplate(SKEY(Tmpl), NULL, &NoCtx);
-       end_burst();
+       output_headers(0, 0, 0, 0, 1, 0);
+       MimeType = DoTemplate(SKEY(Tmpl), NULL, &NoCtx);
+       http_transmit_thing(ChrPtr(MimeType), 0);
 }
 
 
@@ -393,7 +401,7 @@ void display_success(char *successmessage)
 void authorization_required(const char *message)
 {
        hprintf("HTTP/1.1 401 Authorization Required\r\n");
-       hprintf("WWW-Authenticate: Basic realm=\"%s\"\r\n", ChrPtr(serv_info.serv_humannode));
+       hprintf("WWW-Authenticate: Basic realm=\"%s\"\r\n", ChrPtr(WC->serv_info->serv_humannode));
        hprintf("Content-Type: text/html\r\n");
        wprintf("<h1>");
        wprintf(_("Authorization Required"));
@@ -590,6 +598,7 @@ void session_loop(HashList *HTTPHeaders, StrBuf *ReqLine, StrBuf *request_method
        WCC->upload = NULL;
        WCC->is_mobile = 0;
        WCC->trailing_javascript = NewStrBuf();
+       WCC->nWildfireHeaders = 0;
 
        /** Figure out the action */
        index[0] = action;
@@ -599,7 +608,6 @@ void session_loop(HashList *HTTPHeaders, StrBuf *ReqLine, StrBuf *request_method
                index[a] = arg[a-1];
                sizes[a] = sizeof arg[a-1];
        }
-/*///  index[9] = &foo; todo */
        nBackDots = 0;
        nEmpty = 0;
        for ( a = 0; a < 9; ++a)
@@ -624,12 +632,9 @@ void session_loop(HashList *HTTPHeaders, StrBuf *ReqLine, StrBuf *request_method
        }
        if (GetHash(HTTPHeaders, HKEY("AUTHORIZATION"), &vLine) &&
            (vLine!=NULL)) {
-/* TODO: wrap base64 in strbuf */
-               CtdlDecodeBase64(c_httpauth_string, ChrPtr((StrBuf*)vLine), StrLength((StrBuf*)vLine));
-               FlushStrBuf(Buf);
-               StrBufAppendBufPlain(Buf, c_httpauth_string, -1, 0);
-               StrBufExtract_token(c_httpauth_user, Buf, 0, ':');
-               StrBufExtract_token(c_httpauth_pass, Buf, 1, ':');
+               StrBufDecodeBase64((StrBuf*)vLine);
+               StrBufExtract_token(c_httpauth_user, (StrBuf*)vLine, 0, ':');
+               StrBufExtract_token(c_httpauth_pass, (StrBuf*)vLine, 1, ':');
        }
        if (GetHash(HTTPHeaders, HKEY("CONTENT-LENGTH"), &vLine) &&
            (vLine!=NULL)) {
@@ -783,6 +788,7 @@ void session_loop(HashList *HTTPHeaders, StrBuf *ReqLine, StrBuf *request_method
         * connection now.
         */
        if (!WCC->connected) {
+               WCC->ReadBuf = NewStrBuf();
                if (!strcasecmp(ctdlhost, "uds")) {
                        /* unix domain socket */
                        snprintf(buf, SIZ, "%s/citadel.socket", ctdlport);
@@ -823,17 +829,17 @@ void session_loop(HashList *HTTPHeaders, StrBuf *ReqLine, StrBuf *request_method
                                }
                                locate_host(browser_host, WCC->http_sock);
                        }
-
-                       get_serv_info(browser_host, user_agent);
-                       if (serv_info.serv_rev_level < MINIMUM_CIT_VERSION) {
+                       if (WCC->serv_info == NULL)
+                               WCC->serv_info = get_serv_info(browser_host, user_agent);
+                       if (WCC->serv_info->serv_rev_level < MINIMUM_CIT_VERSION) {
                                begin_burst();
                                wprintf(_("You are connected to a Citadel "
                                        "server running Citadel %d.%02d. \n"
                                        "In order to run this version of WebCit "
                                        "you must also have Citadel %d.%02d or"
                                        " newer.\n\n\n"),
-                                               serv_info.serv_rev_level / 100,
-                                               serv_info.serv_rev_level % 100,
+                                               WCC->serv_info->serv_rev_level / 100,
+                                               WCC->serv_info->serv_rev_level % 100,
                                                MINIMUM_CIT_VERSION / 100,
                                                MINIMUM_CIT_VERSION % 100
                                        );
@@ -843,7 +849,7 @@ void session_loop(HashList *HTTPHeaders, StrBuf *ReqLine, StrBuf *request_method
                        }
                }
        }
-/*///////todo: restore language in this case */
+
        /*
         * Functions which can be performed without logging in
         */
@@ -945,12 +951,7 @@ void session_loop(HashList *HTTPHeaders, StrBuf *ReqLine, StrBuf *request_method
                        serv_printf("PASS %s", ChrPtr(c_password));
                        StrBuf_ServGetln(Buf);
                        if (GetServerStatus(Buf, NULL) == 2) {
-                               StrBuf *Lang;
                                become_logged_in(c_username, c_password, Buf);
-                               if (get_preference("language", &Lang)) {
-                                       set_selected_language(ChrPtr(Lang));
-                                       go_selected_language();         /* set locale */
-                               }
                                get_preference("default_header_charset", &WCC->DefaultCharset);
                        }
                }
@@ -1038,6 +1039,7 @@ SKIP_ALL_THIS_CRAP:
                WCC->upload_length = 0;
        }
        FreeStrBuf(&WCC->trailing_javascript);
+       WCC->http_host = NULL;
 }