]> code.citadel.org Git - citadel.git/blobdiff - webcit/tcp_sockets.c
* fix SSL Reading
[citadel.git] / webcit / tcp_sockets.c
index 18d28514df2506e2b444e27e4d1ddb918314f6f2..9d8ee94c4323c2bf684a0be3c6ba06ab8c465465 100644 (file)
@@ -398,6 +398,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 +420,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 +523,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
 
@@ -595,6 +609,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);
@@ -716,7 +732,7 @@ HttpNewModule_TCPSOCKETS
 (ParsedHttpHdrs *httpreq)
 {
 
-       httpreq->ReadBuf = NewStrBuf();
+       httpreq->ReadBuf = NewStrBufPlain(NULL, SIZ * 4);
 }
 
 void
@@ -725,6 +741,7 @@ HttpDetachModule_TCPSOCKETS
 {
 
        FlushStrBuf(httpreq->ReadBuf);
+       ReAdjustEmptyBuf(httpreq->ReadBuf, 4 * SIZ, SIZ);
 }
 
 void