mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2024-12-24 21:52:17 +00:00
MAJOR: stream_interface: continue to update data polling flags during handshakes
Since data and socket polling flags were split, it became possible to update data flags even during handshakes. In fact this is very important otherwise it is not possible to poll for writes if some data are to be forwarded during a handshake (eg: data received during an SSL connect).
This commit is contained in:
parent
d9de7ca3d0
commit
34ffd77648
@ -750,11 +750,6 @@ void stream_int_update_conn(struct stream_interface *si)
|
||||
struct channel *ib = si->ib;
|
||||
struct channel *ob = si->ob;
|
||||
|
||||
if (si->conn.flags & CO_FL_HANDSHAKE) {
|
||||
/* a handshake is in progress */
|
||||
return;
|
||||
}
|
||||
|
||||
/* Check if we need to close the read side */
|
||||
if (!(ib->flags & CF_SHUTR)) {
|
||||
/* Read not closed, update FD status and timeout for reads */
|
||||
@ -826,14 +821,9 @@ static void stream_int_chk_rcv_conn(struct stream_interface *si)
|
||||
{
|
||||
struct channel *ib = si->ib;
|
||||
|
||||
if (unlikely(si->state != SI_ST_EST || (ib->flags & CF_SHUTR)))
|
||||
if (unlikely(si->state > SI_ST_EST || (ib->flags & CF_SHUTR)))
|
||||
return;
|
||||
|
||||
if (si->conn.flags & CO_FL_HANDSHAKE) {
|
||||
/* a handshake is in progress */
|
||||
return;
|
||||
}
|
||||
|
||||
if ((ib->flags & (CF_HIJACK|CF_DONT_READ)) || channel_full(ib)) {
|
||||
/* stop reading */
|
||||
if (!(ib->flags & (CF_HIJACK|CF_DONT_READ))) /* full */
|
||||
@ -857,15 +847,9 @@ static void stream_int_chk_snd_conn(struct stream_interface *si)
|
||||
{
|
||||
struct channel *ob = si->ob;
|
||||
|
||||
if (unlikely(si->state != SI_ST_EST || (ob->flags & CF_SHUTW)))
|
||||
if (unlikely(si->state > SI_ST_EST || (ob->flags & CF_SHUTW)))
|
||||
return;
|
||||
|
||||
/* handshake running on producer */
|
||||
if (si->conn.flags & CO_FL_HANDSHAKE) {
|
||||
/* a handshake is in progress */
|
||||
return;
|
||||
}
|
||||
|
||||
if (unlikely(channel_is_empty(ob))) /* called with nothing to send ! */
|
||||
return;
|
||||
|
||||
@ -874,7 +858,7 @@ static void stream_int_chk_snd_conn(struct stream_interface *si)
|
||||
(fdtab[si_fd(si)].ev & FD_POLL_OUT))) /* we'll be called anyway */
|
||||
return;
|
||||
|
||||
if (si_conn_send_loop(&si->conn) < 0) {
|
||||
if (!(si->conn.flags & CO_FL_HANDSHAKE) && si_conn_send_loop(&si->conn) < 0) {
|
||||
/* Write error on the file descriptor. We mark the FD as STERROR so
|
||||
* that we don't use it anymore and we notify the task.
|
||||
*/
|
||||
|
Loading…
Reference in New Issue
Block a user