moved becbuf from hio to htts
This commit is contained in:
		@ -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;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -586,33 +588,28 @@ int hio_svc_fcgic_beginrequest (hio_svc_fcgic_sess_t* sess)
 | 
			
		||||
 | 
			
		||||
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 +636,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 +670,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;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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,
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										11
									
								
								lib/hio.c
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								lib/hio.c
									
									
									
									
									
								
							@ -24,7 +24,6 @@
 | 
			
		||||
 | 
			
		||||
#include "hio-prv.h"
 | 
			
		||||
#include <hio-fmt.h>
 | 
			
		||||
#include <hio-ecs.h>
 | 
			
		||||
#include <stdlib.h> /* 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);
 | 
			
		||||
 | 
			
		||||
@ -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 */
 | 
			
		||||
 | 
			
		||||
@ -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? */
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@ -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);
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user