clean up
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user