]> code.citadel.org Git - citadel.git/blobdiff - webcit/webserver.c
* remove accidently committed test stuff
[citadel.git] / webcit / webserver.c
index bb140bc65421f8f442b3ef08fa3347ecf6f854dd..4bc12f512b21910bde982cc0dd1813031d559531 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);
@@ -202,9 +205,9 @@ int client_read_to(int *sock, StrBuf *Target, StrBuf *Buf, int bytes, int timeou
        int retval = 0;
 
 #ifdef HAVE_OPENSSL
-       if (is_https) {//// TODO: loop; count till bytes is reached
-               bytes -= StrLength(Target);
-               while ((retval >= 0) && (StrLength(Buf) - StrLength(Target) < bytes))
+       if (is_https) {
+               while ((StrLength(Buf) + StrLength(Target) < bytes) &&
+                      (retval >= 0))
                        retval = client_read_sslbuffer(Buf, timeout);
                if (retval >= 0) {
                        StrBufAppendBuf(Target, Buf, 0); /// todo: Buf > bytes?
@@ -260,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;
@@ -269,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");
        }
@@ -433,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');
@@ -447,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;
@@ -643,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.
  */
@@ -677,9 +693,12 @@ int main(int argc, char **argv)
        TemplateCache = NewHash(1, NULL);
        GlobalNS = NewHash(1, NULL);
        Iterators = NewHash(1, NULL);
-       Contitionals = NewHash(1, NULL);
-       LoadZoneFiles();
+       Conditionals = NewHash(1, NULL);
+       MsgHeaderHandler = NewHash(1, NULL);
+       MimeRenderHandler = NewHash(1, NULL);
+       SortHash = NewHash(1, NULL);
 
+       LoadZoneFiles();
 
 #ifdef DBG_PRINNT_HOOKS_AT_START
        dbg_PrintHash(HandlerHash, nix, NULL);
@@ -698,9 +717,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':
@@ -740,6 +759,9 @@ int main(int argc, char **argv)
                case 'T':
                        LoadTemplates = atoi(optarg);
                        break;
+               case 'Z':
+                       DisableGzip = 1;
+                       break;
                case 'x':
                        verbosity = atoi(optarg);
                        break;
@@ -769,7 +791,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
@@ -855,15 +877,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
@@ -953,7 +983,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