95 lines
2.1 KiB
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);
|
||
|
}
|