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.
diff --git a/src/proto_http.c b/src/proto_http.c
index 0c30d0e..328f28b 100644
--- a/src/proto_http.c
+++ b/src/proto_http.c
@@ -5064,6 +5064,7 @@
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 @@
*/
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 @@
msg->chunk_len += msg->next;
msg->chunk_len -= channel_forward(res, msg->chunk_len);
msg->next = 0;
+ msg->sov = 0;
}
}
@@ -6302,6 +6305,7 @@
/* 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 @@
msg->chunk_len += msg->next;
msg->chunk_len -= channel_forward(res, msg->chunk_len);
msg->next = 0;
+ msg->sov = 0;
}
}