diff options
author | Daniel Stenberg <daniel@haxx.se> | 2001-03-13 22:16:42 +0000 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2001-03-13 22:16:42 +0000 |
commit | 195233ed5c6aa8c325424072df7ea24074e7feff (patch) | |
tree | 40b6304b202f625ce13015f211f29d3d68518907 /lib/http_chunks.c | |
parent | 048e6545142a0d15516d0036ff714e9dc422c80b (diff) | |
download | curl-195233ed5c6aa8c325424072df7ea24074e7feff.tar.gz |
updated the chunked state-machine to deal with the trailing CRLF that comes
after the data part
Diffstat (limited to 'lib/http_chunks.c')
-rw-r--r-- | lib/http_chunks.c | 30 |
1 files changed, 28 insertions, 2 deletions
diff --git a/lib/http_chunks.c b/lib/http_chunks.c index c11003354..89c860918 100644 --- a/lib/http_chunks.c +++ b/lib/http_chunks.c @@ -181,17 +181,43 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn, length -= piece; /* decrease space left in this round */ if(0 == ch->datasize) - /* end of data this round, go back to get a new size */ - Curl_httpchunk_init(conn); + /* end of data this round, we now expect a trailing CRLF */ + ch->state = CHUNK_POSTCR; + break; + + case CHUNK_POSTCR: + if(*datap == '\r') { + ch->state = CHUNK_POSTLF; + datap++; + length--; + } + else + return CHUNKE_BAD_CHUNK; + break; + case CHUNK_POSTLF: + if(*datap == '\n') { + /* + * The last one before we go back to hex state and start all + * over. + */ + Curl_httpchunk_init(conn); + datap++; + length--; + } + else + return CHUNKE_BAD_CHUNK; break; + case CHUNK_STOP: /* If we arrive here, there is data left in the end of the buffer even if there's no more chunks to read */ ch->dataleft = length; return CHUNKE_STOP; /* return stop */ +#if 0 default: return CHUNKE_STATE_ERROR; +#endif } } return CHUNKE_OK; |