X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fcomstack.c;h=0c502f83127a11e420d0718ae2310013c5616627;hp=f52abde82c6954c3ef9d1cd30a141393858faa12;hb=ffb913afb48e3a0cb3539827daafed79562ab0b7;hpb=a922f2f81cc0a360e271eb155df9b4f8cb8cd4e9 diff --git a/src/comstack.c b/src/comstack.c index f52abde..0c502f8 100644 --- a/src/comstack.c +++ b/src/comstack.c @@ -19,10 +19,7 @@ #include #include #include - -#ifdef WIN32 -#define strncasecmp _strnicmp -#endif +#include #if HAVE_GNUTLS_H #define ENABLE_SSL 1 @@ -261,8 +258,8 @@ static int cs_read_chunk(const char *buf, int i, int len) #if CHUNK_DEBUG if (i < len-2) { - printf ("\n<<<"); int j; + printf ("\n<<<"); for (j = i; j <= i+3; j++) printf ("%c", buf[j]); printf (">>>\n"); @@ -331,22 +328,40 @@ static int cs_read_chunk(const char *buf, int i, int len) static int cs_complete_http(const char *buf, int len, int head_only) { /* deal with HTTP request/response */ - int i = 2, content_len = 0, chunked = 0; + int i, content_len = 0, chunked = 0; - if (len < 6) - return 0; + /* need at least one line followed by \n or \r .. */ + for (i = 0; ; i++) + if (i == len) + return 0; /* incomplete */ + else if (buf[i] == '\n' || buf[i] == '\r') + break; - /* if dealing with HTTP responses - then default - content length is unlimited (socket close) */ + /* check to see if it's a response with content */ if (!head_only && !memcmp(buf, "HTTP/", 5)) - content_len = -1; - + { + int j; + for (j = 5; j < i; j++) + if (buf[j] == ' ') + { + ++j; + if (buf[j] == '1') /* 1XX */ + ; + else if (!memcmp(buf + j, "204", 3)) + ; + else if (!memcmp(buf + j, "304", 3)) + ; + else + content_len = -1; + break; + } + } #if 0 printf("len = %d\n", len); fwrite (buf, 1, len, stdout); printf("----------\n"); #endif - while (i <= len-2) + for (i = 2; i <= len-2; ) { if (i > 8192) { @@ -371,17 +386,19 @@ static int cs_complete_http(const char *buf, int len, int head_only) break; } else if (i < len - 20 && - !strncasecmp((const char *) buf+i, "Transfer-Encoding:", 18)) + !yaz_strncasecmp((const char *) buf+i, + "Transfer-Encoding:", 18)) { i+=18; while (buf[i] == ' ') i++; if (i < len - 8) - if (!strncasecmp((const char *) buf+i, "chunked", 7)) + if (!yaz_strncasecmp((const char *) buf+i, "chunked", 7)) chunked = 1; } else if (i < len - 17 && - !strncasecmp((const char *)buf+i, "Content-Length:", 15)) + !yaz_strncasecmp((const char *)buf+i, + "Content-Length:", 15)) { i+= 15; while (buf[i] == ' ') @@ -410,7 +427,7 @@ static int cs_complete_auto_x(const char *buf, int len, int head_only) int r = cs_complete_http(buf, len, head_only); return r; } - return completeBER((const unsigned char *) buf, len); + return completeBER(buf, len); }