]> code.citadel.org Git - citadel.git/blobdiff - webcit/context_loop.c
* Finished gzip compression of dynamic pages (when browser supports it)
[citadel.git] / webcit / context_loop.c
index 03ec66e1a00a563360aed972325801304d42c927..3a9a29178d9dc1fdc604139a72d738c889fdeb5e 100644 (file)
@@ -63,6 +63,8 @@ void do_housekeeping(void)
                        /* Remove sessions flagged for kill */
                        if (sptr->killthis) {
 
+                               lprintf(3, "Destroying session\n");
+
                                /* remove session from linked list */
                                if (sptr == SessionList) {
                                        SessionList = SessionList->next;
@@ -82,6 +84,9 @@ BREAKOUT:     pthread_mutex_unlock(&SessionListMutex);
                if (session_to_kill != NULL) {
                        pthread_mutex_lock(&session_to_kill->SessionMutex);
                        close(session_to_kill->serv_sock);
+                       if (session_to_kill->preferences != NULL) {
+                               free(session_to_kill->preferences);
+                       }
                        pthread_mutex_unlock(&session_to_kill->SessionMutex);
                        free(session_to_kill);
                }
@@ -147,6 +152,7 @@ int req_gets(int sock, char *buf, char *hold)
                                return(0);
                        }
        }
+
        return(0);
 }
 
@@ -226,6 +232,10 @@ void context_loop(int sock)
        int desired_session = 0;
        int got_cookie = 0;
        struct wcsession *TheSession, *sptr;
+       char enc[SIZ];
+       char encodings[SIZ];
+       int gzip = 0;
+       int i;
 
        /*
         * Find out what it is that the web browser is asking for
@@ -233,12 +243,25 @@ void context_loop(int sock)
        memset(hold, 0, sizeof(hold));
        do {
                if (req_gets(sock, buf, hold) < 0) return;
+
                if (!strncasecmp(buf, "Cookie: webcit=", 15)) {
                        cookie_to_stuff(&buf[15], &desired_session,
                                NULL, NULL, NULL);
                        got_cookie = 1;
                }
 
+#ifdef WITH_ZLIB
+               if (!strncasecmp(buf, "Accept-encoding: ", 17)) {
+                       extract_token(encodings, &buf[17], 0, ';');
+                       for (i=0; i<num_tokens(encodings, ','); ++i) {
+                               extract_token(enc, encodings, i, ',');
+                               if (!strcasecmp(enc, "gzip")) {
+                                       gzip = 1;
+                               }
+                       }
+               }
+#endif
+
                hptr = (struct httprequest *)
                        malloc(sizeof(struct httprequest));
                if (req == NULL)
@@ -253,7 +276,7 @@ void context_loop(int sock)
        } while (strlen(buf) > 0);
 
        strcpy(buf, req->line);
-       fprintf(stderr, "%s\n", buf);
+       lprintf(5, "HTTP: %s\n", buf);
 
        /* Check for bogus requests */
        if (is_bogus(buf)) goto bail;
@@ -265,6 +288,7 @@ void context_loop(int sock)
         */
        if (!strncasecmp(buf, "GET ", 4)) strcpy(buf, &buf[4]);
        else if (!strncasecmp(buf, "HEAD ", 5)) strcpy(buf, &buf[5]);
+       else if (!strncasecmp(buf, "POST ", 5)) strcpy(buf, &buf[5]);
        if (buf[1]==' ') buf[1]=0;
 
        /*
@@ -277,13 +301,14 @@ void context_loop(int sock)
        }
 
        /* Do the non-root-cookie check now. */
-       else if ( (strcmp(buf, "/")) && (got_cookie == 0)) {
+       else if ( (strcmp(buf, "/"))
+               && (strncasecmp(buf, "/listsub", 8))
+               && (got_cookie == 0)) {
                strcpy(req->line, "GET /static/nocookies.html"
                                "?force_close_session=yes HTTP/1.0");
        }
 
 
-
        /*
         * See if there's an existing session open with the desired ID
         */
@@ -302,7 +327,7 @@ void context_loop(int sock)
         * Create a new session if we have to
         */
        if (TheSession == NULL) {
-               fprintf(stderr, "Creating a new session\n");
+               lprintf(3, "Creating a new session\n");
                TheSession = (struct wcsession *)
                        malloc(sizeof(struct wcsession));
                memset(TheSession, 0, sizeof(struct wcsession));
@@ -315,14 +340,11 @@ void context_loop(int sock)
                pthread_mutex_unlock(&SessionListMutex);
        }
 
-
        /*
-        *
-        * FIX ... check session integrity here before continuing
-        *
+        * A future improvement might be to check the session integrity
+        * at this point before continuing.
         */
 
-
        /*
         * Bind to the session and perform the transaction
         */
@@ -330,7 +352,7 @@ void context_loop(int sock)
        pthread_setspecific(MyConKey, (void *)TheSession);
        TheSession->http_sock = sock;
        TheSession->lastreq = time(NULL);                       /* log */
-       session_loop(req);              /* perform the requested transaction */
+       session_loop(req, gzip);        /* perform the requested transaction */
        pthread_mutex_unlock(&TheSession->SessionMutex);        /* unbind */
 
        /* Free the request buffer */