summaryrefslogtreecommitdiff
path: root/src/c/urweb.c
diff options
context:
space:
mode:
authorGravatar Adam Chlipala <adamc@hcoop.net>2008-11-06 09:47:16 -0500
committerGravatar Adam Chlipala <adamc@hcoop.net>2008-11-06 09:47:16 -0500
commit027f68ea322f9a52c3440a8d88be8d924b5c0395 (patch)
treea2eeed536be5e7cb6b43bf4bc8c8b48af01784a0 /src/c/urweb.c
parentd7bd7d38e8f785b7366495ce977379929e5eb913 (diff)
Request header reading works
Diffstat (limited to 'src/c/urweb.c')
-rw-r--r--src/c/urweb.c34
1 files changed, 33 insertions, 1 deletions
diff --git a/src/c/urweb.c b/src/c/urweb.c
index f05b0b9d..9e83191e 100644
--- a/src/c/urweb.c
+++ b/src/c/urweb.c
@@ -3,6 +3,7 @@
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
+#include <strings.h>
#include <ctype.h>
#include <setjmp.h>
#include <stdarg.h>
@@ -23,6 +24,8 @@ typedef struct {
} cleanup;
struct uw_context {
+ char *headers;
+
char *page, *page_front, *page_back;
char *heap, *heap_front, *heap_back;
char **inputs;
@@ -43,6 +46,8 @@ extern int uw_inputs_len;
uw_context uw_init(size_t page_len, size_t heap_len) {
uw_context ctx = malloc(sizeof(struct uw_context));
+ ctx->headers = NULL;
+
ctx->page_front = ctx->page = malloc(page_len);
ctx->page_back = ctx->page_front + page_len;
@@ -111,9 +116,11 @@ failure_kind uw_begin_init(uw_context ctx) {
return r;
}
-failure_kind uw_begin(uw_context ctx, char *path) {
+failure_kind uw_begin(uw_context ctx, char *headers, char *path) {
int r = setjmp(ctx->jmp_buf);
+ ctx->headers = headers;
+
if (r == 0)
uw_handle(ctx, path);
@@ -1051,3 +1058,28 @@ uw_Basis_time uw_Basis_stringToTime_error(uw_context ctx, uw_Basis_string s) {
uw_error(ctx, FATAL, "Can't parse time: %s", s);
}
}
+
+uw_Basis_string uw_Basis_requestHeader(uw_context ctx, uw_Basis_string h) {
+ int len = strlen(h);
+ char *s = ctx->headers, *p;
+
+ while (p = strchr(s, ':')) {
+ if (p - s == len && !strncasecmp(s, h, len)) {
+ s = p + 2;
+ if (p = strchr(s, '\r')) {
+ uw_Basis_string ret = uw_malloc(ctx, p - s + 1);
+ memcpy(ret, s, p - s);
+ ret[p - s] = 0;
+ return ret;
+ }
+ else
+ return NULL;
+ } else {
+ if (s = strchr(s, '\n'))
+ ++s;
+ else
+ return NULL;
+ }
+ }
+
+}