Other spell fix. Bug #653
[yaz-moved-to-github.git] / src / comstack.c
index 71ab081..12b5218 100644 (file)
@@ -1,8 +1,8 @@
 /*
 /*
- * Copyright (C) 1995-2005, Index Data ApS
+ * Copyright (C) 1995-2006, Index Data ApS
  * See the file LICENSE for details.
  *
  * See the file LICENSE for details.
  *
- * $Id: comstack.c,v 1.14 2005-01-15 19:47:11 adam Exp $
+ * $Id: comstack.c,v 1.16 2006-08-24 13:25:45 adam Exp $
  */
 
 /** 
  */
 
 /** 
@@ -14,6 +14,7 @@
 #include <ctype.h>
 #include <errno.h>
 
 #include <ctype.h>
 #include <errno.h>
 
+#include <yaz/log.h>
 #include <yaz/comstack.h>
 #include <yaz/tcpip.h>
 #include <yaz/unix.h>
 #include <yaz/comstack.h>
 #include <yaz/tcpip.h>
 #include <yaz/unix.h>
@@ -31,7 +32,8 @@ static const char *cs_errlist[] =
     "No data (operation would block)",
     "New data while half of old buffer is on the line (flow control)",
     "Permission denied",
     "No data (operation would block)",
     "New data while half of old buffer is on the line (flow control)",
     "Permission denied",
-    "SSL error"
+    "SSL error",
+    "Too large incoming buffer"
 };
 
 const char *cs_errmsg(int n)
 };
 
 const char *cs_errmsg(int n)
@@ -39,12 +41,12 @@ const char *cs_errmsg(int n)
     static char buf[250];
 
     if (n < CSNONE || n > CSLASTERROR) {
     static char buf[250];
 
     if (n < CSNONE || n > CSLASTERROR) {
-       sprintf(buf, "unknown comstack error %d", n);
-       return buf;
+        sprintf(buf, "unknown comstack error %d", n);
+        return buf;
     }
     if (n == CSYSERR) {
     }
     if (n == CSYSERR) {
-       sprintf(buf, "%s: %s", cs_errlist[n], strerror(errno));
-       return buf;
+        sprintf(buf, "%s: %s", cs_errlist[n], strerror(errno));
+        return buf;
     }
     return cs_errlist[n];
 }
     }
     return cs_errlist[n];
 }
@@ -81,30 +83,30 @@ COMSTACK cs_create_host(const char *type_and_host, int blocking, void **vp)
 
     if (strncmp (type_and_host, "tcp:", 4) == 0)
     {
 
     if (strncmp (type_and_host, "tcp:", 4) == 0)
     {
-       t = tcpip_type;
+        t = tcpip_type;
         host = type_and_host + 4;
     }
     else if (strncmp (type_and_host, "ssl:", 4) == 0)
     {
 #if HAVE_OPENSSL_SSL_H
         host = type_and_host + 4;
     }
     else if (strncmp (type_and_host, "ssl:", 4) == 0)
     {
 #if HAVE_OPENSSL_SSL_H
-       t = ssl_type;
+        t = ssl_type;
         host = type_and_host + 4;
 #else
         host = type_and_host + 4;
 #else
-       return 0;
+        return 0;
 #endif
     }
     else if (strncmp (type_and_host, "unix:", 5) == 0)
     {
 #ifndef WIN32
 #endif
     }
     else if (strncmp (type_and_host, "unix:", 5) == 0)
     {
 #ifndef WIN32
-       t = unix_type;
+        t = unix_type;
         host = type_and_host + 5;
 #else
         host = type_and_host + 5;
 #else
-       return 0;
+        return 0;
 #endif
     }
     else if (strncmp(type_and_host, "http:", 5) == 0)
     {
 #endif
     }
     else if (strncmp(type_and_host, "http:", 5) == 0)
     {
-       t = tcpip_type;
+        t = tcpip_type;
         host = type_and_host + 5;
         while (host[0] == '/')
             host++;
         host = type_and_host + 5;
         while (host[0] == '/')
             host++;
@@ -113,28 +115,28 @@ COMSTACK cs_create_host(const char *type_and_host, int blocking, void **vp)
     else if (strncmp(type_and_host, "https:", 6) == 0)
     {
 #if HAVE_OPENSSL_SSL_H
     else if (strncmp(type_and_host, "https:", 6) == 0)
     {
 #if HAVE_OPENSSL_SSL_H
-       t = ssl_type;
+        t = ssl_type;
         host = type_and_host + 6;
         while (host[0] == '/')
             host++;
         proto = PROTO_HTTP;
 #else
         host = type_and_host + 6;
         while (host[0] == '/')
             host++;
         proto = PROTO_HTTP;
 #else
-       return 0;
+        return 0;
 #endif
     }
     else
     {
 #endif
     }
     else
     {
-       t = tcpip_type;
-       host = type_and_host;
+        t = tcpip_type;
+        host = type_and_host;
     }
     cs = cs_create (t, blocking, proto);
     if (!cs)
     }
     cs = cs_create (t, blocking, proto);
     if (!cs)
-       return 0;
+        return 0;
 
     if (!(*vp = cs_straddr(cs, host)))
     {
 
     if (!(*vp = cs_straddr(cs, host)))
     {
-       cs_close (cs);
-       return 0;
+        cs_close (cs);
+        return 0;
     }    
     return cs;
 }
     }    
     return cs;
 }
@@ -148,23 +150,23 @@ int cs_look (COMSTACK cs)
 int cs_complete_auto(const unsigned char *buf, int len)
 {
     if (len > 5 && buf[0] >= 0x20 && buf[0] < 0x7f
 int cs_complete_auto(const unsigned char *buf, int len)
 {
     if (len > 5 && buf[0] >= 0x20 && buf[0] < 0x7f
-               && buf[1] >= 0x20 && buf[1] < 0x7f
-               && buf[2] >= 0x20 && buf[2] < 0x7f)
+                && buf[1] >= 0x20 && buf[1] < 0x7f
+                && buf[2] >= 0x20 && buf[2] < 0x7f)
     {
         /* deal with HTTP request/response */
     {
         /* deal with HTTP request/response */
-       int i = 2, content_len = 0, chunked = 0;
-       
-       /* if dealing with HTTP responses - then default
-          content length is unlimited (socket close) */
-       if (!memcmp(buf, "HTTP/", 5))
-           content_len = -1; 
+        int i = 2, content_len = 0, chunked = 0;
+
+        /* if dealing with HTTP responses - then default
+           content length is unlimited (socket close) */
+        if (!memcmp(buf, "HTTP/", 5))
+            content_len = -1; 
 
         while (i <= len-4)
         {
 
         while (i <= len-4)
         {
-           if (i > 8192)
-           {
-               return i;  /* do not allow more than 8K HTTP header */
-           }
+            if (i > 8192)
+            {
+                return i;  /* do not allow more than 8K HTTP header */
+            }
             if (buf[i] == '\r' && buf[i+1] == '\n')
             {
                 i += 2;
             if (buf[i] == '\r' && buf[i+1] == '\n')
             {
                 i += 2;
@@ -172,7 +174,7 @@ int cs_complete_auto(const unsigned char *buf, int len)
                 {
                     if (chunked)
                     { 
                 {
                     if (chunked)
                     { 
-                       /* inside chunked body .. */
+                        /* inside chunked body .. */
                         while(1)
                         {
                             int j, chunk_len = 0;
                         while(1)
                         {
                             int j, chunk_len = 0;
@@ -182,13 +184,13 @@ int cs_complete_auto(const unsigned char *buf, int len)
                             if (i <len-2)
                             {
                                 printf ("\n<<<");
                             if (i <len-2)
                             {
                                 printf ("\n<<<");
-                               int j;
+                                int j;
                                 for (j = i; j <= i+4; j++)
                                     printf ("%c", buf[j]);
                                 printf (">>>\n");
                             }
 #endif
                                 for (j = i; j <= i+4; j++)
                                     printf ("%c", buf[j]);
                                 printf (">>>\n");
                             }
 #endif
-                           /* read chunk length */
+                            /* read chunk length */
                             while (1)
                                 if (i >= len-2) {
 #if CHUNK_DEBUG
                             while (1)
                                 if (i >= len-2) {
 #if CHUNK_DEBUG
@@ -208,52 +210,52 @@ int cs_complete_auto(const unsigned char *buf, int len)
                                         (buf[i++] - ('a'-10));
                                 else
                                     break;
                                         (buf[i++] - ('a'-10));
                                 else
                                     break;
-                           /* move forward until CRLF - skip chunk ext */
-                           j = 0;
-                           while (buf[i] != '\r' && buf[i+1] != '\n')
-                           {
-                               if (i >= len-2)
-                                   return 0;   /* need more buffer .. */
-                               if (++j > 1000)
-                                   return i; /* enough.. stop */
-                               i++;
-                           }
-                           /* got CRLF */
+                            /* move forward until CRLF - skip chunk ext */
+                            j = 0;
+                            while (buf[i] != '\r' && buf[i+1] != '\n')
+                            {
+                                if (i >= len-2)
+                                    return 0;   /* need more buffer .. */
+                                if (++j > 1000)
+                                    return i; /* enough.. stop */
+                                i++;
+                            }
+                            /* got CRLF */
 #if CHUNK_DEBUG
 #if CHUNK_DEBUG
-                           printf ("XXXXXX chunk_len=%d\n", chunk_len);
-#endif                     
-                           if (chunk_len < 0)
-                               return i+2;    /* bad chunk_len */
+                            printf ("XXXXXX chunk_len=%d\n", chunk_len);
+#endif                      
+                            if (chunk_len < 0)
+                                return i+2;    /* bad chunk_len */
                             if (chunk_len == 0)
                             if (chunk_len == 0)
-                               break;
+                                break;
                             i += chunk_len+2;
                         }
                             i += chunk_len+2;
                         }
-                       /* consider trailing headers .. */
-                       while(i <= len-4)
-                       {
-                           if (buf[i] == '\r' &&  buf[i+1] == '\n' &&
-                               buf[i+2] == '\r' && buf[i+3] == '\n')
-                               if (len >= i+4)
-                                   return i+4;
-                           i++;
-                       }
+                        /* consider trailing headers .. */
+                        while(i <= len-4)
+                        {
+                            if (buf[i] == '\r' &&  buf[i+1] == '\n' &&
+                                buf[i+2] == '\r' && buf[i+3] == '\n')
+                                if (len >= i+4)
+                                    return i+4;
+                            i++;
+                        }
 #if CHUNK_DEBUG
 /* debugging */
 #if CHUNK_DEBUG
 /* debugging */
-                       printf ("XXXXXXXXX not there yet 2\n");
-                       printf ("i=%d len=%d\n", i, len);
+                        printf ("XXXXXXXXX not there yet 2\n");
+                        printf ("i=%d len=%d\n", i, len);
 #endif
 #endif
-                       return 0;
+                        return 0;
                     }
                     else
                     {   /* not chunked ; inside body */
                         /* i += 2 seems not to work with GCC -O2 .. 
                            so i+2 is used instead .. */
                     }
                     else
                     {   /* not chunked ; inside body */
                         /* i += 2 seems not to work with GCC -O2 .. 
                            so i+2 is used instead .. */
-                       if (content_len == -1)
-                           return 0;   /* no content length */
+                        if (content_len == -1)
+                            return 0;   /* no content length */
                         else if (len >= (i+2)+ content_len)
                         else if (len >= (i+2)+ content_len)
-                       {
+                        {
                             return (i+2)+ content_len;
                             return (i+2)+ content_len;
-                       }
+                        }
                     }
                     break;
                 }
                     }
                     break;
                 }
@@ -289,3 +291,17 @@ int cs_complete_auto(const unsigned char *buf, int len)
     }
     return completeBER(buf, len);
 }
     }
     return completeBER(buf, len);
 }
+
+void cs_set_max_recv_bytes(COMSTACK cs, int max_recv_bytes)
+{
+    cs->max_recv_bytes = max_recv_bytes;
+}
+
+/*
+ * Local variables:
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ * vim: shiftwidth=4 tabstop=8 expandtab
+ */
+