Added CCL facility r=r "range" which is similar to r=o "ordered"
[yaz-moved-to-github.git] / src / comstack.c
index db7ea2a..7d8ff00 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (c) 1995-2004, Index Data
  * See the file LICENSE for details.
  *
- * $Id: comstack.c,v 1.6 2004-02-25 12:59:56 adam Exp $
+ * $Id: comstack.c,v 1.11 2004-09-21 14:59:01 adam Exp $
  */
 
 #include <string.h>
@@ -101,8 +101,8 @@ COMSTACK cs_create_host(const char *type_and_host, int blocking, void **vp)
     {
        t = tcpip_type;
         host = type_and_host + 5;
-        if (host[0] == '/' && host[1] == '/')
-            host = host + 2;
+        while (host[0] == '/')
+            host++;
         proto = PROTO_HTTP;
     }
     else if (strncmp(type_and_host, "https:", 6) == 0)
@@ -110,8 +110,8 @@ COMSTACK cs_create_host(const char *type_and_host, int blocking, void **vp)
 #if HAVE_OPENSSL_SSL_H
        t = ssl_type;
         host = type_and_host + 6;
-        if (host[0] == '/' && host[1] == '/')
-            host = host + 2;
+        while (host[0] == '/')
+            host++;
         proto = PROTO_HTTP;
 #else
        return 0;
@@ -121,7 +121,6 @@ COMSTACK cs_create_host(const char *type_and_host, int blocking, void **vp)
     {
        t = tcpip_type;
        host = type_and_host;
-        
     }
     cs = cs_create (t, blocking, proto);
     if (!cs)
@@ -148,12 +147,14 @@ int cs_complete_auto(const unsigned char *buf, int len)
                && buf[2] >= 0x20 && buf[2] < 0x7f)
     {
         /* deal with HTTP request/response */
-       int i = 2, content_len = 0, chunked = 0;
+       int i = 2, content_len = -1, chunked = 0;
 
         while (i <= len-4)
         {
            if (i > 8192)
+           {
                return i;  /* do not allow more than 8K HTTP header */
+           }
             if (buf[i] == '\r' && buf[i+1] == '\n')
             {
                 i += 2;
@@ -237,23 +238,27 @@ int cs_complete_auto(const unsigned char *buf, int len)
                     {   /* not chunked ; inside body */
                         /* i += 2 seems not to work with GCC -O2 .. 
                            so i+2 is used instead .. */
-                        if (len >= (i+2)+ content_len)
+                       if (content_len == -1)
+                           return 0;   /* no content length */
+                        else if (len >= (i+2)+ content_len)
+                       {
                             return (i+2)+ content_len;
+                       }
                     }
                     break;
                 }
                 else if (i < len - 20 && 
-                         !strncasecmp(buf+i, "Transfer-Encoding:", 18))
+                         !strncasecmp((const char *) buf+i, "Transfer-Encoding:", 18))
                 {
                     i+=18;
                     while (buf[i] == ' ')
                         i++;
                     if (i < len - 8)
-                        if (!strncasecmp(buf+i, "chunked", 7))
+                        if (!strncasecmp((const char *) buf+i, "chunked", 7))
                             chunked = 1;
                 }
                 else if (i < len - 17 &&
-                         !strncasecmp(buf+i, "Content-Length:", 15))
+                         !strncasecmp((const char *)buf+i, "Content-Length:", 15))
                 {
                     i+= 15;
                     while (buf[i] == ' ')