From: Jaroslav Kysela Date: Sat, 2 Dec 2017 17:55:44 +0000 (+0100) Subject: http: add http_arg_get_query() fcn X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=43b190635e9b1ccd47fcdb51448695d1dd94be71;p=thirdparty%2Ftvheadend.git http: add http_arg_get_query() fcn --- diff --git a/src/http.c b/src/http.c index b6ef09bd5..f5e5d5d0c 100644 --- a/src/http.c +++ b/src/http.c @@ -1487,7 +1487,7 @@ http_arg_remove(struct http_arg_list *list, struct http_arg *arg) * Delete all arguments associated with a connection */ void -http_arg_flush(struct http_arg_list *list) +http_arg_flush(http_arg_list_t *list) { http_arg_t *ra; while((ra = TAILQ_FIRST(list)) != NULL) @@ -1499,7 +1499,7 @@ http_arg_flush(struct http_arg_list *list) * Find an argument associated with a connection */ char * -http_arg_get(struct http_arg_list *list, const char *name) +http_arg_get(http_arg_list_t *list, const char *name) { http_arg_t *ra; TAILQ_FOREACH(ra, list, link) @@ -1549,6 +1549,34 @@ http_arg_set(struct http_arg_list *list, const char *key, const char *val) ra->val = val ? strdup(val) : NULL; } +/* + * + */ +char * +http_arg_get_query(http_arg_list_t *args) +{ + htsbuf_queue_t q; + http_arg_t *ra; + char *r; + + if (http_args_empty(args)) + return NULL; + htsbuf_queue_init(&q, 0); + htsbuf_queue_init(&q, 0); + TAILQ_FOREACH(ra, args, link) { + if (!htsbuf_empty(&q)) + htsbuf_append(&q, "&", 1); + htsbuf_append_and_escape_url(&q, ra->key); + if (ra->val) { + htsbuf_append(&q, "=", 1); + htsbuf_append_and_escape_url(&q, ra->val); + } + } + r = htsbuf_to_string(&q); + htsbuf_queue_flush(&q); + return r; +} + /* * Split a string in components delimited by 'delimiter' */ diff --git a/src/http.h b/src/http.h index a35c6094a..6c66a863b 100644 --- a/src/http.h +++ b/src/http.h @@ -190,20 +190,22 @@ int http_str2cmd(const char *str); const char *http_ver2str(int val); int http_str2ver(const char *str); -static inline void http_arg_init(struct http_arg_list *list) +static inline void http_arg_init(http_arg_list_t *list) { TAILQ_INIT(list); } -void http_arg_remove(struct http_arg_list *list, struct http_arg *arg); -void http_arg_flush(struct http_arg_list *list); +void http_arg_remove(http_arg_list_t *list, struct http_arg *arg); +void http_arg_flush(http_arg_list_t *list); -char *http_arg_get(struct http_arg_list *list, const char *name); -char *http_arg_get_remove(struct http_arg_list *list, const char *name); +char *http_arg_get(http_arg_list_t *list, const char *name); +char *http_arg_get_remove(http_arg_list_t *list, const char *name); -void http_arg_set(struct http_arg_list *list, const char *key, const char *val); +void http_arg_set(http_arg_list_t *list, const char *key, const char *val); -static inline int http_args_empty(const struct http_arg_list *list) { return TAILQ_EMPTY(list); } +char *http_arg_get_query(http_arg_list_t *list); + +static inline int http_args_empty(const http_arg_list_t *list) { return TAILQ_EMPTY(list); } int http_tokenize(char *buf, char **vec, int vecsize, int delimiter); diff --git a/src/input/mpegts/iptv/iptv_auto.c b/src/input/mpegts/iptv/iptv_auto.c index 1cad3a601..004840169 100644 --- a/src/input/mpegts/iptv/iptv_auto.c +++ b/src/input/mpegts/iptv/iptv_auto.c @@ -80,7 +80,6 @@ iptv_auto_network_process_m3u_item(iptv_network_t *in, int change, epgcfg; http_arg_list_t args; http_arg_t *ra1, *ra2, *ra2_next; - htsbuf_queue_t q; size_t l; int64_t chnum2, vlcprog; const char *url, *name, *logo, *epgid, *tags; @@ -164,22 +163,7 @@ iptv_auto_network_process_m3u_item(iptv_network_t *in, http_arg_remove(&args, ra2); } free(u.query); - u.query = NULL; - if (!http_args_empty(&args)) { - htsbuf_queue_init(&q, 0); - TAILQ_FOREACH(ra1, &args, link) { - if (!htsbuf_empty(&q)) - htsbuf_append(&q, "&", 1); - htsbuf_append_and_escape_url(&q, ra1->key); - if (ra1->val) { - htsbuf_append(&q, "=", 1); - htsbuf_append_and_escape_url(&q, ra1->val); - } - } - free(u.query); - u.query = htsbuf_to_string(&q); - htsbuf_queue_flush(&q); - } + u.query = http_arg_get_query(&args); http_arg_flush(&args); if (!urlrecompose(&u)) url = u.raw;