vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Wed Dec 23 00:33:21 2015 +0200| [a9f3ddf463773c92e3c2541114317d66d6fbfdd3] | committer: Rémi Denis-Courmont
https: improve header field list iteration > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=a9f3ddf463773c92e3c2541114317d66d6fbfdd3 --- modules/access/http/message.c | 48 +++++++++++++++++++++++++++++------------ modules/access/http/message.h | 7 ------ 2 files changed, 34 insertions(+), 21 deletions(-) diff --git a/modules/access/http/message.c b/modules/access/http/message.c index d6ba97d..5de60d4 100644 --- a/modules/access/http/message.c +++ b/modules/access/http/message.c @@ -552,23 +552,46 @@ static size_t vlc_http_token_length(const char *str) return i; } -static bool vlc_http_is_token(const char *str) +static size_t vlc_http_quoted_length(const char *str) { - size_t len = vlc_http_token_length(str); - return len > 0 && str[len] == '\0'; + size_t i = 0; + unsigned char c; + + if (str[i++] != '"') + return 0; + + do + { + c = str[i++]; + + if (c == '\0') + return 0; + + if (c == '\\') /* Quoted pair */ + { + unsigned char q = str[i++]; + if (q < 32 && q != '\t') + return 0; + } + } + while (c != '"'); + + return i; } -const char *vlc_http_first_token(const char *value) +static bool vlc_http_is_token(const char *str) { - return value + strspn(value, "\t "); + size_t len = vlc_http_token_length(str); + return len > 0 && str[len] == '\0'; } const char *vlc_http_next_token(const char *value) -{ - value = strchr(value, ','); - if (value == NULL) +{ /* We handle either token or token = token / quoted-string */ + value += strcspn(value, ",\""); + if (!*value) return NULL; + value += vlc_http_quoted_length(value); return value + strspn(value, "\t ,"); } @@ -576,18 +599,15 @@ 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)) + while (value != NULL) { if (vlc_http_token_length(value) == length && !strncasecmp(token, value, length)) return value; + + value = vlc_http_next_token(value); } return NULL; diff --git a/modules/access/http/message.h b/modules/access/http/message.h index 6e19a91..ebfc8aa 100644 --- a/modules/access/http/message.h +++ b/modules/access/http/message.h @@ -166,13 +166,6 @@ 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. _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
