Reorganize code

This commit is contained in:
2024-10-05 20:55:35 +02:00
parent 85b57e9cb8
commit e8c8acf8c4
2 changed files with 95 additions and 86 deletions
+94 -85
View File
@@ -394,6 +394,11 @@ int match_path_format(string path, char *fmt, ...);
bool get_query_string_param(string str, string key, string dst, string *out);
bool get_cookie(Request *request, string name, string *out);
SessionID create_session(string name);
void remove_session(SessionID id);
string name_from_session(SessionID id);
SessionID session_from_request(Request request);
///////////////////////////////////////////////////////////////////////////////////////////////
/// GLOBALS ///
///////////////////////////////////////////////////////////////////////////////////////////////
@@ -686,91 +691,6 @@ void free_globals(void)
/// RESPONSE CALLBACK ///
///////////////////////////////////////////////////////////////////////////////////////////////
SessionID create_session(string name)
{
int i = 0;
while (i < MAX_SESSIONS && sessions[i].id != NO_SESSION)
i++;
if (i == MAX_SESSIONS)
return NO_SESSION;
if (next_session_id == NO_SESSION)
next_session_id++;
SessionID id = next_session_id++;
if (name.size > sizeof(sessions[i].namebuf))
log_fatal(LIT("User name buffer is too small"));
memcpy(sessions[i].namebuf, name.data, name.size);
sessions[i].id = id;
sessions[i].name = (string) { sessions[i].namebuf, name.size };
return sessions[i].id;
}
void remove_session(SessionID id)
{
assert(id != NO_SESSION);
int i = 0;
while (i < MAX_SESSIONS && sessions[i].id != id)
i++;
if (i == MAX_SESSIONS)
log_fatal(LIT("Trying to remove non existing session"));
sessions[i].id = NO_SESSION;
sessions[i].name = NULLSTR;
memset(sessions[i].namebuf, 0, sizeof(sessions[i].namebuf));
}
string name_from_session(SessionID id)
{
assert(id != NO_SESSION);
for (int i = 0; i < MAX_SESSIONS; i++)
if (sessions[i].id == id)
return sessions[i].name;
return NULLSTR;
}
SessionID session_from_request(Request request)
{
string sessid_str;
if (!get_cookie(&request, LIT("sessid"), &sessid_str))
return NO_SESSION;
SessionID id;
{
char *src = sessid_str.data;
size_t len = sessid_str.size;
size_t i = 0;
while (i < len && is_space(src[i]))
i++;
if (i == len || !is_digit(src[i]))
return NO_SESSION;
uint32_t buf = 0;
do {
int d = src[i] - '0';
if (buf > (UINT32_MAX - d) / 10)
return NO_SESSION;
buf = buf * 10 + d;
i++;
} while (i < len && is_digit(src[i]));
while (i < len && is_space(src[i]))
i++;
if (i < len)
return NO_SESSION;
assert(sizeof(buf) == sizeof(SessionID));
assert(buf != 0 && buf != NO_SESSION);
id = buf;
}
return id;
}
void respond(Request request, ResponseBuilder *b)
{
if (request.major != 1 || request.minor > 1) {
@@ -1074,6 +994,95 @@ void respond(Request request, ResponseBuilder *b)
append_content_s(b, LIT("Nothing here :|"));
}
///////////////////////////////////////////////////////////////////////////////////////////////
/// SESSIONS ///
///////////////////////////////////////////////////////////////////////////////////////////////
SessionID create_session(string name)
{
int i = 0;
while (i < MAX_SESSIONS && sessions[i].id != NO_SESSION)
i++;
if (i == MAX_SESSIONS)
return NO_SESSION;
if (next_session_id == NO_SESSION)
next_session_id++;
SessionID id = next_session_id++;
if (name.size > sizeof(sessions[i].namebuf))
log_fatal(LIT("User name buffer is too small"));
memcpy(sessions[i].namebuf, name.data, name.size);
sessions[i].id = id;
sessions[i].name = (string) { sessions[i].namebuf, name.size };
return sessions[i].id;
}
void remove_session(SessionID id)
{
assert(id != NO_SESSION);
int i = 0;
while (i < MAX_SESSIONS && sessions[i].id != id)
i++;
if (i == MAX_SESSIONS)
log_fatal(LIT("Trying to remove non existing session"));
sessions[i].id = NO_SESSION;
sessions[i].name = NULLSTR;
memset(sessions[i].namebuf, 0, sizeof(sessions[i].namebuf));
}
string name_from_session(SessionID id)
{
assert(id != NO_SESSION);
for (int i = 0; i < MAX_SESSIONS; i++)
if (sessions[i].id == id)
return sessions[i].name;
return NULLSTR;
}
SessionID session_from_request(Request request)
{
string sessid_str;
if (!get_cookie(&request, LIT("sessid"), &sessid_str))
return NO_SESSION;
SessionID id;
{
char *src = sessid_str.data;
size_t len = sessid_str.size;
size_t i = 0;
while (i < len && is_space(src[i]))
i++;
if (i == len || !is_digit(src[i]))
return NO_SESSION;
uint32_t buf = 0;
do {
int d = src[i] - '0';
if (buf > (UINT32_MAX - d) / 10)
return NO_SESSION;
buf = buf * 10 + d;
i++;
} while (i < len && is_digit(src[i]));
while (i < len && is_space(src[i]))
i++;
if (i < len)
return NO_SESSION;
assert(sizeof(buf) == sizeof(SessionID));
assert(buf != 0 && buf != NO_SESSION);
id = buf;
}
return id;
}
///////////////////////////////////////////////////////////////////////////////////////////////
/// REQUEST PARSER ///
///////////////////////////////////////////////////////////////////////////////////////////////