X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fwebserver.c;h=517a9d30799ef93c18f7a26171e52411182a0dce;hb=8c321fbcc2a64f0d0627562fdf5651442e525ab1;hp=d8bd340055ace45cb0d077c96e35b3561254b2a3;hpb=7c6a8c0e7caf1da50e235049d4c4834aef1ca1be;p=citadel.git diff --git a/webcit/webserver.c b/webcit/webserver.c index d8bd34005..517a9d307 100644 --- a/webcit/webserver.c +++ b/webcit/webserver.c @@ -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("")); + } + /* 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