diff --git a/include/libwebsockets/lws-tokenize.h b/include/libwebsockets/lws-tokenize.h index 830101978..02ae66df5 100644 --- a/include/libwebsockets/lws-tokenize.h +++ b/include/libwebsockets/lws-tokenize.h @@ -43,6 +43,8 @@ #define LWS_TOKENIZE_F_HASH_COMMENT (1 << 7) /* Do not treat / as a terminal character, so "multipart/related" is one token */ #define LWS_TOKENIZE_F_SLASH_NONTERM (1 << 8) +/* Do not treat * as a terminal character, so "myfile*" is one token */ +#define LWS_TOKENIZE_F_ASTERISK_NONTERM (1 << 9) typedef enum { diff --git a/lib/core/libwebsockets.c b/lib/core/libwebsockets.c index df658a255..aabf35e7e 100644 --- a/lib/core/libwebsockets.c +++ b/lib/core/libwebsockets.c @@ -768,8 +768,8 @@ lws_tokenize(struct lws_tokenize *ts) { const char *rfc7230_delims = "(),/:;<=>?@[\\]{}"; lws_tokenize_state state = LWS_TOKZS_LEADING_WHITESPACE; - char c, flo = 0, d_minus = '-', d_dot = '.', s_minus = '\0', - s_dot = '\0', skipping = 0; + char c, flo = 0, d_minus = '-', d_dot = '.', d_star = '*', s_minus = '\0', + s_dot = '\0', s_star = '\0', skipping = 0; signed char num = (ts->flags & LWS_TOKENIZE_F_NO_INTEGERS) ? 0 : -1; int utf8 = 0; @@ -783,6 +783,10 @@ lws_tokenize(struct lws_tokenize *ts) d_dot = '\0'; s_dot = '.'; } + if (ts->flags & LWS_TOKENIZE_F_ASTERISK_NONTERM) { + d_star = '\0'; + s_star = '*'; + } ts->token = NULL; ts->token_len = 0; @@ -905,8 +909,8 @@ lws_tokenize(struct lws_tokenize *ts) ((!(ts->flags & LWS_TOKENIZE_F_RFC7230_DELIMS) && (c < '0' || c > '9') && (c < 'A' || c > 'Z') && (c < 'a' || c > 'z') && c != '_') && - c != s_minus && c != s_dot) || - c == d_minus || c == d_dot + c != s_minus && c != s_dot && c != s_star) || + c == d_minus || c == d_dot || c == d_star ) && !((ts->flags & LWS_TOKENIZE_F_SLASH_NONTERM) && c == '/')) { switch (state) {