From 6e0314cce5d9c3d346d4d968a7ea07f92d8761b1 Mon Sep 17 00:00:00 2001 From: Adam Dickmeiss Date: Wed, 1 May 2013 13:50:31 +0200 Subject: [PATCH] Fix problem with HTTP decoding For HTTP 1XX, 204, 304 assume no content-length. --- src/comstack.c | 36 +++++++++++++++++++++++++++--------- test/test_comstack.c | 14 ++++++++++++++ 2 files changed, 41 insertions(+), 9 deletions(-) diff --git a/src/comstack.c b/src/comstack.c index f52abde..eac17f7 100644 --- a/src/comstack.c +++ b/src/comstack.c @@ -261,8 +261,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 +331,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) { diff --git a/test/test_comstack.c b/test/test_comstack.c index aa816df..0e5233d 100644 --- a/test/test_comstack.c +++ b/test/test_comstack.c @@ -173,6 +173,20 @@ static void tst_http_response(void) YAZ_CHECK_EQ(cs_complete_auto(http_buf, 24), 0); } { + /* no content, no headers */ + const char *http_buf = + /*123456789012345678 */ + "HTTP/1.1 204 OK\r\n" + "\r\n" + "HTTP/1.1 200 OK\r\n"; + + YAZ_CHECK_EQ(cs_complete_auto(http_buf, 1), 0); + YAZ_CHECK_EQ(cs_complete_auto(http_buf, 2), 0); + YAZ_CHECK_EQ(cs_complete_auto(http_buf, 18), 0); + YAZ_CHECK_EQ(cs_complete_auto(http_buf, 19), 19); + YAZ_CHECK_EQ(cs_complete_auto(http_buf, 24), 19); + } + { /* response, content */ const char *http_buf = /*123456789012345678 */ -- 1.7.10.4