* upsi, wrong way arround.
[citadel.git] / webcit / tcp_sockets.c
index 03180817a941ed98e962e12607f850b1491ff082..15a1c1c6998200697a708adcc23c62fb3e68abfc 100644 (file)
@@ -14,9 +14,7 @@
 extern int DisableGzip;
 
 /*
- *  register the timeout
- *  signum signalhandler number
- * \return signals
+ * register the timeout
  */
 RETSIGTYPE timeout(int signum)
 {
@@ -398,6 +396,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;
 
@@ -419,7 +418,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);
@@ -520,27 +521,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
 
@@ -586,7 +598,7 @@ 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;
 
@@ -595,6 +607,8 @@ long end_burst(void)
                hprintf("Content-encoding: gzip\r\n");
        }
 
+       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);
@@ -616,9 +630,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);
@@ -628,7 +644,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));
@@ -650,7 +667,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);
@@ -660,7 +677,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));
@@ -687,6 +705,8 @@ int lingering_close(int fd)
        struct timeval tv, start;
 
        gettimeofday(&start, NULL);
+       if (fd == -1)
+               return -1;
        shutdown(fd, 1);
        do {
                do {
@@ -711,6 +731,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