commit 45adae62f7e946eb9fc294a5487ed3599f4cbef7
parent 61b937ac1b0b89a3bd7de5d29ea41abb9047d284
Author: Joris Vink <joris@coders.se>
Date: Sat, 4 May 2013 19:09:07 +0200
q->value should be set to NULL if a query parameter is present but no value was set for it.
introduce kore_buf_appendv() (much like readv()).
introduce kore_buf_appendf() (printf into buffers).
Diffstat:
3 files changed, 42 insertions(+), 3 deletions(-)
diff --git a/includes/kore.h b/includes/kore.h
@@ -108,6 +108,11 @@ struct kore_buf {
u_int32_t offset;
};
+struct buf_vec {
+ u_int8_t *data;
+ u_int32_t length;
+};
+
extern int server_port;
extern char *server_ip;
@@ -151,6 +156,8 @@ void net_send_queue(struct connection *, u_int8_t *, size_t, int,
struct kore_buf *kore_buf_create(u_int32_t);
void kore_buf_append(struct kore_buf *, u_int8_t *, u_int32_t);
u_int8_t *kore_buf_release(struct kore_buf *, u_int32_t *);
+void kore_buf_appendf(struct kore_buf *, const char *, ...);
+void kore_buf_appendv(struct kore_buf *, struct buf_vec *, u_int16_t);
struct spdy_header_block *spdy_header_block_create(int);
struct spdy_stream *spdy_stream_lookup(struct connection *, u_int32_t);
diff --git a/src/buf.c b/src/buf.c
@@ -62,6 +62,32 @@ kore_buf_append(struct kore_buf *buf, u_int8_t *d, u_int32_t len)
buf->offset += len;
}
+void
+kore_buf_appendv(struct kore_buf *buf, struct buf_vec *v, u_int16_t count)
+{
+ u_int16_t i;
+ struct buf_vec *p;
+
+ p = v;
+ for (i = 0; i < count; i++) {
+ kore_buf_append(buf, p->data, p->length);
+ p++;
+ }
+}
+
+void
+kore_buf_appendf(struct kore_buf *buf, const char *fmt, ...)
+{
+ va_list args;
+ char b[2048];
+
+ va_start(args, fmt);
+ vsnprintf(b, sizeof(b), fmt, args);
+ va_end(args);
+
+ kore_buf_append(buf, (u_int8_t *)b, strlen(b));
+}
+
u_int8_t *
kore_buf_release(struct kore_buf *buf, u_int32_t *len)
{
diff --git a/src/http.c b/src/http.c
@@ -130,7 +130,8 @@ http_request_free(struct http_request *req)
TAILQ_REMOVE(&(req->arguments), q, list);
free(q->name);
- free(q->value);
+ if (q->value != NULL)
+ free(q->value);
free(q);
}
@@ -417,14 +418,17 @@ http_populate_arguments(struct http_request *req)
v = kore_split_string(query, "&", args, HTTP_MAX_QUERY_ARGS);
for (i = 0; i < v; i++) {
c = kore_split_string(args[i], "=", val, 3);
- if (c != 2) {
+ if (c != 1 && c != 2) {
kore_log("malformed query argument");
continue;
}
q = (struct http_arg *)kore_malloc(sizeof(*q));
q->name = kore_strdup(val[0]);
- q->value = kore_strdup(val[1]);
+ if (c == 2)
+ q->value = kore_strdup(val[1]);
+ else
+ q->value = NULL;
TAILQ_INSERT_TAIL(&(req->arguments), q, list);
count++;
}
@@ -440,6 +444,8 @@ http_argument_lookup(struct http_request *req, const char *name, char **out)
TAILQ_FOREACH(q, &(req->arguments), list) {
if (!strcmp(q->name, name)) {
+ if (q->value == NULL)
+ return (KORE_RESULT_ERROR);
*out = kore_strdup(q->value);
return (KORE_RESULT_OK);
}