X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fcomstack.c;h=96b841ca38dbd0d38e368ac7932f87350954a4ab;hb=aa8b9d245d1ff378c907669a350a4e484b35eac5;hp=4d842f7ae29373519dacbdcc78b7f4d536fba8c4;hpb=c6e47cbbff56f39f6d81b079ebaeac41d793d4d9;p=yaz-moved-to-github.git diff --git a/src/comstack.c b/src/comstack.c index 4d842f7..96b841c 100644 --- a/src/comstack.c +++ b/src/comstack.c @@ -1,18 +1,23 @@ /* - * Copyright (c) 1995-2003, Index Data + * Copyright (c) 1995-2004, Index Data * See the file LICENSE for details. * - * $Id: comstack.c,v 1.1 2003-10-27 12:21:30 adam Exp $ + * $Id: comstack.c,v 1.5 2004-02-19 23:20:44 adam Exp $ */ #include #include +#include #include #include #include #include +#ifdef WIN32 +#define strncasecmp _strnicmp +#endif + static const char *cs_errlist[] = { "No error or unspecified error", @@ -26,8 +31,16 @@ static const char *cs_errlist[] = const char *cs_errmsg(int n) { - if (n < 0 || n > 6) - n = 0; + static char buf[250]; + + if (n < CSNONE || n > CSLASTERROR) { + sprintf(buf, "unknown comstack error %d", n); + return buf; + } + if (n == CSYSERR) { + sprintf(buf, "%s: %s", cs_errlist[n], strerror(errno)); + return buf; + } return cs_errlist[n]; } @@ -127,6 +140,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 @@ -147,23 +161,25 @@ int cs_complete_auto(const unsigned char *buf, int len) { if (chunked) { + /* inside chunked body .. */ while(1) { int chunk_len = 0; i += 2; -#if 0 +#if CHUNK_DEBUG /* debugging */ if (i >>"); + printf ("\n<<<"); + int j; for (j = i; j <= i+4; j++) printf ("%c", buf[j]); - printf ("<<<\n"); + printf (">>>\n"); } #endif 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); @@ -183,6 +199,9 @@ int cs_complete_auto(const unsigned char *buf, int len) if (buf[i] != '\r' || buf[i+1] != '\n' || chunk_len < 0) return i+2; /* bad. stop now */ +#if CHUNK_DEBUG + printf ("XXXXXX chunk_len=%d\n", chunk_len); +#endif if (chunk_len == 0) { /* consider trailing headers .. */ @@ -194,7 +213,7 @@ int cs_complete_auto(const unsigned char *buf, int len) return i+4; i++; } -#if 0 +#if CHUNK_DEBUG /* debugging */ printf ("XXXXXXXXX not there yet 2\n"); printf ("i=%d len=%d\n", i, len); @@ -213,21 +232,21 @@ int cs_complete_auto(const unsigned char *buf, int len) } break; } - else if (i < len - 21 && - !memcmp(buf+i, "Transfer-Encoding: ", 18)) + else if (i < len - 20 && + !strncasecmp(buf+i, "Transfer-Encoding:", 18)) { i+=18; - if (buf[i] == ' ') + while (buf[i] == ' ') i++; if (i < len - 8) - if (!memcmp(buf+i, "chunked", 7)) + if (!strncasecmp(buf+i, "chunked", 7)) chunked = 1; } - else if (i < len - 18 && - !memcmp(buf+i, "Content-Length: ", 15)) + else if (i < len - 17 && + !strncasecmp(buf+i, "Content-Length:", 15)) { i+= 15; - if (buf[i] == ' ') + while (buf[i] == ' ') i++; content_len = 0; while (i <= len-4 && isdigit(buf[i]))