MAJOR: http: reset msg->sov after headers are forwarded

In order to avoid abusively relying on buf->o to guess how many bytes to
rewind during a redispatch, we now clear msg->sov. Thus the meaning of this
field is exactly "how many bytes of headers are left to be forwarded". It
is still possible to rewind because msg->eoh + msg->eol equal that value
before scheduling the forwarding, so we can always subtract them.
This commit is contained in:
Willy Tarreau 2014-04-17 21:14:47 +02:00
parent 0d09050aa5
commit 1234f4a210
2 changed files with 10 additions and 2 deletions

View File

@ -134,10 +134,13 @@ enum http_meth_t find_http_meth(const char *str, const int len);
/* Return the amount of bytes that need to be rewound before buf->p to access
* the current message's headers. The purpose is to be able to easily fetch
* the message's beginning before headers are forwarded, as well as after.
* The principle is that msg->eoh and msg->eol are immutable while msg->sov
* equals the sum of the two before forwarding and is zero after forwarding,
* so the difference cancels the rewinding.
*/
static inline int http_hdr_rewind(const struct http_msg *msg)
{
return msg->chn->buf->o;
return msg->eoh + msg->eol - msg->sov;
}
/* Return the amount of bytes that need to be rewound before buf->p to access
@ -179,7 +182,7 @@ static inline int http_body_bytes(const struct http_msg *msg)
{
int len;
len = buffer_len(msg->chn->buf) - msg->sov - msg->sol;
len = msg->chn->buf->i - msg->sov - msg->sol;
if (len > msg->body_len)
len = msg->body_len;
return len;

View File

@ -5064,6 +5064,7 @@ int http_request_forward_body(struct session *s, struct channel *req, int an_bit
msg->chunk_len += msg->next;
msg->chunk_len -= channel_forward(req, msg->chunk_len);
msg->next = 0;
msg->sov = 0;
}
if (msg->msg_state == HTTP_MSG_DATA) {
@ -6188,6 +6189,7 @@ int http_response_forward_body(struct session *s, struct channel *res, int an_bi
*/
channel_forward(res, msg->sov);
msg->next = 0;
msg->sov = 0;
if (msg->flags & HTTP_MSGF_TE_CHNK)
msg->msg_state = HTTP_MSG_CHUNK_SIZE;
@ -6213,6 +6215,7 @@ int http_response_forward_body(struct session *s, struct channel *res, int an_bi
msg->chunk_len += msg->next;
msg->chunk_len -= channel_forward(res, msg->chunk_len);
msg->next = 0;
msg->sov = 0;
}
}
@ -6302,6 +6305,7 @@ int http_response_forward_body(struct session *s, struct channel *res, int an_bi
/* forwarding trailers */
channel_forward(res, msg->next);
msg->next = 0;
msg->sov = 0;
}
/* we're in HTTP_MSG_DONE now, but we might still have
* some data pending, so let's loop over once.
@ -6373,6 +6377,7 @@ int http_response_forward_body(struct session *s, struct channel *res, int an_bi
msg->chunk_len += msg->next;
msg->chunk_len -= channel_forward(res, msg->chunk_len);
msg->next = 0;
msg->sov = 0;
}
}