* typedef wcsession, so we don't always need to say gcc again its a struct.
[citadel.git] / webcit / webserver.c
index d8bd340055ace45cb0d077c96e35b3561254b2a3..517a9d30799ef93c18f7a26171e52411182a0dce 100644 (file)
@@ -27,6 +27,7 @@ int is_https = 0;             /* Nonzero if I am an HTTPS service */
 int follow_xff = 0;            /* Follow X-Forwarded-For: header */
 int home_specified = 0;                /* did the user specify a homedir? */
 int time_to_die = 0;            /* Nonzero if server is shutting down */
+int DisableGzip = 0;
 extern void *context_loop(int*);
 extern void *housekeeping_loop(void);
 extern pthread_mutex_t SessionListMutex;
@@ -113,10 +114,12 @@ int ig_tcp_server(char *ip_addr, int port_number, int queue_len)
        i = 1;
        setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i));
 
+       #ifndef __APPLE__
        fcntl(s, F_SETFL, O_NONBLOCK); /* maide: this statement is incorrect
                                          there should be a preceding F_GETFL
                                          and a bitwise OR with the previous
                                          fd flags */
+       #endif
        
        if (bind(s, (struct sockaddr *) &sin, sizeof(sin)) < 0) {
                lprintf(1, "Can't bind: %s\n", strerror(errno));
@@ -147,7 +150,7 @@ int ig_uds_server(char *sockpath, int queue_len)
        if (actual_queue_len < 5) actual_queue_len = 5;
 
        i = unlink(sockpath);
-       if (i != 0) if (errno != ENOENT) {
+       if ((i != 0) && (errno != ENOENT)) {
                lprintf(1, "webcit: can't unlink %s: %s\n",
                        sockpath, strerror(errno));
                exit(WC_EXIT_BIND);
@@ -203,11 +206,17 @@ int client_read_to(int *sock, StrBuf *Target, StrBuf *Buf, int bytes, int timeou
 
 #ifdef HAVE_OPENSSL
        if (is_https) {
-               while ((retval >= 0) && (StrLength(Buf) < bytes))
+               while ((StrLength(Buf) + StrLength(Target) < bytes) &&
+                      (retval >= 0))
                        retval = client_read_sslbuffer(Buf, timeout);
                if (retval >= 0) {
                        StrBufAppendBuf(Target, Buf, 0); /// todo: Buf > bytes?
-
+#ifdef HTTP_TRACING
+                       write(2, "\033[32m", 5);
+                       write(2, buf, bytes);
+                       write(2, "\033[30m", 5);
+#endif
+                       return 1;
                }
                else {
                        lprintf(2, "client_read_ssl() failed\n");
@@ -235,7 +244,7 @@ int client_read_to(int *sock, StrBuf *Target, StrBuf *Buf, int bytes, int timeou
        write(2, buf, bytes);
        write(2, "\033[30m", 5);
 #endif
-       return (1);
+       return 1;
 }
 
 
@@ -254,7 +263,7 @@ void begin_burst(void)
  */
 long end_burst(void)
 {
-       struct wcsession *WCC = WC;
+       wcsession *WCC = WC;
         const char *ptr, *eptr;
         long count;
        ssize_t res;
@@ -263,7 +272,7 @@ long end_burst(void)
 
 #ifdef HAVE_ZLIB
        /* Perform gzip compression, if enabled and supported by client */
-       if ((WCC->gzip_ok) && CompressBuffer(WCC->WBuf))
+       if (!DisableGzip && (WCC->gzip_ok) && CompressBuffer(WCC->WBuf))
        {
                hprintf("Content-encoding: gzip\r\n");
        }
@@ -427,6 +436,7 @@ int ClientGetLine(int *sock, StrBuf *Target, StrBuf *CLineBuf)
        int rlen, len, retval = 0;
 
        if (is_https) {
+               int ntries = 0;
                if (StrLength(CLineBuf) > 0) {
                        pchs = ChrPtr(CLineBuf);
                        pch = strchr(pchs, '\n');
@@ -441,11 +451,23 @@ int ClientGetLine(int *sock, StrBuf *Target, StrBuf *CLineBuf)
                        }
                }
 
-               while ((retval >= 0) && 
-                      (pchs = ChrPtr(CLineBuf),
-                       pch = strchr(pchs, '\n'), 
-                       pch == NULL))
-                       retval = client_read_sslbuffer(CLineBuf, SLEEPING);
+               while (retval == 0) { 
+                               pch = NULL;
+                               pchs = ChrPtr(CLineBuf);
+                               if (*pchs != '\0')
+                                       pch = strchr(pchs, '\n');
+                               if (pch == NULL) {
+                                       retval = client_read_sslbuffer(CLineBuf, SLEEPING);
+                                       pchs = ChrPtr(CLineBuf);
+                                       pch = strchr(pchs, '\n');
+                               }
+                               if (retval == 0) {
+                                       sleeeeeeeeeep(1);
+                                       ntries ++;
+                               }
+                               if (ntries > 10)
+                                       return 0;
+               }
                if ((retval > 0) && (pch != NULL)) {
                        rlen = 0;
                        len = pch - pchs;
@@ -637,7 +659,7 @@ const char *nix(void *vptr) {snprintf(foobuf, 32, "%0x", (long) vptr); return fo
 void InitTemplateCache(void);
 extern int LoadTemplates;
 extern void LoadZoneFiles(void);
-
+StrBuf *csslocal = NULL;
 /*
  * Here's where it all begins.
  */
@@ -671,9 +693,22 @@ int main(int argc, char **argv)
        TemplateCache = NewHash(1, NULL);
        GlobalNS = NewHash(1, NULL);
        Iterators = NewHash(1, NULL);
-       Contitionals = NewHash(1, NULL);
+       Conditionals = NewHash(1, NULL);
+       MsgHeaderHandler = NewHash(1, NULL);
+       MimeRenderHandler = NewHash(1, NULL);
+       SortHash = NewHash(1, NULL);
+
        LoadZoneFiles();
+       StrBuf *foo=NewStrBufPlain("", -1);
+       StrBuf *bar = NewStrBufPlain("A", -1);
 
+       StrBufExtract_token(bar, foo, 0, '|');
+       StrBufExtract_token(bar, foo, 1, '|');
+       StrBufExtract_token(bar, foo, 2, '|');
+       StrBufExtract_token(bar, foo, 3, '|');
+       StrBufExtract_token(bar, foo, 4, '|');
+       StrBufExtract_token(bar, foo, 5, '|');
+       StrBufExtract_token(bar, foo, 6, '|');
 
 #ifdef DBG_PRINNT_HOOKS_AT_START
        dbg_PrintHash(HandlerHash, nix, NULL);
@@ -692,9 +727,9 @@ int main(int argc, char **argv)
 
        /* Parse command line */
 #ifdef HAVE_OPENSSL
-       while ((a = getopt(argc, argv, "h:i:p:t:T:x:dD:cfs")) != EOF)
+       while ((a = getopt(argc, argv, "h:i:p:t:T:x:dD:cfsZ")) != EOF)
 #else
-       while ((a = getopt(argc, argv, "h:i:p:t:T:x:dD:cf")) != EOF)
+       while ((a = getopt(argc, argv, "h:i:p:t:T:x:dD:cfZ")) != EOF)
 #endif
                switch (a) {
                case 'h':
@@ -734,6 +769,9 @@ int main(int argc, char **argv)
                case 'T':
                        LoadTemplates = atoi(optarg);
                        break;
+               case 'Z':
+                       DisableGzip = 1;
+                       break;
                case 'x':
                        verbosity = atoi(optarg);
                        break;
@@ -763,7 +801,7 @@ int main(int argc, char **argv)
                                "[-i ip_addr] [-p http_port] "
                                "[-t tracefile] [-c] [-f] "
                                "[-T Templatedebuglevel] "
-                               "[-d] "
+                               "[-d] [-Z] "
 #ifdef HAVE_OPENSSL
                                "[-s] "
 #endif
@@ -849,15 +887,23 @@ int main(int argc, char **argv)
                perror("chdir");
        }
        LoadIconDir(static_icon_dir);
-       InitTemplateCache();
 
        initialise_modules();
        initialize_viewdefs();
        initialize_axdefs();
 
+       InitTemplateCache();
+
+       if (!access("static.local/webcit.css", R_OK)) {
+               csslocal = NewStrBufPlain(HKEY("<link href=\"static.local/webcit.css\" rel=\"stylesheet\" type=\"text/css\">"));
+       }
+
        /* Tell libical to return an error instead of aborting if it sees badly formed iCalendar data. */
        icalerror_errors_are_fatal = 0;
 
+       /* Use our own prefix on tzid's generated from system tzdata */
+       icaltimezone_set_tzid_prefix("/citadel.org/");
+
        /*
         * Set up a place to put thread-specific data.
         * We only need a single pointer per thread - it points to the
@@ -947,7 +993,10 @@ void ShutDownWebcit(void)
        DeleteHash(&TemplateCache);
        DeleteHash(&LocalTemplateCache);
        DeleteHash(&Iterators);
-       DeleteHash(&Contitionals);
+       DeleteHash(&MimeRenderHandler);
+       DeleteHash(&Conditionals);
+       DeleteHash(&MsgHeaderHandler);
+       DeleteHash(&SortHash);
 #ifdef ENABLE_NLS
        ShutdownLocale();
 #endif