diff --git a/lib/fcgi-cli.c b/lib/fcgi-cli.c index 5008ff9..40995df 100644 --- a/lib/fcgi-cli.c +++ b/lib/fcgi-cli.c @@ -549,6 +549,8 @@ void hio_svc_fcgic_untie (hio_svc_fcgic_sess_t* sess) int hio_svc_fcgic_beginrequest (hio_svc_fcgic_sess_t* sess) { + hio_svc_fcgic_conn_t* conn = sess->conn; + hio_t* hio = conn->hio; hio_iovec_t iov[2]; hio_fcgi_record_header_t h; hio_fcgi_begin_request_body_t b; @@ -556,7 +558,7 @@ int hio_svc_fcgic_beginrequest (hio_svc_fcgic_sess_t* sess) if (!sess->conn->dev) { - /* TODO: set error **/ + hio_seterrbfmt (hio, HIO_EPERM, "fcgi not connected"); return -1; } @@ -580,39 +582,33 @@ int hio_svc_fcgic_beginrequest (hio_svc_fcgic_sess_t* sess) HIO_ASSERT (sess->conn->hio, ((hio_oow_t)sess & 3) == 0); wrctx = ((hio_oow_t)sess | 0); /* see the sck_on_write() */ -/* TODO: check if sess->conn->dev is still valid */ return hio_dev_sck_writev(sess->conn->dev, iov, 2, wrctx, HIO_NULL); } int hio_svc_fcgic_writeparam (hio_svc_fcgic_sess_t* sess, const void* key, hio_iolen_t ksz, const void* val, hio_iolen_t vsz) { + hio_svc_fcgic_conn_t* conn = sess->conn; + hio_t* hio = conn->hio; hio_iovec_t iov[4]; hio_fcgi_record_header_t h; hio_uint8_t sz[8]; hio_oow_t szc = 0; + hio_oow_t plen = 0; void* wrctx; - if (!sess->conn->dev) + if (!conn->dev) { - /* TODO: set error **/ + hio_seterrbfmt (hio, HIO_EPERM, "fcgi not connected"); return -1; } -/* TODO: buffer key value pairs. flush on the end of param of buffer full. -* can merge multipl key values pairs in one FCGI_PARAMS packets.... -*/ - HIO_MEMSET (&h, 0, HIO_SIZEOF(h)); - h.version = HIO_FCGI_VERSION; - h.type = HIO_FCGI_PARAMS; - h.id = hio_hton16(sess->sid + 1); - h.content_len = 0; - /* TODO: check ksz and vsz can't exceed max 32bit value. */ /* limit sizes to the max of the signed 32-bit interger * the high-order bit is used as encoding marker (1-byte or 4-byte encoding). * so a size can't hit the unsigned max. */ ksz &= HIO_TYPE_MAX(hio_int32_t); vsz &= HIO_TYPE_MAX(hio_int32_t); + if (ksz > 0) { if (ksz > 0x7F) @@ -639,14 +635,21 @@ int hio_svc_fcgic_writeparam (hio_svc_fcgic_sess_t* sess, const void* key, hio_i sz[szc++] = vsz; } - h.content_len = szc + ksz + vsz; - /* TODO: check content_len overflows... */ + plen = szc + ksz + vsz; + if (plen > 0xFFFF) + { + hio_seterrbfmt (hio, HIO_EINVAL, "fcgi parameter too large"); + return -1; + } } - h.content_len = hio_hton16(h.content_len); + HIO_MEMSET (&h, 0, HIO_SIZEOF(h)); + h.version = HIO_FCGI_VERSION; + h.type = HIO_FCGI_PARAMS; + h.id = hio_hton16(sess->sid + 1); + h.content_len = hio_hton16(plen); h.padding_len = 0; -/* TODO: some buffering of parameters??? if the key/value isn't long enough, it may trigger many system calls*/ iov[0].iov_ptr = &h; iov[0].iov_len = HIO_SIZEOF(h); if (ksz > 0) @@ -666,13 +669,15 @@ int hio_svc_fcgic_writeparam (hio_svc_fcgic_sess_t* sess, const void* key, hio_i int hio_svc_fcgic_writestdin (hio_svc_fcgic_sess_t* sess, const void* data, hio_iolen_t size) { + hio_svc_fcgic_conn_t* conn = sess->conn; + hio_t* hio = conn->hio; hio_iovec_t iov[2]; hio_fcgi_record_header_t h; void* wrctx; if (!sess->conn->dev) { - /* TODO: set error **/ + hio_seterrbfmt (hio, HIO_EPERM, "fcgi not connected"); return -1; } @@ -692,6 +697,5 @@ int hio_svc_fcgic_writestdin (hio_svc_fcgic_sess_t* sess, const void* data, hio_ HIO_ASSERT (sess->conn->hio, ((hio_oow_t)sess & 3) == 0); wrctx = ((hio_oow_t)sess | 2); /* see the sck_on_write() */ -/* TODO: check if sess->conn->dev is still valid */ return hio_dev_sck_writev(sess->conn->dev, iov, (size > 0? 2: 1), wrctx, HIO_NULL); } diff --git a/lib/hio-cmn.h b/lib/hio-cmn.h index 0229567..c003aa6 100644 --- a/lib/hio-cmn.h +++ b/lib/hio-cmn.h @@ -1038,12 +1038,4 @@ struct hio_cmgr_t ((c) >= 'A' && (c) <= 'Z')? ((c) - 'A' + 10): \ ((c) >= 'a' && (c) <= 'Z')? ((c) - 'a' + 10): base) - -/* ========================================================================= - * PRE-DEFINITION OF FOUNDATIONAL COMPOSITE TYPES - * =========================================================================*/ -typedef struct hio_t hio_t; -typedef struct hio_becs_t hio_becs_t; -typedef struct hio_uecs_t hio_uecs_t; - #endif diff --git a/lib/hio-ecs.h b/lib/hio-ecs.h index 6d0df36..533845f 100644 --- a/lib/hio-ecs.h +++ b/lib/hio-ecs.h @@ -60,11 +60,8 @@ /**< last character. unsafe if length <= 0 */ #define HIO_UECS_LASTCHAR(s) ((s)->val.ptr[(s)->val.len-1]) -/* - * defined in hio-cmn.h typedef struct hio_becs_t hio_becs_t; typedef struct hio_uecs_t hio_uecs_t; -*/ typedef hio_oow_t (*hio_becs_sizer_t) ( hio_becs_t* data, diff --git a/lib/hio-fcgi.h b/lib/hio-fcgi.h index 29bd6b3..2d685cf 100644 --- a/lib/hio-fcgi.h +++ b/lib/hio-fcgi.h @@ -61,7 +61,6 @@ enum hio_fcgi_role_t }; typedef enum hio_fcgi_role_t hio_fcgi_role_t; - /* flag in fcgi_begin_request_body */ #define HIO_FCGI_KEEP_CONN 1 diff --git a/lib/hio.c b/lib/hio.c index a549f1a..c002ce1 100644 --- a/lib/hio.c +++ b/lib/hio.c @@ -24,7 +24,6 @@ #include "hio-prv.h" #include -#include #include /* malloc, free, etc */ #define DEV_CAP_ALL_WATCHED (HIO_DEV_CAP_IN_WATCHED | HIO_DEV_CAP_OUT_WATCHED | HIO_DEV_CAP_PRI_WATCHED) @@ -124,9 +123,6 @@ int hio_init (hio_t* hio, hio_mmgr_t* mmgr, hio_cmgr_t* cmgr, hio_bitmask_t feat hio->log.ptr = hio_allocmem(hio, (hio->log.capa + 1) * HIO_SIZEOF(*hio->log.ptr)); if (HIO_UNLIKELY(!hio->log.ptr)) goto oops; - hio->becbuf = hio_becs_open(hio, 0, 256); - if (HIO_UNLIKELY(!hio->becbuf)) goto oops; - /* inititalize the system-side logging */ if (HIO_UNLIKELY(hio_sys_init(hio) <= -1)) goto oops; sys_inited = 1; @@ -153,7 +149,6 @@ oops: if (sys_inited) hio_sys_fini (hio); - if (hio->becbuf) hio_freemem (hio, hio->becbuf); if (hio->log.ptr) hio_freemem (hio, hio->log.ptr); hio->log.capa = 0; return -1; @@ -250,12 +245,6 @@ void hio_fini (hio_t* hio) hio_sys_fini (hio); /* finalize the system dependent data */ - if (hio->becbuf) - { - hio_becs_close (hio->becbuf); - hio->becbuf = HIO_NULL; - } - if (hio->log.ptr) { hio_freemem (hio, hio->log.ptr); diff --git a/lib/hio.h b/lib/hio.h index 308f6dc..6a34b59 100644 --- a/lib/hio.h +++ b/lib/hio.h @@ -54,10 +54,7 @@ struct hio_devaddr_t /* ========================================================================= */ -/* - * defined in hio-cmn.h - *typedef struct hio_t hio_t; - */ +typedef struct hio_t hio_t; typedef struct hio_dev_t hio_dev_t; typedef struct hio_dev_mth_t hio_dev_mth_t; typedef struct hio_dev_evcb_t hio_dev_evcb_t; @@ -770,7 +767,6 @@ struct hio_t } xbuf; /* buffer to support sprintf */ } sprintf; - hio_becs_t* becbuf; /* temporary buffer for some string manipulation */ hio_uint8_t bigbuf[65535]; /* TODO: make this dynamic depending on devices added. device may indicate a buffer size required??? */ hio_cfmb_t cfmb; /* list head of cfmbs */ diff --git a/lib/http-fcgi.c b/lib/http-fcgi.c index 6709cf5..2f16536 100644 --- a/lib/http-fcgi.c +++ b/lib/http-fcgi.c @@ -732,8 +732,7 @@ static int fcgi_client_on_write (hio_dev_sck_t* sck, hio_iolen_t wrlen, void* wr if (fcgi->peer && fcgi->num_pending_writes_to_client == FCGI_PENDING_IO_THRESHOLD_TO_CLIENT) { #if 0 // TODO - if (!(fcgi->over & FCGI_OVER_READ_FROM_PEER) && - hio_svc_fcgic_read(fcgi->peer, 1) <= -1) goto oops; + if (!(fcgi->over & FCGI_OVER_READ_FROM_PEER) && hio_svc_fcgic_read(fcgi->peer, 1) <= -1) goto oops; #endif } @@ -767,33 +766,33 @@ static int peer_capture_request_header (hio_htre_t* req, const hio_bch_t* key, c if (hio_comp_bcstr(key, "Content-Type", 1) == 0) { /* don't prefix CONTENT_TYPE with HTTP_ */ - hio_becs_clear (hio->becbuf); + hio_becs_clear (htts->becbuf); } else { - if (hio_becs_cpy(hio->becbuf, "HTTP_") == (hio_oow_t)-1) return -1; + if (hio_becs_cpy(htts->becbuf, "HTTP_") == (hio_oow_t)-1) return -1; } - if (hio_becs_cat(hio->becbuf, key) == (hio_oow_t)-1 || - hio_becs_ccat(hio->becbuf, '\0') == (hio_oow_t)-1) return -1; + if (hio_becs_cat(htts->becbuf, key) == (hio_oow_t)-1 || + hio_becs_ccat(htts->becbuf, '\0') == (hio_oow_t)-1) return -1; - for (ptr = HIO_BECS_PTR(hio->becbuf); *ptr; ptr++) + for (ptr = HIO_BECS_PTR(htts->becbuf); *ptr; ptr++) { *ptr = hio_to_bch_upper(*ptr); if (*ptr =='-') *ptr = '_'; } - val_offset = HIO_BECS_LEN(hio->becbuf); - if (hio_becs_cat(hio->becbuf, val->ptr) == (hio_oow_t)-1) return -1; + val_offset = HIO_BECS_LEN(htts->becbuf); + if (hio_becs_cat(htts->becbuf, val->ptr) == (hio_oow_t)-1) return -1; val = val->next; while (val) { - if (hio_becs_cat(hio->becbuf, ",") == (hio_oow_t)-1 || - hio_becs_cat(hio->becbuf, val->ptr) == (hio_oow_t)-1) return -1; + if (hio_becs_cat(htts->becbuf, ",") == (hio_oow_t)-1 || + hio_becs_cat(htts->becbuf, val->ptr) == (hio_oow_t)-1) return -1; val = val->next; } - hio_svc_fcgic_writeparam(fcgi->peer, HIO_BECS_PTR(hio->becbuf), val_offset - 1, HIO_BECS_CPTR(hio->becbuf, val_offset), HIO_BECS_LEN(hio->becbuf) - val_offset); + hio_svc_fcgic_writeparam(fcgi->peer, HIO_BECS_PTR(htts->becbuf), val_offset - 1, HIO_BECS_CPTR(htts->becbuf, val_offset), HIO_BECS_LEN(htts->becbuf) - val_offset); /* TODO: error handling? */ } diff --git a/lib/http-prv.h b/lib/http-prv.h index 7ba383d..7c04fd9 100644 --- a/lib/http-prv.h +++ b/lib/http-prv.h @@ -78,6 +78,8 @@ struct hio_svc_htts_t hio_bch_t* server_name; hio_bch_t server_name_buf[64]; + hio_becs_t* becbuf; /* temporary buffer for any work */ + int fcgic_tmout_set; hio_svc_fcgic_tmout_t fcgic_tmout; }; diff --git a/lib/http-svr.c b/lib/http-svr.c index dfcd1e0..57bc989 100644 --- a/lib/http-svr.c +++ b/lib/http-svr.c @@ -364,6 +364,9 @@ hio_svc_htts_t* hio_svc_htts_start (hio_t* hio, hio_oow_t xtnsize, hio_dev_sck_b htts->fcgic_tmout = *fcgic_tmout; } + htts->becbuf = hio_becs_open(hio, 0, 256); + if (HIO_UNLIKELY(!htts->becbuf)) goto oops; + htts->l.sck = (hio_dev_sck_t**)hio_callocmem(hio, HIO_SIZEOF(*htts->l.sck) * nbinds); if (HIO_UNLIKELY(!htts->l.sck)) goto oops; htts->l.count = nbinds; @@ -515,6 +518,7 @@ oops: hio_freemem (hio, htts->l.sck); } + if (htts->becbuf) hio_becs_close (htts->becbuf); hio_freemem (hio, htts); } return HIO_NULL; @@ -560,6 +564,7 @@ void hio_svc_htts_stop (hio_svc_htts_t* htts) if (htts->l.sck) hio_freemem (hio, htts->l.sck); + if (htts->becbuf) hio_becs_close (htts->becbuf); hio_freemem (hio, htts); HIO_DEBUG1 (hio, "HTTS - STOPPED SERVICE %p\n", htts);