This commit is contained in:
2026-09-12 03:40:10 +02:00
parent 029ceee69a
commit 8ac465229c
20 changed files with 220 additions and 422 deletions

View File

@@ -154,42 +154,49 @@ static void send_json(httpd_req_t *req, int status, const char *body)
static char *url_decode(const char *src)
{
if (src == NULL) {
return NULL;
}
size_t len = strlen(src);
if (len > HTTPD_BODY_MAX - 1) {
len = HTTPD_BODY_MAX - 1;
}
char *out = malloc(len + 1);
if (out == NULL) {
return NULL;
}
size_t o = 0;
for (size_t i = 0; i < len && src[i] != '\0'; i++) {
if (src[i] == '%' && i + 2 < len) {
int hi = src[i + 1] >= 'a' ? src[i + 1] - 'a' + 10
: src[i + 1] >= 'A' ? src[i + 1] - 'A' + 10
: src[i + 1] - '0';
int lo = src[i + 2] >= 'a' ? src[i + 2] - 'a' + 10
: src[i + 2] >= 'A' ? src[i + 2] - 'A' + 10
: src[i + 2] - '0';
if (hi < 0 || hi > 15 || lo < 0 || lo > 15) {
free(out);
return NULL;
}
out[o++] = (char)((hi << 4) | lo);
i += 2;
} else if (src[i] == '+') {
out[o++] = ' ';
if (!src) return NULL;
char *out = strdup(src);
if (!out) return NULL;
char *dst = out;
for (const char *s = src; *s; s++) {
if (*s == '%' && s[1] && s[2]) {
char hex[3] = { s[1], s[2], '\0' };
*dst++ = (char)strtol(hex, NULL, 16);
s += 2;
} else if (*s == '+') {
*dst++ = ' ';
} else {
out[o++] = src[i];
*dst++ = *s;
}
}
out[o] = '\0';
*dst = '\0';
return out;
}
static char *get_form_param(const char *form, const char *key)
{
if (!form || !key) return NULL;
size_t klen = strlen(key);
const char *p = form;
while (p && *p) {
if (strncmp(p, key, klen) == 0 && p[klen] == '=') {
const char *val_start = p + klen + 1;
const char *val_end = strchr(val_start, '&');
size_t vlen = val_end ? (size_t)(val_end - val_start) : strlen(val_start);
char *raw = malloc(vlen + 1);
if (!raw) return NULL;
memcpy(raw, val_start, vlen);
raw[vlen] = '\0';
char *dec = url_decode(raw);
free(raw);
return dec;
}
p = strchr(p, '&');
if (p) p++;
}
return NULL;
}
/* ------------------------------------------------------------------ */
/* Endpoints */
/* ------------------------------------------------------------------ */
@@ -234,22 +241,8 @@ static esp_err_t handle_bind(httpd_req_t *req)
}
form[got] = '\0';
char *uid = NULL;
char *name = NULL;
char *u = strstr(form, "uid=");
char *n = strstr(form, "name=");
if (u) {
char *end = strchr(u, '&');
if (end) *end = '\0';
uid = url_decode(u + 4);
if (end) *end = '&';
}
if (n) {
char *end = strchr(n, '&');
if (end) *end = '\0';
name = url_decode(n + 5);
if (end) *end = '&';
}
char *uid = get_form_param(form, "uid");
char *name = get_form_param(form, "name");
free(form);
if (uid) {
@@ -355,14 +348,7 @@ static esp_err_t handle_unbind(httpd_req_t *req)
}
form[got] = '\0';
char *uid = NULL;
char *u = strstr(form, "uid=");
if (u) {
char *end = strchr(u, '&');
if (end) *end = '\0';
uid = url_decode(u + 4);
if (end) *end = '&';
}
char *uid = get_form_param(form, "uid");
free(form);
if (uid) {