MEDIUM: http: msg->sov and msg->sol will never wrap

These ones are offsets now, so they cannot wrap. Let's remove the useless
wrapping detection and simplify the forwarding code.
This commit is contained in:
Willy Tarreau 2012-05-18 23:41:28 +02:00
parent 2692736aa3
commit ea95316bf1
1 changed files with 8 additions and 16 deletions

View File

@ -4181,17 +4181,15 @@ int http_request_forward_body(struct session *s, struct buffer *req, int an_bit)
} }
while (1) { while (1) {
int bytes; unsigned int bytes;
http_silent_debug(__LINE__, s); http_silent_debug(__LINE__, s);
/* we may have some data pending */ /* we may have some data pending between sol and sov */
bytes = msg->sov - msg->sol; bytes = msg->sov - msg->sol;
if (msg->chunk_len || bytes) { if (msg->chunk_len || bytes) {
msg->sol = msg->sov; msg->sol = msg->sov;
if (likely(bytes < 0)) /* sov may have wrapped at the end */
bytes += req->size;
msg->next -= bytes; /* will be forwarded */ msg->next -= bytes; /* will be forwarded */
msg->chunk_len += (unsigned int)bytes; msg->chunk_len += bytes;
msg->chunk_len -= buffer_forward(req, msg->chunk_len); msg->chunk_len -= buffer_forward(req, msg->chunk_len);
} }
@ -5205,7 +5203,7 @@ int http_response_forward_body(struct session *s, struct buffer *res, int an_bit
{ {
struct http_txn *txn = &s->txn; struct http_txn *txn = &s->txn;
struct http_msg *msg = &s->txn.rsp; struct http_msg *msg = &s->txn.rsp;
int bytes; unsigned int bytes;
if (unlikely(msg->msg_state < HTTP_MSG_BODY)) if (unlikely(msg->msg_state < HTTP_MSG_BODY))
return 0; return 0;
@ -5240,17 +5238,13 @@ int http_response_forward_body(struct session *s, struct buffer *res, int an_bit
} }
while (1) { while (1) {
int bytes;
http_silent_debug(__LINE__, s); http_silent_debug(__LINE__, s);
/* we may have some data pending */ /* we may have some data pending between sol and sov */
bytes = msg->sov - msg->sol; bytes = msg->sov - msg->sol;
if (msg->chunk_len || bytes) { if (msg->chunk_len || bytes) {
msg->sol = msg->sov; msg->sol = msg->sov;
if (likely(bytes < 0)) /* sov may have wrapped at the end */
bytes += res->size;
msg->next -= bytes; /* will be forwarded */ msg->next -= bytes; /* will be forwarded */
msg->chunk_len += (unsigned int)bytes; msg->chunk_len += bytes;
msg->chunk_len -= buffer_forward(res, msg->chunk_len); msg->chunk_len -= buffer_forward(res, msg->chunk_len);
} }
@ -5356,14 +5350,12 @@ int http_response_forward_body(struct session *s, struct buffer *res, int an_bit
if (!s->req->analysers) if (!s->req->analysers)
goto return_bad_res; goto return_bad_res;
/* forward any pending data */ /* forward any data pending between sol and sov */
bytes = msg->sov - msg->sol; bytes = msg->sov - msg->sol;
if (msg->chunk_len || bytes) { if (msg->chunk_len || bytes) {
msg->sol = msg->sov; msg->sol = msg->sov;
if (likely(bytes < 0)) /* sov may have wrapped at the end */
bytes += res->size;
msg->next -= bytes; /* will be forwarded */ msg->next -= bytes; /* will be forwarded */
msg->chunk_len += (unsigned int)bytes; msg->chunk_len += bytes;
msg->chunk_len -= buffer_forward(res, msg->chunk_len); msg->chunk_len -= buffer_forward(res, msg->chunk_len);
} }