forked from mirrors/kore
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:
parent
ff613f4665
commit
3075162855
|
@ -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 *);
|
||||
|
|
|
@ -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) \
|
||||
|
|
|
@ -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);
|
||||
|
|
58
src/http.c
58
src/http.c
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue