aboutsummaryrefslogtreecommitdiff
path: root/src/cookies.c
diff options
context:
space:
mode:
authorAleksey Veresov <aleksey@veresov.pro>2020-03-11 17:54:19 +0300
committerAleksey Veresov <aleksey@veresov.pro>2020-03-11 17:54:19 +0300
commit8f1e6faa7f548c9a8bcbcac71c8f239a6540b926 (patch)
treedd5dfec60de8e52472fe8db2b5ae66010d5dc1d3 /src/cookies.c
parent5cfe6cdf6af2d630d21871f9193fc1b4a7db24ff (diff)
downloadmagi-8f1e6faa7f548c9a8bcbcac71c8f239a6540b926.tar
magi-8f1e6faa7f548c9a8bcbcac71c8f239a6540b926.tar.xz
magi-8f1e6faa7f548c9a8bcbcac71c8f239a6540b926.zip
[magi]
Diffstat (limited to 'src/cookies.c')
-rw-r--r--src/cookies.c171
1 files changed, 68 insertions, 103 deletions
diff --git a/src/cookies.c b/src/cookies.c
index 8b610d4..7e8248b 100644
--- a/src/cookies.c
+++ b/src/cookies.c
@@ -6,7 +6,7 @@
#include <string.h>
-enum st {
+typedef enum st {
st_error = 0,
st_pre_name,
st_name,
@@ -14,24 +14,24 @@ enum st {
st_pre_data,
st_data,
st_post_data
-};
+} st;
-enum data_type { dt_plain = 0, dt_version, dt_path, dt_domain };
+typedef enum dt { dt_plain = 0, dt_version, dt_path, dt_domain } dt;
-struct automata {
- struct magi_cookie_list ** list;
- struct magi_cookie cookie;
- char * buf;
- int buf_len;
- int buf_size;
- int is_first;
- int is_advanced;
- int is_quoted;
- enum data_type data_t;
-};
+typedef struct automata {
+ magi_cookies **list;
+ magi_cookie cookie;
+ char *buf;
+ int buf_len;
+ int buf_size;
+ int is_first;
+ int is_advanced;
+ int is_quoted;
+ dt datatype;
+} automata;
-static void nulify_cookie(struct automata * a)
+static void nulify_cookie(automata *a)
{
a->cookie.name = 0;
a->cookie.data = 0;
@@ -40,7 +40,7 @@ static void nulify_cookie(struct automata * a)
a->cookie.max_age = 0;
}
-static void buf_new(struct automata * a)
+static void buf_new(automata *a)
{
a->buf = 0;
a->buf_len = 0;
@@ -48,29 +48,28 @@ static void buf_new(struct automata * a)
}
-static enum data_type what_is_name(const struct automata * a)
+static dt what_is_name(const automata *a)
{
- enum data_type data_t = dt_plain;
+ dt datatype = dt_plain;
if (a->is_first && !strcmp(a->buf, "$Version")) {
- data_t = dt_version;
+ datatype = dt_version;
} else if (a->is_advanced) {
if (!strcmp(a->buf, "$Path")) {
- data_t = dt_path;
+ datatype = dt_path;
} else if (!strcmp(a->buf, "$Domain")) {
- data_t = dt_domain;
+ datatype = dt_domain;
}
}
- return data_t;
+ return datatype;
}
-static int end_name(struct automata * a)
+static void end_name(automata *a)
{
- int ok = 1;
- a->data_t = what_is_name(a);
- if (a->data_t == dt_plain) {
+ a->datatype = what_is_name(a);
+ if (a->datatype == dt_plain) {
if (a->cookie.name) {
- ok = magi_cookie_list_add(a->list, &a->cookie);
+ magi_cookies_add(a->list, &a->cookie);
}
nulify_cookie(a);
a->cookie.name = a->buf;
@@ -78,75 +77,56 @@ static int end_name(struct automata * a)
free(a->buf);
}
buf_new(a);
- return ok;
}
-static int end_data(struct automata * a)
+static int end_data(automata *a)
{
- int ok = 1;
- switch (a->data_t) {
- case dt_plain:
- a->cookie.data = a->buf;
- break;
- case dt_path:
- a->cookie.path = a->buf;
- break;
- case dt_domain:
- a->cookie.domain = a->buf;
- break;
- case dt_version:
- if (strcmp(a->buf, "1")) {
- ok = 0;
- }
+ switch (a->datatype) {
+ case dt_plain: a->cookie.data = a->buf; break;
+ case dt_path: a->cookie.path = a->buf; break;
+ case dt_domain: a->cookie.domain = a->buf; break;
+ case dt_version: if (strcmp(a->buf, "1")) { return 0; }
}
buf_new(a);
- return ok;
+ return 1;
}
-static enum st parse_pre_name(struct automata * a, char c)
+static st parse_pre_name(automata *a, char c)
{
- enum st state;
+ st state;
if (c == ' ' || c == '\t') {
state = st_name;
} else if (32 <= c && c <= 126 && !strchr("()<>@,;:\\\"/[]?={}", c)) {
state = st_name;
- if (!magi_str_add(&a->buf, &a->buf_len, &a->buf_size, c)) {
- state = st_error;
- }
+ magi_str_add(&a->buf, &a->buf_len, &a->buf_size, c);
} else {
state = st_error;
}
return state;
}
-static enum st parse_name(struct automata * a, char c)
+static st parse_name(automata *a, char c)
{
- enum st state;
+ st state;
if (c == '=') {
state = st_pre_data;
- if (!end_name(a)) {
- state = st_error;
- }
+ end_name(a);
} else if (c == ' ' || c == '\t') {
state = st_post_name;
- if (!end_name(a)) {
- state = st_error;
- }
+ end_name(a);
} else if (32 <= c && c <= 126 && !strchr("()<>@,;:\\\"/[]?={}", c)) {
state = st_name;
- if (!magi_str_add(&a->buf, &a->buf_len, &a->buf_size, c)) {
- state = st_error;
- }
+ magi_str_add(&a->buf, &a->buf_len, &a->buf_size, c);
} else {
state = st_error;
}
return state;
}
-static enum st parse_post_name(struct automata * a, char c)
+static st parse_post_name(automata *a, char c)
{
- enum st state;
+ st state;
if (c == '=') {
state = st_pre_data;
} else if (c == ' ' || c == '\t') {
@@ -157,9 +137,9 @@ static enum st parse_post_name(struct automata * a, char c)
return state;
}
-static enum st parse_pre_data(struct automata * a, char c)
+static st parse_pre_data(automata *a, char c)
{
- enum st state;
+ st state;
if (c == ' ' || c == '\t') {
state = st_pre_data;
} else if (c == '"') {
@@ -167,18 +147,16 @@ static enum st parse_pre_data(struct automata * a, char c)
a->is_quoted = 1;
} else if (32 <= c && c <= 126 && !strchr("()<>@,;:\\\"/[]?={}", c)) {
state = st_data;
- if (!magi_str_add(&a->buf, &a->buf_len, &a->buf_size, c)) {
- state = st_error;
- }
+ magi_str_add(&a->buf, &a->buf_len, &a->buf_size, c);
} else {
state = st_error;
}
return state;
}
-static enum st parse_not_quoted_data(struct automata * a, char c)
+static st parse_not_quoted_data(automata *a, char c)
{
- enum st state;
+ st state;
if (c == ';' || (c == ',' && a->is_first)) {
state = st_pre_name;
a->is_first = 0;
@@ -192,18 +170,16 @@ static enum st parse_not_quoted_data(struct automata * a, char c)
}
} else if (32 <= c && c <= 126 && !strchr("()<>@,;:\\\"/[]?={}", c)) {
state = st_data;
- if (!magi_str_add(&a->buf, &a->buf_len, &a->buf_size, c)) {
- state = st_error;
- }
+ magi_str_add(&a->buf, &a->buf_len, &a->buf_size, c);
} else {
state = st_error;
}
return state;
}
-static enum st parse_data(struct automata * a, char c)
+static st parse_data(automata *a, char c)
{
- enum st state;
+ st state;
if (a->is_quoted) {
if (c == '"') {
state = st_post_data;
@@ -220,9 +196,9 @@ static enum st parse_data(struct automata * a, char c)
return state;
}
-static enum st parse_post_data(struct automata * a, char c)
+static st parse_post_data(automata *a, char c)
{
- enum st state;
+ st state;
if (c == ';' || (c == ',' && a->is_first)) {
state = st_pre_name;
} else if (c == ' ' || c == '\t') {
@@ -234,14 +210,15 @@ static enum st parse_post_data(struct automata * a, char c)
}
-static void parse_end(enum magi_error * e, struct automata * a, enum st s)
+static void parse_end(magi_error *e, automata *a, st s)
{
if (s == st_data) {
if (a->is_quoted || !a->cookie.name) {
*e = magi_error_cookies;
return;
}
- if (end_data(a) && magi_cookie_list_add(a->list, &a->cookie)) {
+ if (end_data(a)) {
+ magi_cookies_add(a->list, &a->cookie);
nulify_cookie(a);
} else {
*e = magi_error_cookies;
@@ -252,33 +229,21 @@ static void parse_end(enum magi_error * e, struct automata * a, enum st s)
}
-void magi_cookies(struct magi_request * request, const char * data)
+void magi_parse_cookies(magi_request *request, const char *data)
{
- enum st state;
- struct automata a = { 0, { 0, 0, 0, 0, 0 }, 0, 0, 1, 1, 0, 0, 0 };
- a.list = &request->cookies;
- request->cookies = 0;
+ st state;
+ automata a = { 0, { 0, 0, 0, 0, 0 }, 0, 0, 0, 1, 0, 0, 0 };
+ a.list = &request->cookies;
+ request->cookies = 0;
for (state = st_pre_name; state && *data; ++data) {
switch (state) {
- case st_pre_name:
- state = parse_pre_name(&a, *data);
- break;
- case st_name:
- state = parse_name(&a, *data);
- break;
- case st_post_name:
- state = parse_post_name(&a, *data);
- break;
- case st_pre_data:
- state = parse_pre_data(&a, *data);
- break;
- case st_data:
- state = parse_data(&a, *data);
- break;
- case st_post_data:
- state = parse_post_data(&a, *data);
- default:
- break;
+ case st_pre_name: state = parse_pre_name(&a, *data); break;
+ case st_name: state = parse_name(&a, *data); break;
+ case st_post_name: state = parse_post_name(&a, *data); break;
+ case st_pre_data: state = parse_pre_data(&a, *data); break;
+ case st_data: state = parse_data(&a, *data); break;
+ case st_post_data: state = parse_post_data(&a, *data); break;
+ default: break;
}
}
parse_end(&request->error, &a, state);