X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Ftcp_sockets.c;h=841021ee271f010bc64e54ce6e761aaa6a075590;hb=06c5848b09b48a8574380490eb259d4b88600cf8;hp=73f18b204aa8590dd4a99eeb8df1446b36e0629f;hpb=5ad99b4d2bd4d484ff2804ad92d252fda5cf7259;p=citadel.git diff --git a/webcit/tcp_sockets.c b/webcit/tcp_sockets.c index 73f18b204..841021ee2 100644 --- a/webcit/tcp_sockets.c +++ b/webcit/tcp_sockets.c @@ -120,15 +120,16 @@ int tcp_connectsock(char *host, char *service) } alarm(0); signal(SIGALRM, SIG_IGN); - - fdflags = fcntl(s, F_GETFL); - if (fdflags < 0) - lprintf(1, "unable to get socket flags! %s.%s: %s \n", - host, service, strerror(errno)); - fdflags = fdflags | O_NONBLOCK; - if (fcntl(s, F_SETFD, fdflags) < 0) - lprintf(1, "unable to set socket nonblocking flags! %s.%s: %s \n", - host, service, strerror(errno)); + if (!is_https) { + fdflags = fcntl(s, F_GETFL); + if (fdflags < 0) + lprintf(1, "unable to get socket flags! %s.%s: %s \n", + host, service, strerror(errno)); + fdflags = fdflags | O_NONBLOCK; + if (fcntl(s, F_SETFD, fdflags) < 0) + lprintf(1, "unable to set socket nonblocking flags! %s.%s: %s \n", + host, service, strerror(errno)); + } return (s); } @@ -172,7 +173,7 @@ int StrBuf_ServGetln(StrBuf *buf) if (rc < 0) { lprintf(1, "Server connection broken: %s\n", - ErrStr); + (ErrStr)?ErrStr:""); wc_backtrace(); WCC->serv_sock = (-1); WCC->connected = 0; @@ -184,7 +185,7 @@ int StrBuf_ServGetln(StrBuf *buf) int StrBuf_ServGetBLOBBuffered(StrBuf *buf, long BlobSize) { wcsession *WCC = WC; - const char *Err; + const char *ErrStr; int rc; rc = StrBufReadBLOBBuffered(buf, @@ -194,11 +195,11 @@ int StrBuf_ServGetBLOBBuffered(StrBuf *buf, long BlobSize) 1, BlobSize, NNN_TERM, - &Err); + &ErrStr); if (rc < 0) { lprintf(1, "Server connection broken: %s\n", - Err); + (ErrStr)?ErrStr:""); wc_backtrace(); WCC->serv_sock = (-1); WCC->connected = 0; @@ -210,15 +211,15 @@ int StrBuf_ServGetBLOBBuffered(StrBuf *buf, long BlobSize) int StrBuf_ServGetBLOB(StrBuf *buf, long BlobSize) { wcsession *WCC = WC; - const char *Err; + const char *ErrStr; int rc; WCC->ReadPos = NULL; - rc = StrBufReadBLOB(buf, &WCC->serv_sock, 1, BlobSize, &Err); + rc = StrBufReadBLOB(buf, &WCC->serv_sock, 1, BlobSize, &ErrStr); if (rc < 0) { lprintf(1, "Server connection broken: %s\n", - Err); + (ErrStr)?ErrStr:""); wc_backtrace(); WCC->serv_sock = (-1); WCC->connected = 0; @@ -244,8 +245,9 @@ void serv_write(const char *buf, int nbytes) retval = write(WCC->serv_sock, &buf[bytes_written], nbytes - bytes_written); if (retval < 1) { + const char *ErrStr = strerror(errno); lprintf(1, "Server connection broken: %s\n", - strerror(errno)); + (ErrStr)?ErrStr:""); close(WCC->serv_sock); WCC->serv_sock = (-1); WCC->connected = 0; @@ -414,7 +416,7 @@ int ig_tcp_server(char *ip_addr, int port_number, int queue_len) if (port_number == 0) { lprintf(1, "Cannot start: no port number specified.\n"); - exit(WC_EXIT_BIND); + return (-WC_EXIT_BIND); } sin.sin_port = htons((u_short) port_number); @@ -423,7 +425,7 @@ int ig_tcp_server(char *ip_addr, int port_number, int queue_len) s = socket(PF_INET, SOCK_STREAM, (p->p_proto)); if (s < 0) { lprintf(1, "Can't create a socket: %s\n", strerror(errno)); - exit(WC_EXIT_BIND); + return (-WC_EXIT_BIND); } /* Set some socket options that make sense. */ i = 1; @@ -438,11 +440,11 @@ int ig_tcp_server(char *ip_addr, int port_number, int queue_len) if (bind(s, (struct sockaddr *) &sin, sizeof(sin)) < 0) { lprintf(1, "Can't bind: %s\n", strerror(errno)); - exit(WC_EXIT_BIND); + return (-WC_EXIT_BIND); } if (listen(s, queue_len) < 0) { lprintf(1, "Can't listen: %s\n", strerror(errno)); - exit(WC_EXIT_BIND); + return (-WC_EXIT_BIND); } return (s); } @@ -468,7 +470,7 @@ int ig_uds_server(char *sockpath, int queue_len) if ((i != 0) && (errno != ENOENT)) { lprintf(1, "webcit: can't unlink %s: %s\n", sockpath, strerror(errno)); - exit(WC_EXIT_BIND); + return (-WC_EXIT_BIND); } memset(&addr, 0, sizeof(addr)); @@ -479,19 +481,19 @@ int ig_uds_server(char *sockpath, int queue_len) if (s < 0) { lprintf(1, "webcit: Can't create a socket: %s\n", strerror(errno)); - exit(WC_EXIT_BIND); + return (-WC_EXIT_BIND); } if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) { lprintf(1, "webcit: Can't bind: %s\n", strerror(errno)); - exit(WC_EXIT_BIND); + return (-WC_EXIT_BIND); } if (listen(s, actual_queue_len) < 0) { lprintf(1, "webcit: Can't listen: %s\n", strerror(errno)); - exit(WC_EXIT_BIND); + return (-WC_EXIT_BIND); } chmod(sockpath, 0777); @@ -522,6 +524,9 @@ int client_read_to(ParsedHttpHdrs *Hdr, StrBuf *Target, int bytes, int timeout) #ifdef HAVE_OPENSSL if (is_https) { long bufremain; + long baselen; + + baselen = StrLength(Target); if (Hdr->Pos == NULL) Hdr->Pos = ChrPtr(Hdr->ReadBuf); @@ -534,7 +539,7 @@ int client_read_to(ParsedHttpHdrs *Hdr, StrBuf *Target, int bytes, int timeout) if (bytes > bufremain) { - while ((StrLength(Hdr->ReadBuf) + StrLength(Target) < bytes) && + while ((StrLength(Hdr->ReadBuf) + StrLength(Target) < bytes + baselen) && (retval >= 0)) retval = client_read_sslbuffer(Hdr->ReadBuf, timeout); if (retval >= 0) { @@ -602,9 +607,14 @@ long end_burst(void) fd_set wset; int fdflags; - if (!DisableGzip && (WCC->Hdr->HR.gzip_ok) && CompressBuffer(WCC->WBuf)) + if (!DisableGzip && (WCC->Hdr->HR.gzip_ok)) { - hprintf("Content-encoding: gzip\r\n"); + if (CompressBuffer(WCC->WBuf) > 0) + hprintf("Content-encoding: gzip\r\n"); + else { + lprintf(CTDL_ALERT, "Compression failed: %d [%s] sending uncompressed\n", errno, strerror(errno)); + wc_backtrace(); + } } if (WCC->Hdr->HR.prohibit_caching) @@ -630,7 +640,7 @@ long end_burst(void) write(2, ptr, StrLength(WCC->WBuf)); write(2, "\033[30m", 5); #endif - if (WCC->Hdr->http_sock != -1) + if (WCC->Hdr->http_sock == -1) return -1; fdflags = fcntl(WC->Hdr->http_sock, F_GETFL);