Found a simple way. The sequence was:

client                           server
             handshake --->
             <--- handshake
              request  --->
              <--- response

The handshake, the way it is in my specific case, is logically just an extension of the request and response streams. So just merged it into the same.

client                           server
       handshake . request  --->
       <--- handshake . response

So now things fit into the nginx state machine of upstream modules without any changes required.

Regards,
Reetesh


From: reeteshr@outlook.com
To: nginx-devel@nginx.org
Subject: RE: How to implement handshake in an upstream module?
Date: Thu, 5 Dec 2013 08:53:44 +0530

Hi,

I meant making it non-static and using. This might be the modification we need to the upstream module, rather than introducing a 'handshake' handler formally. Was looking to see if there are any 'state machine' related catches in doing so.

Thanks,
Reetesh

> Date: Thu, 5 Dec 2013 02:38:35 +0400
> From: mdounin@mdounin.ru
> To: nginx-devel@nginx.org
> Subject: Re: How to implement handshake in an upstream module?
>
> Hello!
>
> On Thu, Dec 05, 2013 at 02:39:28AM +0530, Reetesh Ranjan wrote:
>
> > Before I send my main request and process the response through
> > create_request and process_header (and filter) callbacks, I need
> > to have a short handshake with the upstream servers. It consists
> > of a send() and a recv() from the upstream module. How to
> > implement this?
> > Would the following sequence work?States: H = do-handshake
> > (initial state), R = do-request1 In state H, send handshake
> > req first through create_request()2 In process_header() in
> > state == H 2.1 call 'create_request' again with state set
> > to R, so main request gets created 2.2 call
> > 'ngx_http_upstream_send_request' manually to restart the
> > req-response cycle3 Because of 2.2 we get a process_header()
> > call in state R
> > Regards,Reetesh
>
> Obvious problem with the sequence:
> ngx_http_upstream_send_request() is static functions, and can't be
> called from a protocol module without modifications to
> ngx_http_upstream.c.
>
> I don't think that handshake can be implemented without
> modifications to upstream module. It's designed to implement
> request/response logic and doesn't assume any handshakes.
>
> --
> Maxim Dounin
> http://nginx.org/en/donation.html
>
> _______________________________________________
> nginx-devel mailing list
> nginx-devel@nginx.org
> http://mailman.nginx.org/mailman/listinfo/nginx-devel

_______________________________________________ nginx-devel mailing list nginx-devel@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-devel