Author: rhuijben Date: Mon Nov 16 18:11:07 2015 New Revision: 1714648 URL: http://svn.apache.org/viewvc?rev=1714648&view=rev Log: Following up on r1714539, fix a problem in the incoming request parsing that somehow caused bodies to be read as headers without failing the test.
* buckets/request_buckets.c (serf_incoming_rq_parse_rqline, serf_incoming_rq_parse_headerline): Check linebuf state. (serf_incoming_rq_wait_for): Only error on error states. Modified: serf/trunk/buckets/request_buckets.c Modified: serf/trunk/buckets/request_buckets.c URL: http://svn.apache.org/viewvc/serf/trunk/buckets/request_buckets.c?rev=1714648&r1=1714647&r2=1714648&view=diff ============================================================================== --- serf/trunk/buckets/request_buckets.c (original) +++ serf/trunk/buckets/request_buckets.c Mon Nov 16 18:11:07 2015 @@ -327,6 +327,9 @@ static apr_status_t serf_incoming_rq_par const char *spc, *spc2; int res; + if (ctx->linebuf.state != SERF_LINEBUF_READY) + return APR_SUCCESS; + if (ctx->linebuf.used == 0) { return SERF_ERROR_TRUNCATED_STREAM; } @@ -371,6 +374,9 @@ static apr_status_t serf_incoming_rq_par incoming_request_context_t *ctx = bucket->data; const char *split; + if (ctx->linebuf.state != SERF_LINEBUF_READY) + return APR_SUCCESS; + if (ctx->linebuf.used == 0) { ctx->state++; return APR_SUCCESS; @@ -392,7 +398,7 @@ static apr_status_t serf_incoming_rq_wai incoming_rq_status_t wait_for) { incoming_request_context_t *ctx = bucket->data; - apr_status_t status; + apr_status_t read_status, status; if (ctx->state == STATE_TRAILERS && wait_for == STATE_BODY) { /* We are done with the body, but not with the request. @@ -403,25 +409,25 @@ static apr_status_t serf_incoming_rq_wai while (ctx->state < wait_for) { switch (ctx->state) { case STATE_INIT: - status = serf_linebuf_fetch(&ctx->linebuf, ctx->stream, - SERF_NEWLINE_ANY); - if (status) - return status; + read_status = serf_linebuf_fetch(&ctx->linebuf, ctx->stream, + SERF_NEWLINE_ANY); + if (SERF_BUCKET_READ_ERROR(read_status)) + return read_status; status = serf_incoming_rq_parse_rqline(bucket); - if (status) - return status; + if (status || read_status) + return status ? status : read_status; break; case STATE_HEADERS: case STATE_TRAILERS: - status = serf_linebuf_fetch(&ctx->linebuf, ctx->stream, - SERF_NEWLINE_ANY); - if (status) - return status; + read_status = serf_linebuf_fetch(&ctx->linebuf, ctx->stream, + SERF_NEWLINE_ANY); + if (SERF_BUCKET_READ_ERROR(read_status)) + return read_status; status = serf_incoming_rq_parse_headerline(bucket); - if (status) - return status; + if (status || read_status) + return status ? status : read_status; break; case STATE_PREBODY: /* TODO: Determine the body type.. Wrap bucket if necessary,