Loading lib/http_chunks.c +28 −2 Original line number Diff line number Diff line Loading @@ -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; Loading lib/http_chunks.h +11 −3 Original line number Diff line number Diff line Loading @@ -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 */ Loading @@ -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 Loading @@ -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 Loading Loading
lib/http_chunks.c +28 −2 Original line number Diff line number Diff line Loading @@ -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; Loading
lib/http_chunks.h +11 −3 Original line number Diff line number Diff line Loading @@ -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 */ Loading @@ -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 Loading @@ -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 Loading