diff --git a/lib/fcgi-cli.c b/lib/fcgi-cli.c index 8420685..cc6a858 100644 --- a/lib/fcgi-cli.c +++ b/lib/fcgi-cli.c @@ -76,6 +76,16 @@ struct hio_svc_fcgic_conn_t hio_svc_fcgic_conn_t* next; }; +struct hio_svc_fcgic_sess_t +{ + int active; + hio_oow_t sid; + hio_svc_fcgic_conn_t* conn; + hio_svc_fcgic_on_read_t on_read; + hio_svc_fcgic_on_untie_t on_untie; + void* ctx; +}; + struct fcgic_sck_xtn_t { hio_svc_fcgic_conn_t* conn; @@ -110,9 +120,7 @@ printf ("DISCONNECT SOCKET .................. sck->%p conn->%p\n", sck, conn); sess = &conn->sess.ptr[i]; if (sess->active) { - /* TODO: release the session???*/ release_session (sess); /* TODO: is this correct?? */ - /* or do we fire a callback??? */ } } conn->dev = HIO_NULL; @@ -260,7 +268,7 @@ printf ("header completed remaining data %d expected body_len %d\n", (int)dlen, } HIO_ASSERT (hio, conn->r.content_len <= conn->r.len); - sess->on_read (sess, conn->r.buf, conn->r.content_len); /* TODO: tell between stdout and stderr */ + sess->on_read (sess, conn->r.buf, conn->r.content_len, sess->ctx); /* TODO: tell between stdout and stderr */ back_to_header: conn->r.state = R_AWAITING_HEADER; @@ -322,6 +330,7 @@ static int make_connection_socket (hio_svc_fcgic_conn_t* conn) HIO_MEMSET (&ci, 0, HIO_SIZEOF(ci)); ci.remoteaddr = conn->addr; + /*ci.connect_tmout.sec = 5; TODO: make this configurable */ if (hio_dev_sck_connect(sck, &ci) <= -1) { @@ -401,7 +410,7 @@ static void free_connections (hio_svc_fcgic_t* fcgic) } } -static hio_svc_fcgic_sess_t* new_session (hio_svc_fcgic_t* fcgic, const hio_skad_t* fcgis_addr, hio_svc_fcgic_on_read_t on_read, void* ctx) +static hio_svc_fcgic_sess_t* new_session (hio_svc_fcgic_t* fcgic, const hio_skad_t* fcgis_addr, hio_svc_fcgic_on_read_t on_read, hio_svc_fcgic_on_untie_t on_untie, void* ctx) { hio_t* hio = fcgic->hio; hio_svc_fcgic_conn_t* conn; @@ -439,6 +448,7 @@ static hio_svc_fcgic_sess_t* new_session (hio_svc_fcgic_t* fcgic, const hio_skad sess->sid = conn->sess.free; sess->on_read = on_read; + sess->on_untie = on_untie; sess->active = 1; sess->ctx = ctx; HIO_ASSERT (hio, sess->conn == conn); @@ -449,6 +459,7 @@ static hio_svc_fcgic_sess_t* new_session (hio_svc_fcgic_t* fcgic, const hio_skad static void release_session (hio_svc_fcgic_sess_t* sess) { + if (sess->on_untie) sess->on_untie (sess, sess->ctx); sess->active = 0; sess->sid = sess->conn->sess.free; sess->conn->sess.free = sess->sid; @@ -494,10 +505,10 @@ void hio_svc_fcgic_stop (hio_svc_fcgic_t* fcgic) HIO_DEBUG1 (hio, "FCGIC - STOPPED SERVICE %p\n", fcgic); } -hio_svc_fcgic_sess_t* hio_svc_fcgic_tie (hio_svc_fcgic_t* fcgic, const hio_skad_t* addr, hio_svc_fcgic_on_read_t on_read, void* ctx) +hio_svc_fcgic_sess_t* hio_svc_fcgic_tie (hio_svc_fcgic_t* fcgic, const hio_skad_t* addr, hio_svc_fcgic_on_read_t on_read, hio_svc_fcgic_on_untie_t on_untie, void* ctx) { /* TODO: reference counting for safety?? */ - return new_session(fcgic, addr, on_read, ctx); + return new_session(fcgic, addr, on_read, on_untie, ctx); } void hio_svc_fcgic_untie (hio_svc_fcgic_sess_t* sess) @@ -642,4 +653,4 @@ int hio_svc_fcgic_writestdin (hio_svc_fcgic_sess_t* sess, const void* data, hio_ /* TODO: check if sess->conn->dev is still valid */ return hio_dev_sck_writev(sess->conn->dev, iov, (size > 0? 2: 1), HIO_NULL, HIO_NULL); -} \ No newline at end of file +} diff --git a/lib/hio-fcgi.h b/lib/hio-fcgi.h index 7e12363..d0a2ed0 100644 --- a/lib/hio-fcgi.h +++ b/lib/hio-fcgi.h @@ -123,19 +123,16 @@ typedef struct hio_svc_fcgic_conn_t hio_svc_fcgic_conn_t; /* ---------------------------------------------------------------- */ typedef int (*hio_svc_fcgic_on_read_t) ( - hio_svc_fcgic_sess_t* sess, - const void* data, - hio_iolen_t dlen + hio_svc_fcgic_sess_t* sess, + const void* data, + hio_iolen_t dlen, + void* ctx ); -struct hio_svc_fcgic_sess_t -{ - int active; - hio_oow_t sid; - hio_svc_fcgic_conn_t* conn; - hio_svc_fcgic_on_read_t on_read; - void* ctx; -}; +typedef void (*hio_svc_fcgic_on_untie_t) ( + hio_svc_fcgic_sess_t* sess, + void* ctx; +); /* ---------------------------------------------------------------- */ #if defined(__cplusplus) @@ -160,10 +157,11 @@ static HIO_INLINE hio_t* hio_svc_fcgic_gethio(hio_svc_fcgic_t* svc) { return hio #endif HIO_EXPORT hio_svc_fcgic_sess_t* hio_svc_fcgic_tie ( - hio_svc_fcgic_t* fcgic, - const hio_skad_t* fcgis_addr, - hio_svc_fcgic_on_read_t on_read, - void* ctx + hio_svc_fcgic_t* fcgic, + const hio_skad_t* fcgis_addr, + hio_svc_fcgic_on_read_t on_read, + hio_svc_fcgic_on_untie_t on_untie, + void* ctx ); HIO_EXPORT void hio_svc_fcgic_untie ( @@ -188,12 +186,6 @@ HIO_EXPORT int hio_svc_fcgic_writestdin ( hio_iolen_t size ); -#if defined(HIO_HAVE_INLINE) -static HIO_INLINE void* hio_svc_fcgic_getsessctx (hio_svc_fcgic_sess_t* sess) { return sess->ctx; } -#else -#define hio_svc_fcgic_getsessctx(sess) ((sess)->ctx) -#endif - #if defined(__cplusplus) } #endif diff --git a/lib/http-fcgi.c b/lib/http-fcgi.c index e6578c1..9a7a3a9 100644 --- a/lib/http-fcgi.c +++ b/lib/http-fcgi.c @@ -215,25 +215,13 @@ static HIO_INLINE void fcgi_mark_over (fcgi_t* fcgi, int over_bits) if (!(old_over & FCGI_OVER_READ_FROM_PEER) && (fcgi->over & FCGI_OVER_READ_FROM_PEER)) { -#if 0 // TODO: - if (fcgi->peer && hio_dev_pro_read(fcgi->peer, HIO_DEV_PRO_OUT, 0) <= -1) - { - HIO_DEBUG2 (fcgi->htts->hio, "HTTS(%p) - halting peer(%p) for failure to disable input watching\n", fcgi->htts, fcgi->peer); - hio_dev_pro_halt (fcgi->peer); - } -#endif + if (fcgi->peer) hio_svc_fcgic_untie(fcgi->peer); } if (old_over != FCGI_OVER_ALL && fcgi->over == FCGI_OVER_ALL) { /* ready to stop */ -#if 0 // TODO: - if (fcgi->peer) - { - HIO_DEBUG2 (fcgi->htts->hio, "HTTS(%p) - halting peer(%p) as it is unneeded\n", fcgi->htts, fcgi->peer); - hio_dev_pro_halt (fcgi->peer); // TODO: untie??? - } -#endif + if (fcgi->peer) hio_svc_fcgic_untie(fcgi->peer); if (fcgi->csck) { @@ -477,9 +465,9 @@ oops: } -static int fcgi_peer_on_read (hio_svc_fcgic_sess_t* peer, const void* data, hio_iolen_t dlen) +static int fcgi_peer_on_read (hio_svc_fcgic_sess_t* peer, const void* data, hio_iolen_t dlen, void* ctx) { - fcgi_t* fcgi = hio_svc_fcgic_getsessctx(peer); + fcgi_t* fcgi = (fcgi_t*)ctx; hio_svc_htts_t* htts = fcgi->htts; hio_t* hio = htts->hio; @@ -538,6 +526,13 @@ oops: return 0; } +static int fcgi_peer_on_untie (hio_svc_fcgic_sess_t* peer, void* ctx) +{ + fcgi_t* fcgi = (fcgi_t*)ctx; + if (fcgi->peer) fcgi->peer = HIO_NULL; /* in case this untie event originates from the fcgi client itself */ + fcgi_halt_participating_devices (fcgi); /* TODO: kill the session only??? */ +} + static int peer_capture_response_header (hio_htre_t* req, const hio_bch_t* key, const hio_htre_hdrval_t* val, void* ctx) { hio_svc_htts_cli_t* cli = (hio_svc_htts_cli_t*)ctx; @@ -803,7 +798,7 @@ int hio_svc_htts_dofcgi (hio_svc_htts_t* htts, hio_dev_sck_t* csck, hio_htre_t* HIO_SVC_HTTS_TASK_REF ((hio_svc_htts_task_t*)fcgi, pxtn->fcgi); /* peer->fcgi in htrd = fcgi */ /* create a session in in the fcgi client service */ - fcgi->peer = hio_svc_fcgic_tie(htts->fcgic, fcgis_addr, fcgi_peer_on_read, fcgi); + fcgi->peer = hio_svc_fcgic_tie(htts->fcgic, fcgis_addr, fcgi_peer_on_read, fcgi_peer_on_untie, fcgi); if (HIO_UNLIKELY(!fcgi->peer)) goto oops; /* send FCGI_BEGIN_REQUEST */