On Sun, Jun 2, 2019 at 5:34 PM Willy Tarreau <w...@1wt.eu> wrote: > > On Sun, Jun 02, 2019 at 04:57:13PM +0800, Alec Liu wrote: > > Hi Willy, > > > > Just get it tested, nothing to do with check-send-proxy, still the > > same no response. > > Hmmm that's annoying because I have one here. Thus probably it's a matter > of polling issue (wait vs immediate response). > > > I have some change as below to make it work again. > > > > ================= > > diff --git a/src/connection.c b/src/connection.c > > index f0ca2bb16..c8ebe9da4 100644 > > --- a/src/connection.c > > +++ b/src/connection.c > > @@ -1017,17 +1017,12 @@ int conn_send_socks4_proxy_request(struct > > connection *conn) > > if (conn->send_proxy_ofs != 0) { > > goto out_wait; > > } > > - } > > - > > - /* OK we've the whole request sent */ > > - conn->flags &= ~CO_FL_SOCKS4_SEND; > > - __conn_sock_stop_send(conn); > > + > > + /* OK we've the whole request sent */ > > + conn->flags &= ~CO_FL_SOCKS4_SEND; > > Please be careful not to reindent the code in your changes, as that > complicates the review. So what I'm seeing is that you only removed > the conn_sock_stop_send() call above, right ?
Actually the code looks like this. Th Master Version: ==== if (conn->send_proxy_ofs < 0) { ... } /* OK we've the whole request sent */ conn->flags &= ~CO_FL_SOCKS4_SEND; __conn_sock_stop_send(conn); ==== My version: ==== if (conn->send_proxy_ofs < 0) { ... /* OK we've the whole request sent */ conn->flags &= ~CO_FL_SOCKS4_SEND; __conn_sock_want_recv(conn); } ==== > > > - /* The connection is ready now, simply return and let the connection > > - * handler notify upper layers if needed. > > - */ > > - if (conn->flags & CO_FL_WAIT_L4_CONN) > > - conn->flags &= ~CO_FL_WAIT_L4_CONN; > > + __conn_sock_want_recv(conn); > > + } > > I disagree with adjusting the recv polling when sending. It should be > set (if needed) when entering the socks4 recv handler. Also I don't > see how that can fix the problem given that if I understand well, in > your case it's the server's response which fails, thus it's unrelated > to conn_sock (or we have a deeper issue here). I do not have a good explanation for it yet, but actually this is the codes fix the issue on my testing env, not others. > > > if (conn->flags & CO_FL_SEND_PROXY) { > > /* > > @@ -1157,6 +1152,16 @@ int conn_recv_socks4_proxy_response(struct > > connection *conn) > > } while (0); > > > > conn->flags &= ~CO_FL_SOCKS4_RECV; > > + > > + if (conn->flags & CO_FL_WAIT_L4_CONN) { > > + if (!(conn->flags & CO_FL_HANDSHAKE & ~CO_FL_SOCKS4)) { > > + /* No more handshake needed, the connection is ready now, > > + * simply return and let the connection handler notify > > + * upper layers if needed. > > + */ > > + conn->flags &= ~CO_FL_WAIT_L4_CONN; > > + } > > + } > > Wow, I didn't notice this one was missing, this can actually be the > real cause. I'm going to run more tests as well. I was about to issue > dev5 but it can wait a few more minutes, I'll delete my tag. > > Willy The change help on my testing env. ======== --- a/src/connection.c +++ b/src/connection.c @@ -1017,18 +1017,12 @@ int conn_send_socks4_proxy_request(struct connection *conn) if (conn->send_proxy_ofs != 0) { goto out_wait; } + + /* OK we've the whole request sent */ + conn->flags &= ~CO_FL_SOCKS4_SEND; + __conn_sock_want_recv(conn); } - /* OK we've the whole request sent */ - conn->flags &= ~CO_FL_SOCKS4_SEND; - __conn_sock_stop_send(conn); - - /* The connection is ready now, simply return and let the connection - * handler notify upper layers if needed. - */ - if (conn->flags & CO_FL_WAIT_L4_CONN) - conn->flags &= ~CO_FL_WAIT_L4_CONN; - if (conn->flags & CO_FL_SEND_PROXY) { /* * Get the send_proxy_ofs ready for the send_proxy due to we are ============== I will try to look into it, why it is not able to reproduce on your side. Thank you. Regards, Alexander Liu