Skip to content

Commit f5024da

Browse files
committed
Decode POST parameters before applying options.
Fixes #115
1 parent 60aa207 commit f5024da

File tree

2 files changed

+32
-2
lines changed

2 files changed

+32
-2
lines changed

cmd/camera-streamer/http.c

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,38 @@ static void http_once(FILE *stream, void (*fn)(FILE *stream, const char *data),
2323
}
2424
}
2525

26+
// Helper function to decode percent-encoded strings
27+
char *url_decode(const char *str) {
28+
if (!str) return NULL;
29+
30+
size_t len = strlen(str);
31+
char *decoded = malloc(len + 1);
32+
if (!decoded) return NULL;
33+
34+
char *p = decoded;
35+
for (size_t i = 0; i < len; i++) {
36+
if (str[i] == '%' && i + 2 < len && isxdigit(str[i + 1]) && isxdigit(str[i + 2])) {
37+
char hex[3] = {str[i + 1], str[i + 2], '\0'};
38+
*p++ = (char)strtol(hex, NULL, 16);
39+
i += 2;
40+
} else if (str[i] == '+') {
41+
*p++ = ' ';
42+
} else {
43+
*p++ = str[i];
44+
}
45+
}
46+
*p = '\0';
47+
return decoded;
48+
}
49+
2650
static void camera_post_option(http_worker_t *worker, FILE *stream)
2751
{
2852
char *device_name = http_get_param(worker, "device");
29-
char *key = http_get_param(worker, "key");
30-
char *value = http_get_param(worker, "value");
53+
char *raw_key = http_get_param(worker, "key");
54+
char *raw_value = http_get_param(worker, "value");
55+
56+
char *key = url_decode(raw_key);
57+
char *value = url_decode(raw_value);
3158

3259
if (!key || !value) {
3360
http_400(stream, "");
@@ -65,6 +92,8 @@ static void camera_post_option(http_worker_t *worker, FILE *stream)
6592

6693
cleanup:
6794
free(device_name);
95+
free(raw_key);
96+
free(raw_value);
6897
free(key);
6998
free(value);
7099
}

util/http/http.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include <stdio.h>
55
#include <stdlib.h>
66
#include <string.h>
7+
#include <ctype.h>
78
#include <pthread.h>
89
#include <netinet/ip.h>
910

0 commit comments

Comments
 (0)