--- trunk/http-message.c 2009/02/18 16:08:33 427 +++ trunk/http-message.c 2010/01/02 04:55:54 505 @@ -1,6 +1,6 @@ /* http-message.c - HTTP message object - Copyright (C) 2008, 2009 siliconforks.com + Copyright (C) 2008, 2009, 2010 siliconforks.com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -431,9 +431,9 @@ skip_lws(&p); if (*p == '\0') { + /* value was empty: ignore this header??? */ free(name); - Stream_delete(stream); - return -1; + continue; } /* skip backward over LWS, starting from the last char in the buffer */ @@ -813,7 +813,8 @@ } uint8_t * s = p; - for (*bytes_read = 0; *bytes_read < capacity; (*bytes_read)++) { + *bytes_read = 0; + while (*bytes_read < capacity) { if (message->bytes_remaining == 0) { result = read_chunk_size_line(message); if (result != 0) { @@ -842,7 +843,30 @@ break; } s[*bytes_read] = (uint8_t) c; + ++(*bytes_read); message->bytes_remaining--; + + if (message->bytes_remaining == 0) { + // read CRLF terminating chunk + result = HTTPConnection_read_octet(message->connection, &c); + if (result != 0) { + break; + } + if (c != '\r') { + result = -1; + message->chunked_body_state = CHUNKED_BODY_DONE; + break; + } + result = HTTPConnection_read_octet(message->connection, &c); + if (result != 0) { + break; + } + if (c != '\n') { + result = -1; + message->chunked_body_state = CHUNKED_BODY_DONE; + break; + } + } } return result;