vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Sun Dec 20 15:19:43 2015 +0200| [03b4ec183972b50f196173acab597efe1d471f8a] | committer: Rémi Denis-Courmont
https: add helpers for token parsing > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=03b4ec183972b50f196173acab597efe1d471f8a --- modules/access/http/message.c | 42 +++++++++++++++++++++++++++++++++++++---- modules/access/http/message.h | 26 +++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 4 deletions(-) diff --git a/modules/access/http/message.c b/modules/access/http/message.c index 8405d9a..f7137de 100644 --- a/modules/access/http/message.c +++ b/modules/access/http/message.c @@ -31,7 +31,6 @@ #include <time.h> #include <vlc_common.h> -#include <vlc_strings.h> #include "message.h" #include "h2frame.h" @@ -53,7 +52,7 @@ static ssize_t vlc_http_msg_find_header(const struct vlc_http_msg *m, const char *name) { for (unsigned i = 0; i < m->count; i++) - if (!vlc_ascii_strcasecmp(m->headers[i][0], name)) + if (!strcasecmp(m->headers[i][0], name)) return i; return -1; } @@ -79,10 +78,10 @@ static int vlc_http_msg_vadd_header(struct vlc_http_msg *m, const char *name, /* Fold identically named header field values. This is unfortunately not * possible for Set-Cookie, while Cookie requires a special separator. */ ssize_t idx = vlc_http_msg_find_header(m, name); - if (idx >= 0 && vlc_ascii_strcasecmp(name, "Set-Cookie")) + if (idx >= 0 && strcasecmp(name, "Set-Cookie")) { char *merged; - char sep = vlc_ascii_strcasecmp(name, "Cookie") ? ',' : ';'; + char sep = strcasecmp(name, "Cookie") ? ',' : ';'; int val = asprintf(&merged, "%s%c %s", m->headers[idx][1], sep, value); @@ -549,6 +548,41 @@ static bool vlc_http_is_token(const char *str) return len > 0 && str[len] == '\0'; } +const char *vlc_http_first_token(const char *value) +{ + return value + strspn(value, "\t "); +} + +const char *vlc_http_next_token(const char *value) +{ + value = strchr(value, ','); + if (value == NULL) + return NULL; + + return value + strspn(value, "\t ,"); +} + +const char *vlc_http_msg_get_token(const struct vlc_http_msg *msg, + const char *field, const char *token) +{ + const char *value = vlc_http_msg_get_header(msg, field); + if (value == NULL) + return NULL; + + const size_t length = strlen(token); + + for (value = vlc_http_first_token(value); + value != NULL; + value = vlc_http_next_token(value)) + { + if (vlc_http_token_length(value) == length + && !strncasecmp(token, value, length)) + return value; + } + + return NULL; +} + static size_t vlc_http_comment_length(const char *str) { /* IETF RFC7230 §3.2.6 */ if (*str != '(') diff --git a/modules/access/http/message.h b/modules/access/http/message.h index 1444b2b..7e57177 100644 --- a/modules/access/http/message.h +++ b/modules/access/http/message.h @@ -147,6 +147,32 @@ const char *vlc_http_msg_get_authority(const struct vlc_http_msg *m); const char *vlc_http_msg_get_path(const struct vlc_http_msg *m); /** + * Looks up a token in a header field. + * + * Finds the first occurence of a token within a HTTP field header. + * + * @param field HTTP header field name + * @param token HTTP token name + * @return the first byte of the token if found, NULL if not found. + */ +const char *vlc_http_msg_get_token(const struct vlc_http_msg *, + const char *field, const char *token); + +/** + * Finds first token. + * + * Finds the first token in a HTTP field value. + */ +const char *vlc_http_first_token(const char *); + +/** + * Finds next token. + * + * Finds the following token in a HTTP field value. + */ +const char *vlc_http_next_token(const char *); + +/** * Gets HTTP payload length. * * @return byte length, or (uintmax_t)-1 if unknown. _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
