1
0
Fork 0
mirror of https://github.com/warmcat/libwebsockets.git synced 2025-03-09 00:00:04 +01:00

tokenize: add option for equals as non-delimiter

We may want to handle "x=y" as one token string, to be
passed up to something else to parse.
This commit is contained in:
Andy Green 2021-03-10 10:52:08 +00:00
parent 84565adf72
commit 0775a0d0f1
2 changed files with 11 additions and 4 deletions

View file

@ -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 {

View file

@ -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) {