kore

An easy to use, scalable and secure web application framework for writing web APIs in C.
Commits | Files | Refs | README | LICENSE | git clone https://git.kore.io/kore.git

commit 3075162855d6428533550e29406942795dd704a0
parent ff613f4665eda3a498a23493e75d2cacad02f5c6
Author: Joris Vink <joris@coders.se>
Date:   Tue, 13 Aug 2013 14:18:47 +0200

Add http_argument_urldecode() which takes a string and decodes any url encoding done to it.

Change kore_strtonum() to pass 0 to strtoll by default so we can use it to convert hex numbers (prepended with 0x) as well.

Diffstat:
includes/http.h | 3++-
includes/kore.h | 2++
src/buf.c | 3++-
src/http.c | 58+++++++++++++++++++++++++++++++++++++++++++++++++++++++---
src/utils.c | 2+-
5 files changed, 62 insertions(+), 6 deletions(-)

diff --git a/includes/http.h b/includes/http.h @@ -75,8 +75,9 @@ void http_response_header_add(struct http_request *, char *, char *); int http_request_new(struct connection *, struct spdy_stream *, char *, char *, char *, struct http_request **); -int http_generic_404(struct http_request *); +int http_argument_urldecode(char *); int http_header_recv(struct netbuf *); +int http_generic_404(struct http_request *); char *http_post_data_text(struct http_request *); int http_populate_arguments(struct http_request *); void http_argument_multiple_free(struct http_arg *); diff --git a/includes/kore.h b/includes/kore.h @@ -48,6 +48,8 @@ #define KORE_PIDFILE_DEFAULT "/var/run/kore.pid" #define KORE_DEFAULT_CIPHER_LIST "HIGH:!aNULL:!MD5;" +#define KORE_DEBUG 1 + #if defined(KORE_DEBUG) #define kore_debug(fmt, ...) \ if (kore_debug) \ diff --git a/src/buf.c b/src/buf.c @@ -121,7 +121,8 @@ kore_buf_replace_string(struct kore_buf *b, const char *src, tmp = kore_malloc(nlen); memcpy(tmp, p, off); - memcpy((tmp + off), dst, len); + if (dst != NULL) + memcpy((tmp + off), dst, len); memcpy((tmp + off + len), end, off2); kore_mem_free(b->data); diff --git a/src/http.c b/src/http.c @@ -16,6 +16,8 @@ #include <sys/param.h> +#include <ctype.h> + #include "spdy.h" #include "kore.h" #include "http.h" @@ -486,19 +488,69 @@ http_argument_lookup(struct http_request *req, const char *name, char **out) } int +http_argument_urldecode(char *arg) +{ + u_int8_t v; + int err; + size_t len; + char *p, *in, h[5]; + + p = arg; + in = arg; + len = strlen(arg); + + while (*p != '\0' && p < (arg + len)) { + if (*p == '+') + *p = ' '; + if (*p != '%') { + *in++ = *p++; + continue; + } + + if ((p + 2) >= (arg + len)) { + kore_debug("overflow in '%s'", arg); + return (KORE_RESULT_ERROR); + } + + if (!isxdigit(*(p + 1)) || !isxdigit(*(p + 2))) { + *in++ = *p++; + continue; + } + + h[0] = '0'; + h[1] = 'x'; + h[2] = *(p + 1); + h[3] = *(p + 2); + h[4] = '\0'; + + v = kore_strtonum(h, 32, 127, &err); + if (err != KORE_RESULT_OK) + return (err); + + *in++ = (char)v; + p += 3; + } + + *in = '\0'; + return (KORE_RESULT_OK); +} + +int http_argument_multiple_lookup(struct http_request *req, struct http_arg *args) { - int i; + int i, c; + c = 0; for (i = 0; args[i].name != NULL; i++) { if (!http_argument_lookup(req, args[i].name, &(args[i].value))) { args[i].value = NULL; - return (i); + } else { + c++; } } - return (i); + return (c); } void diff --git a/src/utils.c b/src/utils.c @@ -99,7 +99,7 @@ kore_strtonum(const char *str, long long min, long long max, int *err) l = 0; errno = 0; - l = strtoll(str, &ep, 10); + l = strtoll(str, &ep, 0); if (errno != 0 || str == ep || *ep != '\0') { *err = KORE_RESULT_ERROR; return (0);