diff --git a/include/libwebsockets/lws-tokenize.h b/include/libwebsockets/lws-tokenize.h index 02ae66df5..9af6c5977 100644 --- a/include/libwebsockets/lws-tokenize.h +++ b/include/libwebsockets/lws-tokenize.h @@ -45,6 +45,8 @@ #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) +/* Do not treat = as a terminal character, so "x=y" is one token */ +#define LWS_TOKENIZE_F_EQUALS_NONTERM (1 << 10) typedef enum { diff --git a/lib/core/libwebsockets.c b/lib/core/libwebsockets.c index fef95983a..b3be8e9c0 100644 --- a/lib/core/libwebsockets.c +++ b/lib/core/libwebsockets.c @@ -773,7 +773,7 @@ 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 = '.', d_star = '*', s_minus = '\0', - s_dot = '\0', s_star = '\0', skipping = 0; + s_dot = '\0', s_star = '\0', d_eq = '=', s_eq = '\0', skipping = 0; signed char num = (ts->flags & LWS_TOKENIZE_F_NO_INTEGERS) ? 0 : -1; int utf8 = 0; @@ -791,6 +791,10 @@ lws_tokenize(struct lws_tokenize *ts) d_star = '\0'; s_star = '*'; } + if (ts->flags & LWS_TOKENIZE_F_EQUALS_NONTERM) { + d_eq = '\0'; + s_eq = '='; + } ts->token = NULL; ts->token_len = 0; @@ -864,7 +868,8 @@ lws_tokenize(struct lws_tokenize *ts) /* token= aggregation */ - if (c == '=' && (state == LWS_TOKZS_TOKEN_POST_TERMINAL || + if (!(ts->flags & LWS_TOKENIZE_F_EQUALS_NONTERM) && + c == '=' && (state == LWS_TOKZS_TOKEN_POST_TERMINAL || state == LWS_TOKZS_TOKEN)) { if (num == 1) return LWS_TOKZE_ERR_NUM_ON_LHS; @@ -913,8 +918,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 != s_star) || - c == d_minus || c == d_dot || c == d_star + c != s_minus && c != s_dot && c != s_star && c != s_eq) || + c == d_minus || c == d_dot || c == d_star || c == d_eq ) && !((ts->flags & LWS_TOKENIZE_F_SLASH_NONTERM) && c == '/')) { switch (state) {