eco2d/code/vendors/flecs/flecs_components_http.c

95 lines
2.1 KiB
C

#ifndef FLECS_COMPONENTS_HTTP_IMPL
#include "flecs_components_http.h"
#endif
static
void decode(
char *str)
{
char ch, *ptr, *dst = str;
for (ptr = str; (ch = *ptr); ptr++) {
if (ch == '%') {
if (ptr[1] == '2' && ptr[2] == '0') {
dst[0] = ' ';
dst ++;
ptr += 2;
}
} else {
dst[0] = ptr[0];
dst ++;
}
}
dst[0] = '\0';
}
size_t ecs_http_get_query_param(
const char *query,
const char *name,
char *buffer,
size_t len)
{
if (!query) {
return 0;
}
const char *cur, *start = query, *value = NULL;
char ch;
int arg_len = strlen(name);
for (cur = query; (ch = *cur); cur ++) {
if (ch == '=') {
if (cur - start >= 256) {
/* Ignore, key is too long */
} else {
int32_t key_len = cur - start;
cur ++;
value = cur;
while ((ch = *cur) && ch != '&') {
cur ++;
}
if (!ch || ch == '&') {
/* Check if requested key matches */
if (arg_len == key_len && !strncmp(name, start, key_len)) {
size_t size;
if (cur - value < (int32_t)len) {
size = cur - value;
} else {
size = len - 1;
}
memcpy(buffer, value, size);
buffer[size] = '\0';
decode(buffer);
return cur - value;
}
}
start = cur + 1;
}
}
}
return 0;
}
void FlecsComponentsHttpImport(
ecs_world_t *world)
{
ECS_MODULE(world, FlecsComponentsHttp);
ECS_IMPORT(world, FlecsMeta);
ecs_set_name_prefix(world, "EcsHttp");
ECS_META(world, EcsHttpServer);
ECS_META(world, EcsHttpEndpoint);
ECS_SET_COMPONENT(EcsHttpServer);
ECS_SET_COMPONENT(EcsHttpEndpoint);
}