closing in on the dav problem ... not quite there yet
[citadel.git] / webcit / context_loop.c
index f9238ab6aee14d3e97669d76932371eacdc9bc42..0ed08dc10090ad9fb3bf79444c33c46c497b8c59 100644 (file)
@@ -39,6 +39,10 @@ extern HashList *HandlerHash;
 int num_threads_existing = 1;          /* Number of worker threads which exist. */
 int num_threads_executing = 1;         /* Number of worker threads currently executing. */
 
+extern void session_loop(void);
+void spawn_another_worker_thread(void);
+
+
 void DestroyHttpHeaderHandler(void *V)
 {
        OneHttpHeader *pHdr;
@@ -174,35 +178,40 @@ wcsession *FindSession(wcsession **wclist, ParsedHttpHdrs *Hdr, pthread_mutex_t
                                continue;
                        if ((!strcasecmp(ChrPtr(Hdr->c_username), ChrPtr(sptr->wc_username))) &&
                            (!strcasecmp(ChrPtr(Hdr->c_password), ChrPtr(sptr->wc_password))) ) {
+                               syslog(LOG_DEBUG, "-- matched a session with the same http-auth");
                                TheSession = sptr;
                        }
                        if (TheSession == NULL)
-                               syslog(1, "found sessionkey [%d], but credentials for [%s|%s] didn't match\n",
-                                       Hdr->HR.SessionKey,ChrPtr(Hdr->c_username), ChrPtr(sptr->wc_username));
+                               syslog(1, "found sessionkey [%d], but credentials for [%s|%s] didn't match",
+                                       Hdr->HR.SessionKey,
+                                       ChrPtr(Hdr->c_username),
+                                       ChrPtr(sptr->wc_username)
+                               );
                        break;
                case AUTH_COOKIE:
                        /* If cookie-session, look for a session with matching session ID */
                        if ( (Hdr->HR.desired_session != 0) && 
-                            (sptr->wc_session == Hdr->HR.desired_session)) {
+                            (sptr->wc_session == Hdr->HR.desired_session))
+                       {
+                               syslog(LOG_DEBUG, "-- matched a session with the same cookie");
                                TheSession = sptr;
                        }
                        break;                       
                case NO_AUTH:
                        /* Any unbound session is a candidate */
-                       if (sptr->wc_session == 0) {
-                               /* FIXME -- look for a session that is not only a candidate, but is
-                                * also NOT CURRENTLY LOCKED.  This will cause the proper size pool
-                                * to be created.
-                                */
+                       if ( (sptr->wc_session == 0) && (sptr->inuse == 0) ) {
+                               syslog(LOG_DEBUG, "-- reusing an unbound session");
                                TheSession = sptr;
                        }
                        break;
                }
        }
        CtdlLogResult(pthread_mutex_unlock(ListMutex));
-       if (TheSession == NULL)
-               syslog(1, "didn't find sessionkey [%d] for user [%s]\n",
-                       Hdr->HR.SessionKey, ChrPtr(Hdr->c_username));
+       if (TheSession == NULL) {
+               syslog(1, "didn't find sessionkey [%d] for user [%s]",
+                       Hdr->HR.SessionKey, ChrPtr(Hdr->c_username)
+               );
+       }
        return TheSession;
 }
 
@@ -586,16 +595,15 @@ void context_loop(ParsedHttpHdrs *Hdr)
        CtdlLogResult(pthread_mutex_lock(&TheSession->SessionMutex));
        pthread_setspecific(MyConKey, (void *)TheSession);
        
+       TheSession->inuse = 1;                                  /* mark the session as bound */
        TheSession->lastreq = time(NULL);                       /* log */
        TheSession->Hdr = Hdr;
 
        session_attach_modules(TheSession);
        session_loop();                         /* do transaction */
 
-
        /* How long did this transaction take? */
        gettimeofday(&tx_finish, NULL);
-       
 
        syslog(9, "HTTP: 200 [%ld.%06ld] %s %s \n",
                ((tx_finish.tv_sec*1000000 + tx_finish.tv_usec) - (tx_start.tv_sec*1000000 + tx_start.tv_usec)) / 1000000,
@@ -613,10 +621,12 @@ void context_loop(ParsedHttpHdrs *Hdr)
         * spider crawls the site without using cookies.
         */
        if ((session_may_be_reused) && (!WC->logged_in)) {
-               WC->wc_session = 0;
+               WC->wc_session = 0;                     /* flag as available for re-use */
+               TheSession->selected_language = 0;      /* clear any non-default language setting */
        }
 
        TheSession->Hdr = NULL;
+       TheSession->inuse = 0;                                  /* mark the session as unbound */
        CtdlLogResult(pthread_mutex_unlock(&TheSession->SessionMutex));
 }