X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fzgdu.c;h=d7d76df9189aa762dd3b2e30090fa1d93d0d82ac;hb=e3eb1582ad4be427e5faf145d6a51fe0e29376f8;hp=7fd3c73f640e1f487cda7653fca62b2333a8a5ff;hpb=0e48274dd7b0ba3fd4d3f91e898f3d28bdf23dfa;p=yaz-moved-to-github.git diff --git a/src/zgdu.c b/src/zgdu.c index 7fd3c73..d7d76df 100644 --- a/src/zgdu.c +++ b/src/zgdu.c @@ -1,15 +1,26 @@ /* - * Copyright (c) 2002-2003, Index Data. + * Copyright (c) 2002-2004, Index Data. * See the file LICENSE for details. * - * $Id: zgdu.c,v 1.6 2004-02-19 23:21:44 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 #include #include #include #include +#ifdef WIN32 +#define strncasecmp _strnicmp +#define strcasecmp _stricmp +#endif + static int decode_headers_content(ODR o, int off, Z_HTTP_Header **headers, char **content_buf, int *content_len) { @@ -72,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])) @@ -90,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) @@ -105,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) @@ -241,6 +257,9 @@ int z_GDU (ODR o, Z_GDU **p, int opt, const char *name) hr = (*p)->u.HTTP_Response = (Z_HTTP_Response *) odr_malloc(o, sizeof(*hr)); + hr->content_buf = 0; + hr->content_len = 0; + po = i = 5; while (i < o->size-2 && o->buf[i] != ' ' && o->buf[i] != '\r') i++; @@ -366,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: @@ -404,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: