@@ -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+
2650static 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
6693cleanup :
6794 free (device_name );
95+ free (raw_key );
96+ free (raw_value );
6897 free (key );
6998 free (value );
7099}
0 commit comments