Skip to content

Commit 1856a4c

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

File tree

2 files changed

+33
-2
lines changed

2 files changed

+33
-2
lines changed

cmd/camera-streamer/http.c

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,39 @@ 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+
{
29+
if (!str) return NULL;
30+
31+
size_t len = strlen(str);
32+
char *decoded = malloc(len + 1);
33+
if (!decoded) return NULL;
34+
35+
char *p = decoded;
36+
for (size_t i = 0; i < len; i++) {
37+
if (str[i] == '%' && i + 2 < len && isxdigit(str[i + 1]) && isxdigit(str[i + 2])) {
38+
char hex[3] = {str[i + 1], str[i + 2], '\0'};
39+
*p++ = (char)strtol(hex, NULL, 16);
40+
i += 2;
41+
} else if (str[i] == '+') {
42+
*p++ = ' ';
43+
} else {
44+
*p++ = str[i];
45+
}
46+
}
47+
*p = '\0';
48+
return decoded;
49+
}
50+
2651
static void camera_post_option(http_worker_t *worker, FILE *stream)
2752
{
2853
char *device_name = http_get_param(worker, "device");
29-
char *key = http_get_param(worker, "key");
30-
char *value = http_get_param(worker, "value");
54+
char *raw_key = http_get_param(worker, "key");
55+
char *raw_value = http_get_param(worker, "value");
56+
57+
char *key = url_decode(raw_key);
58+
char *value = url_decode(raw_value);
3159

3260
if (!key || !value) {
3361
http_400(stream, "");
@@ -65,6 +93,8 @@ static void camera_post_option(http_worker_t *worker, FILE *stream)
6593

6694
cleanup:
6795
free(device_name);
96+
free(raw_key);
97+
free(raw_value);
6898
free(key);
6999
free(value);
70100
}

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)