diff --git a/src/Http.c b/src/Http.c index 4b9db64..6e69357 100644 --- a/src/Http.c +++ b/src/Http.c @@ -27,6 +27,9 @@ #include #include +#include +#include + const char * HttpRequestMethodToString(const HttpRequestMethod method) { @@ -226,7 +229,7 @@ HttpUrlEncode(char *str) return NULL; } - size = 16; + size = TELODENDRIA_STRING_CHUNK; len = 0; encoded = malloc(size); if (!encoded) @@ -242,7 +245,7 @@ HttpUrlEncode(char *str) { char *tmp; - size *= 2; + size += TELODENDRIA_STRING_CHUNK; tmp = realloc(encoded, size); if (!tmp) { @@ -360,3 +363,87 @@ HttpUrlDecode(char *str) return decoded; } + +HashMap * +HttpParamDecode(char *str) +{ + HashMap *decoded; + + if (!str) + { + return NULL; + } + + decoded = HashMapCreate(); + if (!decoded) + { + return NULL; + } + + while (*str) + { + char *key; + char *val; + char *decVal; + + decVal = HttpParamDecode(val); + if (!decVal) + { + /* Memory error */ + } + + free(val); + str++; + } + + return decoded; +} + +char * +HttpParamEncode(HashMap *params) +{ + char *key; + char *val; + + size_t len; + size_t size = TELODENDRIA_STRING_CHUNK; + char *encoded; + + if (!params) + { + return NULL; + } + + len = 0; + encoded = malloc(size); + + if (!encoded) + { + return NULL; + } + + while (HashMapIterate(params, &key, (void *) &val)) + { + /* Print key */ + + /* Print = */ + + /* Print encoded value */ + + char *encVal = HttpParamEncode(val); + if (!encVal) + { + /* Memory error */ + free(encoded); + return NULL; + } + + free(encVal); + + /* Print & */ + } + + /* Overwrite last & */ + + return encoded; +} diff --git a/src/include/Http.h b/src/include/Http.h index 5a6a607..f093cf1 100644 --- a/src/include/Http.h +++ b/src/include/Http.h @@ -24,6 +24,8 @@ #ifndef TELODENDRIA_HTTP_H #define TELODENDRIA_HTTP_H +#include + typedef enum HttpRequestMethod { HTTP_METHOD_UNKNOWN, @@ -115,4 +117,10 @@ extern char * extern char * HttpUrlDecode(char *); +extern HashMap * + HttpParamDecode(char *); + +extern char * + HttpParamEncode(HashMap *); + #endif