@@ -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+
2651static 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
6694cleanup :
6795 free (device_name );
96+ free (raw_key );
97+ free (raw_value );
6898 free (key );
6999 free (value );
70100}
0 commit comments