Doxyfile file description. Indentation. No change of code.
[yaz-moved-to-github.git] / src / zgdu.c
index 15683d4..d7d76df 100644 (file)
@@ -2,7 +2,12 @@
  * Copyright (c) 2002-2004, Index Data.
  * See the file LICENSE for details.
  *
- * $Id: zgdu.c,v 1.8 2004-02-25 10:37:02 adam Exp $
+ * $Id: zgdu.c,v 1.11 2004-10-15 00:19:01 adam Exp $
+ */
+
+/**
+ * \file zgdu.c
+ * \brief Implements HTTP and Z39.50 encoding and decoding.
  */
 
 #include <ctype.h>
@@ -78,11 +83,12 @@ static int decode_headers_content(ODR o, int off, Z_HTTP_Header **headers,
     {
        int off = 0;
        
-       /* we know buffer will be smaller than o->size - i - 2*/
-       *content_buf = (char*) odr_malloc(o, o->size - i - 2);  
+       /* we know buffer will be smaller than o->size - i*/
+       *content_buf = (char*) odr_malloc(o, o->size - i);  
        
        while (1)
        {
+           /* chunk length .. */
            int chunk_len = 0;
            for (; i  < o->size-2; i++)
                if (isdigit(o->buf[i]))
@@ -96,14 +102,17 @@ static int decode_headers_content(ODR o, int off, Z_HTTP_Header **headers,
                        (o->buf[i] - ('a'-10));
                else
                    break;
-           if (i > o->size - 2)
-               break;
-           if (o->buf[i] != '\r' || o->buf[i+1] != '\n') 
-           {   /* chunk length must be followed by \r\n */
-               o->error = OHTTP;
-               return 0;
+           /* chunk extension ... */
+           while (o->buf[i] != '\r' && o->buf[i+1] != '\n')
+           {
+               if (i >= o->size-2)
+               {
+                   o->error = OHTTP;
+                   return 0;
+               }
+               i++;
            }
-           i += 2;
+           i += 2;  /* skip CRLF */
            if (chunk_len == 0)
                break;
            if (chunk_len < 0 || off + chunk_len > o->size)
@@ -111,8 +120,9 @@ static int decode_headers_content(ODR o, int off, Z_HTTP_Header **headers,
                o->error = OHTTP;
                return 0;
            }
+           /* copy chunk .. */
            memcpy (*content_buf + off, o->buf + i, chunk_len);
-           i += chunk_len;
+           i += chunk_len + 2; /* skip chunk+CRLF */
            off += chunk_len;
        }
        if (!off)
@@ -375,9 +385,9 @@ int z_GDU (ODR o, Z_GDU **p, int opt, const char *name)
                           (*p)->u.HTTP_Response->content_len);
             if (o->direction == ODR_PRINT)
             {
-                fprintf(o->print, "-- HTTP response:\n%.*s\n", o->top - top0,
-                        o->buf + top0);
-                fprintf(o->print, "-- \n");
+                odr_printf(o, "-- HTTP response:\n%.*s\n", o->top - top0,
+                          o->buf + top0);
+                odr_printf(o, "-- \n");
             }
             break;
         case Z_GDU_HTTP_Request:
@@ -413,9 +423,9 @@ int z_GDU (ODR o, Z_GDU **p, int opt, const char *name)
                           (*p)->u.HTTP_Request->content_len);
             if (o->direction == ODR_PRINT)
             {
-                fprintf(o->print, "-- HTTP request:\n%.*s\n", o->top - top0,
+                odr_printf(o, "-- HTTP request:\n%.*s\n", o->top - top0,
                         o->buf + top0);
-                fprintf(o->print, "-- \n");
+                odr_printf(o, "-- \n");
             }
             break;
         case Z_GDU_Z3950: