X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Ftcp_sockets.c;h=23fd9cf371422d8c9696647ebe42c7cb3e7126ae;hb=a4982c55bb1d7f53330cb496b78fed0501201527;hp=058f7c821f1588299c94a73d1e6e6641800a8c8e;hpb=6c114e1487e4b4032be88563f0f5b76922edd601;p=citadel.git diff --git a/webcit/tcp_sockets.c b/webcit/tcp_sockets.c index 058f7c821..23fd9cf37 100644 --- a/webcit/tcp_sockets.c +++ b/webcit/tcp_sockets.c @@ -14,9 +14,7 @@ extern int DisableGzip; /* - * register the timeout - * signum signalhandler number - * \return signals + * register the timeout */ RETSIGTYPE timeout(int signum) { @@ -174,7 +172,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; @@ -186,7 +184,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, @@ -196,11 +194,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; @@ -212,15 +210,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; @@ -236,18 +234,23 @@ int StrBuf_ServGetBLOB(StrBuf *buf, long BlobSize) */ void serv_write(const char *buf, int nbytes) { + wcsession *WCC = WC; int bytes_written = 0; int retval; + + FlushStrBuf(WCC->ReadBuf); + WCC->ReadPos = NULL; while (bytes_written < nbytes) { - retval = write(WC->serv_sock, &buf[bytes_written], + 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)); - close(WC->serv_sock); - WC->serv_sock = (-1); - WC->connected = 0; - WC->logged_in = 0; + (ErrStr)?ErrStr:""); + close(WCC->serv_sock); + WCC->serv_sock = (-1); + WCC->connected = 0; + WCC->logged_in = 0; return; } bytes_written = bytes_written + retval; @@ -394,6 +397,7 @@ int ClientGetLine(ParsedHttpHdrs *Hdr, StrBuf *Target) */ int ig_tcp_server(char *ip_addr, int port_number, int queue_len) { + struct protoent *p; struct sockaddr_in sin; int s, i; @@ -415,7 +419,9 @@ int ig_tcp_server(char *ip_addr, int port_number, int queue_len) } sin.sin_port = htons((u_short) port_number); - s = socket(PF_INET, SOCK_STREAM, (getprotobyname("tcp")->p_proto)); + p = getprotobyname("tcp"); + + 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); @@ -516,27 +522,38 @@ int client_read_to(ParsedHttpHdrs *Hdr, StrBuf *Target, int bytes, int timeout) #ifdef HAVE_OPENSSL if (is_https) { - long bufremain = StrLength(Hdr->ReadBuf) - (Hdr->Pos - ChrPtr(Hdr->ReadBuf)); + long bufremain; + + if (Hdr->Pos == NULL) + Hdr->Pos = ChrPtr(Hdr->ReadBuf); + bufremain = StrLength(Hdr->ReadBuf) - (Hdr->Pos - ChrPtr(Hdr->ReadBuf)); + + if (bytes < bufremain) + bufremain = bytes; StrBufAppendBufPlain(Target, Hdr->Pos, bufremain, 0); - Hdr->Pos = NULL; - FlushStrBuf(Hdr->ReadBuf); - - while ((StrLength(Hdr->ReadBuf) + StrLength(Target) < bytes) && - (retval >= 0)) - retval = client_read_sslbuffer(Hdr->ReadBuf, timeout); - if (retval >= 0) { - StrBufAppendBuf(Target, Hdr->ReadBuf, 0); /* todo: Buf > bytes? */ + StrBufCutLeft(Hdr->ReadBuf, bufremain); + + if (bytes > bufremain) + { + while ((StrLength(Hdr->ReadBuf) + StrLength(Target) < bytes) && + (retval >= 0)) + retval = client_read_sslbuffer(Hdr->ReadBuf, timeout); + if (retval >= 0) { + StrBufAppendBuf(Target, Hdr->ReadBuf, 0); /* todo: Buf > bytes? */ #ifdef HTTP_TRACING - write(2, "\033[32m", 5); - write(2, buf, bytes); - write(2, "\033[30m", 5); + 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"); - return -1; + return 1; + } + else { + lprintf(2, "client_read_ssl() failed\n"); + return -1; + } } + else + return 1; } #endif @@ -582,15 +599,22 @@ long end_burst(void) wcsession *WCC = WC; const char *ptr, *eptr; long count; - ssize_t res; + ssize_t res = 0; 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) + hprintf("Pragma: no-cache\r\nCache-Control: no-store\r\nExpires:-1\r\n"); hprintf("Content-length: %d\r\n\r\n", StrLength(WCC->WBuf)); ptr = ChrPtr(WCC->HBuf); @@ -612,9 +636,11 @@ long end_burst(void) write(2, ptr, StrLength(WCC->WBuf)); write(2, "\033[30m", 5); #endif + if (WCC->Hdr->http_sock == -1) + return -1; fdflags = fcntl(WC->Hdr->http_sock, F_GETFL); - while (ptr < eptr) { + while ((ptr < eptr) && (WCC->Hdr->http_sock != -1)){ if ((fdflags & O_NONBLOCK) == O_NONBLOCK) { FD_ZERO(&wset); FD_SET(WCC->Hdr->http_sock, &wset); @@ -624,7 +650,8 @@ long end_burst(void) } } - if ((res = write(WCC->Hdr->http_sock, + if ((WCC->Hdr->http_sock == -1) || + (res = write(WCC->Hdr->http_sock, ptr, count)) == -1) { lprintf(2, "client_write: Socket write failed (%s)\n", strerror(errno)); @@ -646,7 +673,7 @@ long end_burst(void) write(2, "\033[30m", 5); #endif - while (ptr < eptr) { + while ((ptr < eptr) && (WCC->Hdr->http_sock != -1)) { if ((fdflags & O_NONBLOCK) == O_NONBLOCK) { FD_ZERO(&wset); FD_SET(WCC->Hdr->http_sock, &wset); @@ -656,7 +683,8 @@ long end_burst(void) } } - if ((res = write(WCC->Hdr->http_sock, + if ((WCC->Hdr->http_sock == -1) || + (res = write(WCC->Hdr->http_sock, ptr, count)) == -1) { lprintf(2, "client_write: Socket write failed (%s)\n", strerror(errno)); @@ -683,6 +711,8 @@ int lingering_close(int fd) struct timeval tv, start; gettimeofday(&start, NULL); + if (fd == -1) + return -1; shutdown(fd, 1); do { do { @@ -707,6 +737,31 @@ int lingering_close(int fd) return close(fd); } +void +HttpNewModule_TCPSOCKETS +(ParsedHttpHdrs *httpreq) +{ + + httpreq->ReadBuf = NewStrBufPlain(NULL, SIZ * 4); +} + +void +HttpDetachModule_TCPSOCKETS +(ParsedHttpHdrs *httpreq) +{ + + FlushStrBuf(httpreq->ReadBuf); + ReAdjustEmptyBuf(httpreq->ReadBuf, 4 * SIZ, SIZ); +} + +void +HttpDestroyModule_TCPSOCKETS +(ParsedHttpHdrs *httpreq) +{ + + FreeStrBuf(&httpreq->ReadBuf); +} + void SessionNewModule_TCPSOCKETS