mirror of
https://gitlab.xiph.org/xiph/icecast-common.git
synced 2024-12-04 14:46:31 -05:00
Feature: Allow enumeration of parser content
This commit is contained in:
parent
c1d41f38b0
commit
6492a456a1
114
httpp/httpp.c
114
httpp/httpp.c
@ -725,6 +725,120 @@ const http_var_t *httpp_get_param_var(http_parser_t *parser, const char *name)
|
|||||||
return _httpp_get_param_var(parser->queryvars, name);
|
return _httpp_get_param_var(parser->queryvars, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const http_var_t *httpp_get_any_var(http_parser_t *parser, httpp_ns_t ns, const char *name)
|
||||||
|
{
|
||||||
|
avl_tree *tree = NULL;
|
||||||
|
|
||||||
|
if (!parser || !name)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
switch (ns) {
|
||||||
|
case HTTPP_NS_VAR:
|
||||||
|
if (name[0] != '_' || name[1] != '_')
|
||||||
|
return NULL;
|
||||||
|
tree = parser->vars;
|
||||||
|
break;
|
||||||
|
case HTTPP_NS_HEADER:
|
||||||
|
if (name[0] == '_' && name[1] == '_')
|
||||||
|
return NULL;
|
||||||
|
tree = parser->vars;
|
||||||
|
break;
|
||||||
|
case HTTPP_NS_QUERY_STRING:
|
||||||
|
tree = parser->queryvars;
|
||||||
|
break;
|
||||||
|
case HTTPP_NS_POST_BODY:
|
||||||
|
tree = parser->postvars;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!tree)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return _httpp_get_param_var(tree, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
char ** httpp_get_any_key(http_parser_t *parser, httpp_ns_t ns)
|
||||||
|
{
|
||||||
|
avl_tree *tree = NULL;
|
||||||
|
avl_node *avlnode;
|
||||||
|
char **ret;
|
||||||
|
size_t len;
|
||||||
|
size_t pos = 0;
|
||||||
|
|
||||||
|
if (!parser)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
switch (ns) {
|
||||||
|
case HTTPP_NS_VAR:
|
||||||
|
case HTTPP_NS_HEADER:
|
||||||
|
tree = parser->vars;
|
||||||
|
break;
|
||||||
|
case HTTPP_NS_QUERY_STRING:
|
||||||
|
tree = parser->queryvars;
|
||||||
|
break;
|
||||||
|
case HTTPP_NS_POST_BODY:
|
||||||
|
tree = parser->postvars;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!tree)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
ret = calloc(8, sizeof(*ret));
|
||||||
|
if (!ret)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
len = 8;
|
||||||
|
|
||||||
|
for (avlnode = avl_get_first(tree); avlnode; avlnode = avl_get_next(avlnode)) {
|
||||||
|
http_var_t *var = avlnode->key;
|
||||||
|
|
||||||
|
if (ns == HTTPP_NS_VAR) {
|
||||||
|
if (var->name[0] != '_' || var->name[1] != '_') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
} else if (ns == HTTPP_NS_HEADER) {
|
||||||
|
if (var->name[0] == '_' && var->name[1] == '_') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pos == (len-1)) {
|
||||||
|
char **n = realloc(ret, sizeof(*ret)*(len + 8));
|
||||||
|
if (!n) {
|
||||||
|
httpp_free_any_key(ret);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
memset(n + len, 0, sizeof(*n)*8);
|
||||||
|
ret = n;
|
||||||
|
len += 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret[pos] = strdup(var->name);
|
||||||
|
if (!ret[pos]) {
|
||||||
|
httpp_free_any_key(ret);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
pos++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void httpp_free_any_key(char **keys)
|
||||||
|
{
|
||||||
|
char **p;
|
||||||
|
|
||||||
|
if (!keys)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (p = keys; *p; p++) {
|
||||||
|
free(*p);
|
||||||
|
}
|
||||||
|
free(keys);
|
||||||
|
}
|
||||||
|
|
||||||
const char *httpp_get_param(http_parser_t *parser, const char *name)
|
const char *httpp_get_param(http_parser_t *parser, const char *name)
|
||||||
{
|
{
|
||||||
const char *ret = _httpp_get_param(parser->postvars, name);
|
const char *ret = _httpp_get_param(parser->postvars, name);
|
||||||
|
@ -39,6 +39,13 @@
|
|||||||
#define HTTPP_VAR_ERROR_CODE "__errorcode"
|
#define HTTPP_VAR_ERROR_CODE "__errorcode"
|
||||||
#define HTTPP_VAR_ICYPASSWORD "__icy_password"
|
#define HTTPP_VAR_ICYPASSWORD "__icy_password"
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
HTTPP_NS_VAR,
|
||||||
|
HTTPP_NS_HEADER,
|
||||||
|
HTTPP_NS_QUERY_STRING,
|
||||||
|
HTTPP_NS_POST_BODY
|
||||||
|
} httpp_ns_t;
|
||||||
|
|
||||||
typedef enum httpp_request_type_tag {
|
typedef enum httpp_request_type_tag {
|
||||||
/* Initial and internally used state of the engine */
|
/* Initial and internally used state of the engine */
|
||||||
httpp_req_none = 0,
|
httpp_req_none = 0,
|
||||||
@ -126,6 +133,9 @@ void httpp_set_post_param(http_parser_t *parser, const char *name, const char *v
|
|||||||
const char *httpp_get_post_param(http_parser_t *parser, const char *name);
|
const char *httpp_get_post_param(http_parser_t *parser, const char *name);
|
||||||
const char *httpp_get_param(http_parser_t *parser, const char *name);
|
const char *httpp_get_param(http_parser_t *parser, const char *name);
|
||||||
const http_var_t *httpp_get_param_var(http_parser_t *parser, const char *name);
|
const http_var_t *httpp_get_param_var(http_parser_t *parser, const char *name);
|
||||||
|
const http_var_t *httpp_get_any_var(http_parser_t *parser, httpp_ns_t ns, const char *name);
|
||||||
|
char ** httpp_get_any_key(http_parser_t *parser, httpp_ns_t ns);
|
||||||
|
void httpp_free_any_key(char **keys);
|
||||||
int httpp_addref(http_parser_t *parser);
|
int httpp_addref(http_parser_t *parser);
|
||||||
int httpp_release(http_parser_t *parser);
|
int httpp_release(http_parser_t *parser);
|
||||||
#define httpp_destroy(x) httpp_release((x))
|
#define httpp_destroy(x) httpp_release((x))
|
||||||
|
Loading…
Reference in New Issue
Block a user