added a couple of functions for handling trailers
This commit is contained in:
@ -736,7 +736,8 @@ Change it to doubly linked for this?
|
||||
}
|
||||
}
|
||||
|
||||
qse_mchar_t* parse_header_fields (qse_htrd_t* htrd, qse_mchar_t* line)
|
||||
qse_mchar_t* parse_header_fields (
|
||||
qse_htrd_t* htrd, qse_mchar_t* line, qse_htb_t* tab)
|
||||
{
|
||||
qse_mchar_t* p = line, * last;
|
||||
struct
|
||||
@ -812,7 +813,7 @@ qse_mchar_t* parse_header_fields (qse_htrd_t* htrd, qse_mchar_t* line)
|
||||
|
||||
htrd->errnum = QSE_HTRD_ENOERR;
|
||||
if (qse_htb_cbsert (
|
||||
&htrd->re.hdrtab, name.ptr, name.len,
|
||||
tab, name.ptr, name.len,
|
||||
hdr_cbserter, &ctx) == QSE_NULL)
|
||||
{
|
||||
if (htrd->errnum == QSE_HTRD_ENOERR)
|
||||
@ -864,7 +865,7 @@ static QSE_INLINE int parse_initial_line_and_headers (
|
||||
/* TODO: return error if protocol is 0.9.
|
||||
* HTTP/0.9 must not get headers... */
|
||||
|
||||
p = parse_header_fields (htrd, p);
|
||||
p = parse_header_fields (htrd, p, &htrd->re.hdrtab);
|
||||
if (p == QSE_NULL) return -1;
|
||||
}
|
||||
while (1);
|
||||
@ -994,7 +995,10 @@ static const qse_mchar_t* get_trailing_headers (
|
||||
/* TODO: return error if protocol is 0.9.
|
||||
* HTTP/0.9 must not get headers... */
|
||||
|
||||
p = parse_header_fields (htrd, p);
|
||||
p = parse_header_fields (
|
||||
htrd, p,
|
||||
((htrd->option & QSE_HTRD_TRAILERS)? &htrd->re.trailers: &htrd->re.hdrtab)
|
||||
);
|
||||
if (p == QSE_NULL) return QSE_NULL;
|
||||
}
|
||||
while (1);
|
||||
|
@ -27,6 +27,7 @@ int qse_htre_init (qse_htre_t* re, qse_mmgr_t* mmgr)
|
||||
re->mmgr = mmgr;
|
||||
|
||||
if (qse_htb_init (&re->hdrtab, mmgr, 60, 70, 1, 1) <= -1) return -1;
|
||||
if (qse_htb_init (&re->trailers, mmgr, 20, 70, 1, 1) <= -1) return -1;
|
||||
|
||||
qse_mbs_init (&re->content, mmgr, 0);
|
||||
#if 0
|
||||
@ -42,6 +43,7 @@ void qse_htre_fini (qse_htre_t* re)
|
||||
qse_mbs_fini (&re->iniline);
|
||||
#endif
|
||||
qse_mbs_fini (&re->content);
|
||||
qse_htb_fini (&re->trailers);
|
||||
qse_htb_fini (&re->hdrtab);
|
||||
}
|
||||
|
||||
@ -63,6 +65,7 @@ void qse_htre_clear (qse_htre_t* re)
|
||||
QSE_MEMSET (&re->attr, 0, QSE_SIZEOF(re->attr));
|
||||
|
||||
qse_htb_clear (&re->hdrtab);
|
||||
qse_htb_clear (&re->trailers);
|
||||
|
||||
qse_mbs_clear (&re->content);
|
||||
#if 0
|
||||
@ -92,6 +95,15 @@ const qse_mchar_t* qse_htre_getheaderval (
|
||||
return QSE_HTB_VPTR(pair);
|
||||
}
|
||||
|
||||
const qse_mchar_t* qse_htre_gettrailerval (
|
||||
const qse_htre_t* re, const qse_mchar_t* name)
|
||||
{
|
||||
qse_htb_pair_t* pair;
|
||||
pair = qse_htb_search (&re->trailers, name, qse_mbslen(name));
|
||||
if (pair == QSE_NULL) return QSE_NULL;
|
||||
return QSE_HTB_VPTR(pair);
|
||||
}
|
||||
|
||||
struct header_walker_ctx_t
|
||||
{
|
||||
qse_htre_t* re;
|
||||
@ -123,6 +135,19 @@ int qse_htre_walkheaders (
|
||||
qse_htb_walk (&re->hdrtab, walk_headers, &hwctx);
|
||||
return hwctx.ret;
|
||||
}
|
||||
|
||||
int qse_htre_walktrailers (
|
||||
qse_htre_t* re, qse_htre_header_walker_t walker, void* ctx)
|
||||
{
|
||||
struct header_walker_ctx_t hwctx;
|
||||
hwctx.re = re;
|
||||
hwctx.walker = walker;
|
||||
hwctx.ctx = ctx;
|
||||
hwctx.ret = 0;
|
||||
qse_htb_walk (&re->trailers, walk_headers, &hwctx);
|
||||
return hwctx.ret;
|
||||
}
|
||||
|
||||
|
||||
int qse_htre_addcontent (
|
||||
qse_htre_t* re, const qse_mchar_t* ptr, qse_size_t len)
|
||||
|
@ -3180,7 +3180,6 @@ qse_printf (QSE_T("task_main_proxy_5\n"));
|
||||
(proxy->reqfwdbuf && QSE_MBS_LEN(proxy->reqfwdbuf) > 0))? 1: 0;
|
||||
}
|
||||
|
||||
|
||||
static int task_main_proxy_4 (
|
||||
qse_httpd_t* httpd, qse_httpd_client_t* client, qse_httpd_task_t* task)
|
||||
{
|
||||
|
Reference in New Issue
Block a user