#include "cookie.h" #include struct cookie_write_control g_cookie_write_control; #define CWC(x) g_cookie_write_control.x void cookie_write_open(char *buffer, unsigned int buflen) { // memset(buffer, 0, buflen); CWC(buffer)= buffer; CWC(buflen)= buflen; CWC(stackpos)=0; } void cookie_write_putch(char c) { *CWC(buffer)++ = c; CWC(stackpos)++; } void cookie_write_putstr(char *str) { while(*str != '\0') cookie_write_putch(*str++); } void cookie_set(char *key, char* value) { cookie_write_putstr("Set-Cookie: "); cookie_write_putstr(key); cookie_write_putch('='); cookie_write_putstr(value); cookie_write_putstr("; path=/; SameSite=Strict\r\n"); } void cookie_close(void) { cookie_write_putch('\0'); } void cookie_parse_tokens(cookie_token_data_typDef *cookie) { if(cookie == NULL) return; uint16_t count_token = 0, pos_char = 0; for(; pos_char < cookie->len; pos_char++){ switch(cookie->data[pos_char]){ case '=': cookie->tokens[count_token].end = pos_char - 1; count_token++; cookie->tokens[count_token].start = pos_char + 1; break; case ';': cookie->tokens[count_token].end = pos_char - 1; count_token++; break; case ' ': cookie->tokens[count_token].start = pos_char + 1; break; default: if(pos_char == 0) cookie->tokens[count_token].start = pos_char; cookie->tokens[count_token].size++; break; } } cookie->tokens[count_token].end = pos_char - 1; cookie->tokenCount = count_token + 1; } void cookie_get_option(cookie_token_data_typDef *cookie, char *option, char *value) { if((cookie == NULL) || (option == NULL)) *value = NULL; for(uint16_t i = 0; i < cookie->tokenCount; i++){ if(memcmp(option, &cookie->data[cookie->tokens[i].start], cookie->tokens[i].size) == 0){ // сошлось, значит следующий токен то что нужно получить if(cookie->tokens[i + 1].size > 0) { memset(value, 0x00, strlen(value)); memcpy(value, &cookie->data[cookie->tokens[i + 1].start], cookie->tokens[i + 1].size); cookie->data[cookie->tokens[i + 1].size] = 0; } else *value = NULL;// нет значения return; } } *value = NULL; }