diff --git a/include/types/proto_http.h b/include/types/proto_http.h index a6709aa4e..6e6836275 100644 --- a/include/types/proto_http.h +++ b/include/types/proto_http.h @@ -205,7 +205,8 @@ typedef enum { */ struct http_msg { int msg_state; /* where we are in the current message parsing */ - char *sol, *eol; /* start of line, end of line */ + char *sol; /* start of line, also start of message when fully parsed */ + char *eol; /* end of line */ int som; /* Start Of Message, relative to buffer */ int col, sov; /* current header: colon, start of value */ int eoh; /* End Of Headers, relative to buffer */ diff --git a/src/proto_http.c b/src/proto_http.c index fd9cff779..767997081 100644 --- a/src/proto_http.c +++ b/src/proto_http.c @@ -823,10 +823,10 @@ void capture_headers(char *som, struct hdr_idx *idx, * non-NULL, they are fed with the new and values to be passed * upon next call. * - * This function was intentionnally designed to be called from + * This function was intentionally designed to be called from * http_msg_analyzer() with the lowest overhead. It should integrate perfectly * within its state machine and use the same macros, hence the need for same - * labels and variable names. + * labels and variable names. Note that msg->sol is left unchanged. */ const char *http_parse_stsline(struct http_msg *msg, const char *msg_buf, int state, const char *ptr, const char *end, @@ -946,10 +946,10 @@ const char *http_parse_stsline(struct http_msg *msg, const char *msg_buf, int st * non-NULL, they are fed with the new and values to be passed * upon next call. * - * This function was intentionnally designed to be called from + * This function was intentionally designed to be called from * http_msg_analyzer() with the lowest overhead. It should integrate perfectly * within its state machine and use the same macros, hence the need for same - * labels and variable names. + * labels and variable names. Note that msg->sol is left unchanged. */ const char *http_parse_reqline(struct http_msg *msg, const char *msg_buf, int state, const char *ptr, const char *end, @@ -1074,7 +1074,8 @@ const char *http_parse_reqline(struct http_msg *msg, const char *msg_buf, int st * depending on the initial msg->msg_state. It can be preempted everywhere * when data are missing and recalled at the exact same location with no * information loss. The header index is re-initialized when switching from - * MSG_R[PQ]BEFORE to MSG_RPVER|MSG_RQMETH. + * MSG_R[PQ]BEFORE to MSG_RPVER|MSG_RQMETH. It modifies msg->sol among other + * fields. */ void http_msg_analyzer(struct buffer *buf, struct http_msg *msg, struct hdr_idx *idx) { @@ -1559,6 +1560,9 @@ int process_cli(struct session *t) * of each header's length, so we can parse them quickly. * ****************************************************************/ + /* ensure we keep this pointer to the beginning of the message */ + msg->sol = req->data + msg->som; + /* * 1: identify the method */ @@ -2673,6 +2677,9 @@ int process_srv(struct session *t) * of each header's length, so we can parse them quickly. * ****************************************************************/ + /* ensure we keep this pointer to the beginning of the message */ + msg->sol = rep->data + msg->som; + /* * 1: get the status code and check for cacheability. */ @@ -3917,7 +3924,7 @@ int apply_filter_to_req_line(struct session *t, struct buffer *req, struct hdr_e done = 0; - cur_ptr = req->data + txn->req.som; + cur_ptr = req->data + txn->req.som; /* should be equal to txn->sol */ cur_end = cur_ptr + txn->req.sl.rq.l; /* Now we have the request line between cur_ptr and cur_end */ @@ -3982,7 +3989,7 @@ int apply_filter_to_req_line(struct session *t, struct buffer *req, struct hdr_e txn->req.eoh += delta; cur_end += delta; - txn->req.sol = req->data + txn->req.som; + txn->req.sol = req->data + txn->req.som; /* should be equal to txn->sol */ cur_end = (char *)http_parse_reqline(&txn->req, req->data, HTTP_MSG_RQMETH, cur_ptr, cur_end + 1, @@ -4511,7 +4518,7 @@ int apply_filter_to_sts_line(struct session *t, struct buffer *rtr, struct hdr_e done = 0; - cur_ptr = rtr->data + txn->rsp.som; + cur_ptr = rtr->data + txn->rsp.som; /* should be equal to txn->sol */ cur_end = cur_ptr + txn->rsp.sl.rq.l; /* Now we have the status line between cur_ptr and cur_end */ @@ -4548,7 +4555,7 @@ int apply_filter_to_sts_line(struct session *t, struct buffer *rtr, struct hdr_e txn->rsp.eoh += delta; cur_end += delta; - txn->rsp.sol = rtr->data + txn->rsp.som; + txn->rsp.sol = rtr->data + txn->rsp.som; /* should be equal to txn->sol */ cur_end = (char *)http_parse_stsline(&txn->rsp, rtr->data, HTTP_MSG_RPVER, cur_ptr, cur_end + 1,