fixed a few lines for c89
added more http code
This commit is contained in:
parent
edff7c59d6
commit
19af03709a
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: rec.c 292 2009-09-23 10:19:30Z hyunghwan.chung $
|
* $Id: rec.c 368 2010-11-03 14:24:29Z hyunghwan.chung $
|
||||||
*
|
*
|
||||||
Copyright 2006-2009 Chung, Hyung-Hwan.
|
Copyright 2006-2009 Chung, Hyung-Hwan.
|
||||||
This file is part of QSE.
|
This file is part of QSE.
|
||||||
@ -299,11 +299,15 @@ static int split_record (qse_awk_rtx_t* rtx)
|
|||||||
#if 1
|
#if 1
|
||||||
if (rtx->inrec.nflds >= rtx->inrec.maxflds)
|
if (rtx->inrec.nflds >= rtx->inrec.maxflds)
|
||||||
{
|
{
|
||||||
|
void* tmp;
|
||||||
|
|
||||||
if (rtx->inrec.nflds < 16) nflds = 32;
|
if (rtx->inrec.nflds < 16) nflds = 32;
|
||||||
else nflds = rtx->inrec.nflds * 2;
|
else nflds = rtx->inrec.nflds * 2;
|
||||||
|
|
||||||
void* tmp = QSE_AWK_ALLOC (
|
tmp = QSE_AWK_ALLOC (
|
||||||
rtx->awk, QSE_SIZEOF(*rtx->inrec.flds) * nflds);
|
rtx->awk,
|
||||||
|
QSE_SIZEOF(*rtx->inrec.flds) * nflds
|
||||||
|
);
|
||||||
if (tmp == QSE_NULL)
|
if (tmp == QSE_NULL)
|
||||||
{
|
{
|
||||||
if (fs_free != QSE_NULL) QSE_AWK_FREE (rtx->awk, fs_free);
|
if (fs_free != QSE_NULL) QSE_AWK_FREE (rtx->awk, fs_free);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: pio.c 348 2010-08-26 06:26:28Z hyunghwan.chung $
|
* $Id: pio.c 368 2010-11-03 14:24:29Z hyunghwan.chung $
|
||||||
*
|
*
|
||||||
Copyright 2006-2009 Chung, Hyung-Hwan.
|
Copyright 2006-2009 Chung, Hyung-Hwan.
|
||||||
This file is part of QSE.
|
This file is part of QSE.
|
||||||
@ -91,7 +91,6 @@ qse_pio_t* qse_pio_init (
|
|||||||
|
|
||||||
int i, minidx = -1, maxidx = -1;
|
int i, minidx = -1, maxidx = -1;
|
||||||
|
|
||||||
if (mmgr == QSE_NULL) mmgr = QSE_MMGR_GETDFL();
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
SECURITY_ATTRIBUTES secattr;
|
SECURITY_ATTRIBUTES secattr;
|
||||||
@ -104,6 +103,8 @@ qse_pio_t* qse_pio_init (
|
|||||||
qse_pio_pid_t pid;
|
qse_pio_pid_t pid;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (mmgr == QSE_NULL) mmgr = QSE_MMGR_GETDFL();
|
||||||
|
|
||||||
QSE_MEMSET (pio, 0, QSE_SIZEOF(*pio));
|
QSE_MEMSET (pio, 0, QSE_SIZEOF(*pio));
|
||||||
pio->mmgr = mmgr;
|
pio->mmgr = mmgr;
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: rex.c 348 2010-08-26 06:26:28Z hyunghwan.chung $
|
* $Id: rex.c 368 2010-11-03 14:24:29Z hyunghwan.chung $
|
||||||
*
|
*
|
||||||
Copyright 2006-2009 Chung, Hyung-Hwan.
|
Copyright 2006-2009 Chung, Hyung-Hwan.
|
||||||
This file is part of QSE.
|
This file is part of QSE.
|
||||||
@ -1349,6 +1349,8 @@ static int addsimplecand (
|
|||||||
exec_t* e, group_t* group, qse_rex_node_t* node,
|
exec_t* e, group_t* group, qse_rex_node_t* node,
|
||||||
qse_size_t occ, const qse_char_t* mptr)
|
qse_size_t occ, const qse_char_t* mptr)
|
||||||
{
|
{
|
||||||
|
cand_t cand;
|
||||||
|
|
||||||
QSE_ASSERT (
|
QSE_ASSERT (
|
||||||
node->id == QSE_REX_NODE_NOP ||
|
node->id == QSE_REX_NODE_NOP ||
|
||||||
node->id == QSE_REX_NODE_BOL ||
|
node->id == QSE_REX_NODE_BOL ||
|
||||||
@ -1358,8 +1360,6 @@ static int addsimplecand (
|
|||||||
node->id == QSE_REX_NODE_CSET
|
node->id == QSE_REX_NODE_CSET
|
||||||
);
|
);
|
||||||
|
|
||||||
cand_t cand;
|
|
||||||
|
|
||||||
cand.node = node;
|
cand.node = node;
|
||||||
cand.occ = occ;
|
cand.occ = occ;
|
||||||
cand.group = group;
|
cand.group = group;
|
||||||
|
@ -252,9 +252,11 @@ static qse_xma_blk_t* alloc_from_freelist (
|
|||||||
{
|
{
|
||||||
if (free->size >= size)
|
if (free->size >= size)
|
||||||
{
|
{
|
||||||
|
qse_size_t rem;
|
||||||
|
|
||||||
detach_from_freelist (xma, free);
|
detach_from_freelist (xma, free);
|
||||||
|
|
||||||
qse_size_t rem = free->size - size;
|
rem = free->size - size;
|
||||||
if (rem >= MINBLKLEN)
|
if (rem >= MINBLKLEN)
|
||||||
{
|
{
|
||||||
qse_xma_blk_t* tmp;
|
qse_xma_blk_t* tmp;
|
||||||
|
@ -543,42 +543,132 @@ qse_printf (QSE_T("BADREQ\n"));
|
|||||||
return QSE_NULL;
|
return QSE_NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct cbserter_ctx_t
|
#define octet_tolower(c) (((c) >= 'A' && (c) <= 'Z') ? ((c) | 0x20) : (c))
|
||||||
|
#define octet_toupper(c) (((c) >= 'a' && (c) <= 'z') ? ((c) & ~0x20) : (c))
|
||||||
|
|
||||||
|
static QSE_INLINE int compare_octets (
|
||||||
|
const qse_byte_t* s1, qse_size_t len1,
|
||||||
|
const qse_byte_t* s2, qse_size_t len2)
|
||||||
|
{
|
||||||
|
qse_char_t c1, c2;
|
||||||
|
const qse_byte_t* end1 = s1 + len1;
|
||||||
|
const qse_byte_t* end2 = s2 + len2;
|
||||||
|
|
||||||
|
while (s1 < end1)
|
||||||
|
{
|
||||||
|
c1 = octet_toupper (*s1);
|
||||||
|
if (s2 < end2)
|
||||||
|
{
|
||||||
|
c2 = octet_toupper (*s2);
|
||||||
|
if (c1 > c2) return 1;
|
||||||
|
if (c1 < c2) return -1;
|
||||||
|
}
|
||||||
|
else return 1;
|
||||||
|
s1++; s2++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (s2 < end2)? -1: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static QSE_INLINE void capture_content_length (
|
||||||
|
qse_http_t* http, qse_htb_pair_t* pair)
|
||||||
|
{
|
||||||
|
qse_printf (QSE_T("content length %.*S\n"), (int)pair->vlen, pair->vptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
static QSE_INLINE void capture_content_type (
|
||||||
|
qse_http_t* http, qse_htb_pair_t* pair)
|
||||||
|
{
|
||||||
|
qse_printf (QSE_T("content type %.*S\n"), (int)pair->vlen, pair->vptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
static QSE_INLINE void capture_host (
|
||||||
|
qse_http_t* http, qse_htb_pair_t* pair)
|
||||||
|
{
|
||||||
|
qse_printf (QSE_T("host capture => %.*S\n"), (int)pair->vlen, pair->vptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
static QSE_INLINE void capture_key_header (
|
||||||
|
qse_http_t* http, qse_htb_pair_t* pair)
|
||||||
|
{
|
||||||
|
static struct
|
||||||
|
{
|
||||||
|
const qse_byte_t* ptr;
|
||||||
|
qse_size_t len;
|
||||||
|
void (*handler) (qse_http_t*, qse_htb_pair_t*);
|
||||||
|
} hdrtab[] =
|
||||||
|
{
|
||||||
|
{ "Content-Length", 14, capture_content_length },
|
||||||
|
{ "Content-Type", 12, capture_content_type },
|
||||||
|
{ "Host", 4, capture_host }
|
||||||
|
};
|
||||||
|
|
||||||
|
int n;
|
||||||
|
qse_size_t mid, count, base = 0;
|
||||||
|
|
||||||
|
/* perform binary search */
|
||||||
|
for (count = QSE_COUNTOF(hdrtab); count > 0; count /= 2)
|
||||||
|
{
|
||||||
|
mid = base + count / 2;
|
||||||
|
|
||||||
|
n = compare_octets (
|
||||||
|
pair->kptr, pair->klen,
|
||||||
|
hdrtab[mid].ptr, hdrtab[mid].len
|
||||||
|
);
|
||||||
|
|
||||||
|
if (n == 0)
|
||||||
|
{
|
||||||
|
/* bingo! */
|
||||||
|
hdrtab[mid].handler (http, pair);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (n > 0) { base = mid + 1; count--; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct hdr_cbserter_ctx_t
|
||||||
{
|
{
|
||||||
qse_http_t* http;
|
qse_http_t* http;
|
||||||
void* vptr;
|
void* vptr;
|
||||||
qse_size_t vlen;
|
qse_size_t vlen;
|
||||||
};
|
};
|
||||||
|
|
||||||
static qse_htb_pair_t* cbserter (
|
static qse_htb_pair_t* hdr_cbserter (
|
||||||
qse_htb_t* htb, qse_htb_pair_t* pair,
|
qse_htb_t* htb, qse_htb_pair_t* pair,
|
||||||
void* kptr, qse_size_t klen, void* ctx)
|
void* kptr, qse_size_t klen, void* ctx)
|
||||||
{
|
{
|
||||||
struct cbserter_ctx_t* tx = (struct cbserter_ctx_t*)ctx;
|
struct hdr_cbserter_ctx_t* tx = (struct hdr_cbserter_ctx_t*)ctx;
|
||||||
|
|
||||||
if (pair == QSE_NULL)
|
if (pair == QSE_NULL)
|
||||||
{
|
{
|
||||||
/* the key is new. create a new pair with the key and the value */
|
/* the key is new. let's create a new pair. */
|
||||||
qse_htb_pair_t* p;
|
qse_htb_pair_t* p;
|
||||||
|
|
||||||
p = qse_htb_allocpair (htb, kptr, klen, tx->vptr, tx->vlen);
|
p = qse_htb_allocpair (htb, kptr, klen, tx->vptr, tx->vlen);
|
||||||
|
|
||||||
if (p == QSE_NULL) tx->http->errnum = QSE_HTTP_ENOMEM;
|
if (p == QSE_NULL) tx->http->errnum = QSE_HTTP_ENOMEM;
|
||||||
|
else capture_key_header (tx->http, p);
|
||||||
|
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* the key exists. let's combine values, each separated by a comma */
|
/* the key exists. let's combine values, each separated
|
||||||
|
* by a comma */
|
||||||
struct hdr_cmb_t* cmb;
|
struct hdr_cmb_t* cmb;
|
||||||
qse_byte_t* ptr;
|
qse_byte_t* ptr;
|
||||||
qse_size_t len;
|
qse_size_t len;
|
||||||
|
|
||||||
/* TODO: reduce waste in case the same key appears again and again.
|
/* TODO: reduce waste in case the same key appears again.
|
||||||
*
|
*
|
||||||
* the current implementation is not space nor performance efficient.
|
* the current implementation is not space nor performance
|
||||||
* it allocates a new buffer again whenever it encounters the
|
* efficient. it allocates a new buffer again whenever it
|
||||||
* same key. memory is wasted and performance is sacrificed.
|
* encounters the same key. memory is wasted and performance
|
||||||
*
|
* is sacrificed.
|
||||||
* hopefully, a http header does not include a lot of duplicate
|
|
||||||
* fields and this implmentation can afford wastage.
|
* hopefully, a http header does not include a lot of
|
||||||
|
* duplicate fields and this implmentation can afford wastage.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* allocate a block to combine the existing value and the new value */
|
/* allocate a block to combine the existing value and the new value */
|
||||||
@ -632,6 +722,8 @@ Change it to doubly linked for this?
|
|||||||
cmb->next = tx->http->req.hdr.combined;
|
cmb->next = tx->http->req.hdr.combined;
|
||||||
tx->http->req.hdr.combined = cmb;
|
tx->http->req.hdr.combined = cmb;
|
||||||
|
|
||||||
|
capture_key_header (tx->http, pair);
|
||||||
|
|
||||||
return pair;
|
return pair;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -703,7 +795,7 @@ qse_byte_t* parse_http_header (qse_http_t* http, qse_byte_t* line)
|
|||||||
*last = '\0';
|
*last = '\0';
|
||||||
|
|
||||||
{
|
{
|
||||||
struct cbserter_ctx_t ctx;
|
struct hdr_cbserter_ctx_t ctx;
|
||||||
|
|
||||||
ctx.http = http;
|
ctx.http = http;
|
||||||
ctx.vptr = value.ptr;
|
ctx.vptr = value.ptr;
|
||||||
@ -711,7 +803,8 @@ qse_byte_t* parse_http_header (qse_http_t* http, qse_byte_t* line)
|
|||||||
|
|
||||||
http->errnum = QSE_HTTP_ENOERR;
|
http->errnum = QSE_HTTP_ENOERR;
|
||||||
if (qse_htb_cbsert (
|
if (qse_htb_cbsert (
|
||||||
&http->req.hdr.tab, name.ptr, name.len, cbserter, &ctx) == QSE_NULL)
|
&http->req.hdr.tab, name.ptr, name.len,
|
||||||
|
hdr_cbserter, &ctx) == QSE_NULL)
|
||||||
{
|
{
|
||||||
if (http->errnum == QSE_HTTP_ENOERR) http->errnum = QSE_HTTP_ENOMEM;
|
if (http->errnum == QSE_HTTP_ENOERR) http->errnum = QSE_HTTP_ENOMEM;
|
||||||
return QSE_NULL;
|
return QSE_NULL;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user