mirror of
https://gitlab.xiph.org/xiph/icecast-common.git
synced 2024-09-22 04:15:55 -04:00
Feature: Added reference counting to httpp parser object
This commit is contained in:
parent
aeddcad5df
commit
03659eb096
@ -118,19 +118,22 @@ httpp_request_info_t httpp_request_info(httpp_request_type_e req)
|
|||||||
|
|
||||||
http_parser_t *httpp_create_parser(void)
|
http_parser_t *httpp_create_parser(void)
|
||||||
{
|
{
|
||||||
return (http_parser_t *)malloc(sizeof(http_parser_t));
|
http_parser_t *parser = calloc(1, sizeof(http_parser_t));
|
||||||
}
|
|
||||||
|
|
||||||
void httpp_initialize(http_parser_t *parser, http_varlist_t *defaults)
|
|
||||||
{
|
|
||||||
http_varlist_t *list;
|
|
||||||
|
|
||||||
|
parser->refc = 1;
|
||||||
parser->req_type = httpp_req_none;
|
parser->req_type = httpp_req_none;
|
||||||
parser->uri = NULL;
|
parser->uri = NULL;
|
||||||
parser->vars = avl_tree_new(_compare_vars, NULL);
|
parser->vars = avl_tree_new(_compare_vars, NULL);
|
||||||
parser->queryvars = avl_tree_new(_compare_vars, NULL);
|
parser->queryvars = avl_tree_new(_compare_vars, NULL);
|
||||||
parser->postvars = avl_tree_new(_compare_vars, NULL);
|
parser->postvars = avl_tree_new(_compare_vars, NULL);
|
||||||
|
|
||||||
|
return parser;
|
||||||
|
}
|
||||||
|
|
||||||
|
void httpp_initialize(http_parser_t *parser, http_varlist_t *defaults)
|
||||||
|
{
|
||||||
|
http_varlist_t *list;
|
||||||
|
|
||||||
/* now insert the default variables */
|
/* now insert the default variables */
|
||||||
list = defaults;
|
list = defaults;
|
||||||
while (list != NULL) {
|
while (list != NULL) {
|
||||||
@ -732,7 +735,7 @@ const char *httpp_get_param(http_parser_t *parser, const char *name)
|
|||||||
return _httpp_get_param(parser->queryvars, name);
|
return _httpp_get_param(parser->queryvars, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
void httpp_clear(http_parser_t *parser)
|
static void httpp_clear(http_parser_t *parser)
|
||||||
{
|
{
|
||||||
parser->req_type = httpp_req_none;
|
parser->req_type = httpp_req_none;
|
||||||
if (parser->uri)
|
if (parser->uri)
|
||||||
@ -744,10 +747,29 @@ void httpp_clear(http_parser_t *parser)
|
|||||||
parser->vars = NULL;
|
parser->vars = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void httpp_destroy(http_parser_t *parser)
|
int httpp_addref(http_parser_t *parser)
|
||||||
{
|
{
|
||||||
|
if (!parser)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
parser->refc++;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int httpp_release(http_parser_t *parser)
|
||||||
|
{
|
||||||
|
if (!parser)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
parser->refc--;
|
||||||
|
if (parser->refc)
|
||||||
|
return 0;
|
||||||
|
|
||||||
httpp_clear(parser);
|
httpp_clear(parser);
|
||||||
free(parser);
|
free(parser);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *_lowercase(char *str)
|
static char *_lowercase(char *str)
|
||||||
|
@ -82,6 +82,7 @@ typedef struct http_varlist_tag {
|
|||||||
} http_varlist_t;
|
} http_varlist_t;
|
||||||
|
|
||||||
typedef struct http_parser_tag {
|
typedef struct http_parser_tag {
|
||||||
|
size_t refc;
|
||||||
httpp_request_type_e req_type;
|
httpp_request_type_e req_type;
|
||||||
char *uri;
|
char *uri;
|
||||||
avl_tree *vars;
|
avl_tree *vars;
|
||||||
@ -125,8 +126,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);
|
||||||
void httpp_destroy(http_parser_t *parser);
|
int httpp_addref(http_parser_t *parser);
|
||||||
void httpp_clear(http_parser_t *parser);
|
int httpp_release(http_parser_t *parser);
|
||||||
|
#define httpp_destroy(x) httpp_release((x))
|
||||||
|
|
||||||
/* util functions */
|
/* util functions */
|
||||||
httpp_request_type_e httpp_str_to_method(const char * method);
|
httpp_request_type_e httpp_str_to_method(const char * method);
|
||||||
|
Loading…
Reference in New Issue
Block a user