ZOOM now allows inspection of X509 peer certificate for verification.
[yaz-moved-to-github.git] / src / comstack.c
index 050fcc1..7ee51fe 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (c) 1995-2004, Index Data
  * See the file LICENSE for details.
  *
- * $Id: comstack.c,v 1.3 2004-01-06 19:12:19 adam Exp $
+ * $Id: comstack.c,v 1.7 2004-04-28 22:44:59 adam Exp $
  */
 
 #include <string.h>
 #include <yaz/unix.h>
 #include <yaz/odr.h>
 
+#ifdef WIN32
+#define strncasecmp _strnicmp
+#endif
+
 static const char *cs_errlist[] =
 {
     "No error or unspecified error",
@@ -70,6 +74,13 @@ COMSTACK cs_create_host(const char *type_and_host, int blocking, void **vp)
     COMSTACK cs;
     CS_TYPE t;
 
+    printf (
+#if HAVE_OPENSSL_SSL_H
+           "cs_create_host SSL\n"
+#else
+           "cs_create_host\n"
+#endif
+       );
     if (strncmp (type_and_host, "tcp:", 4) == 0)
     {
        t = tcpip_type;
@@ -136,6 +147,7 @@ int cs_look (COMSTACK cs)
     return cs->event;
 }
 
+#define CHUNK_DEBUG 0
 int cs_complete_auto(const unsigned char *buf, int len)
 {
     if (len > 5 && buf[0] >= 0x20 && buf[0] < 0x7f
@@ -156,23 +168,26 @@ int cs_complete_auto(const unsigned char *buf, int len)
                 {
                     if (chunked)
                     { 
+                       /* inside chunked body .. */
                         while(1)
                         {
-                            int chunk_len = 0;
+                            int j, chunk_len = 0;
                             i += 2;
-#if 0
+#if CHUNK_DEBUG
 /* debugging */
                             if (i <len-2)
                             {
-                                printf ("\n>>>");
+                                printf ("\n<<<");
+                               int j;
                                 for (j = i; j <= i+4; j++)
                                     printf ("%c", buf[j]);
-                                printf ("<<<\n");
+                                printf (">>>\n");
                             }
 #endif
+                           /* read chunk length */
                             while (1)
                                 if (i >= len-2) {
-#if 0
+#if CHUNK_DEBUG
 /* debugging */                                    
                                     printf ("XXXXXXXX not there yet 1\n");
                                     printf ("i=%d len=%d\n", i, len);
@@ -189,29 +204,41 @@ int cs_complete_auto(const unsigned char *buf, int len)
                                         (buf[i++] - ('a'-10));
                                 else
                                     break;
-                            if (buf[i] != '\r' || buf[i+1] != '\n' ||
-                                chunk_len < 0)
-                                return i+2;    /* bad. stop now */
+                           /* 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
+                           printf ("XXXXXX chunk_len=%d\n", chunk_len);
+#endif                     
+                           if (chunk_len < 0)
+                               return i+2;    /* bad chunk_len */
                             if (chunk_len == 0)
-                            {
-                                /* 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 0
-/* debugging */
-                                printf ("XXXXXXXXX not there yet 2\n");
-                                printf ("i=%d len=%d\n", i, len);
-#endif
-                                return 0;
-                            }
+                               break;
                             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++;
+                       }
+#if CHUNK_DEBUG
+/* debugging */
+                       printf ("XXXXXXXXX not there yet 2\n");
+                       printf ("i=%d len=%d\n", i, len);
+#endif
+                       return 0;
                     }
                     else
                     {   /* not chunked ; inside body */