Skip to content

Commit

Permalink
updated the chunked state-machine to deal with the trailing CRLF that…
Browse files Browse the repository at this point in the history
… comes

after the data part
  • Loading branch information
bagder committed Mar 13, 2001
1 parent 048e654 commit 195233e
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 5 deletions.
30 changes: 28 additions & 2 deletions lib/http_chunks.c
Expand Up @@ -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;
Expand Down
14 changes: 11 additions & 3 deletions lib/http_chunks.h
Expand Up @@ -30,7 +30,7 @@
#define MAXNUM_SIZE 16

typedef enum {
CHUNK_LOST, /* never use */
CHUNK_FIRST, /* never use */

/* In this we await and buffer all hexadecimal digits until we get one
that isn't a hexadecimal digit. When done, we go POSTHEX */
Expand All @@ -45,10 +45,17 @@ typedef enum {
If the size given was zero, we set state to STOP and return. */
CHUNK_CR,

/* We eat the amount of data specified. When done, we move back to the
HEX state. */
/* We eat the amount of data specified. When done, we move on to the
POST_CR state. */
CHUNK_DATA,

/* POSTCR should get a CR and nothing else, then move to POSTLF */
CHUNK_POSTCR,

/* POSTLF should get a LF and nothing else, then move back to HEX as
the CRLF combination marks the end of a chunk */
CHUNK_POSTLF,

/* This is mainly used to really mark that we're out of the game.
NOTE: that there's a 'dataleft' field in the struct that will tell how
many bytes that were not passed to the client in the end of the last
Expand All @@ -63,6 +70,7 @@ typedef enum {
CHUNKE_OK = 0,
CHUNKE_TOO_LONG_HEX = 1,
CHUNKE_ILLEGAL_HEX,
CHUNKE_BAD_CHUNK,
CHUNKE_WRITE_ERROR,
CHUNKE_STATE_ERROR,
CHUNKE_LAST
Expand Down

0 comments on commit 195233e

Please sign in to comment.