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.
This commit is contained in:
Joris Vink 2013-08-13 14:18:47 +02:00
parent ff613f4665
commit 3075162855
5 changed files with 62 additions and 6 deletions

View File

@ -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 *);

View File

@ -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) \

View File

@ -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);

View File

@ -16,6 +16,8 @@
#include <sys/param.h>
#include <ctype.h>
#include "spdy.h"
#include "kore.h"
#include "http.h"
@ -485,20 +487,70 @@ http_argument_lookup(struct http_request *req, const char *name, char **out)
return (KORE_RESULT_ERROR);
}
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

View File

@ -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);