# HG changeset patch # User Adam Chlipala # Date 1342899247 14400 # Node ID f57983ba2a36f955a4f71666d58a134e57d934a5 # Parent 69daa6d70299586d88d910a360a7e85106f29d32 Get regular forms working again diff -r 69daa6d70299 -r f57983ba2a36 include/urweb/types.h --- a/include/urweb/types.h Sat Jul 21 15:16:57 2012 -0400 +++ b/include/urweb/types.h Sat Jul 21 15:34:07 2012 -0400 @@ -47,6 +47,7 @@ typedef struct uw_Basis_postBody { uw_Basis_string type, data; + size_t len; } uw_Basis_postBody; typedef uw_Basis_string uw_Basis_queryString; diff -r 69daa6d70299 -r f57983ba2a36 src/c/request.c --- a/src/c/request.c Sat Jul 21 15:16:57 2012 -0400 +++ b/src/c/request.c Sat Jul 21 15:34:07 2012 -0400 @@ -246,7 +246,7 @@ char *inputs; const char *prefix = uw_get_url_prefix(ctx); char *s; - int had_error = 0; + int had_error = 0, is_fancy = 0; char errmsg[ERROR_BUF_LEN]; uw_reset(ctx); @@ -284,6 +284,10 @@ uw_isPost(ctx); clen_s = uw_Basis_requestHeader(ctx, "Content-type"); + + if (!clen_s || strcasecmp(clen_s, "application/x-www-form-urlencoded")) + is_fancy = 1; + if (clen_s && !strncasecmp(clen_s, "multipart/form-data", 19)) { if (strncasecmp(clen_s + 19, "; boundary=", 11)) { log_error(logger_data, "Bad multipart boundary spec"); @@ -295,7 +299,7 @@ boundary[1] = '-'; boundary_len = strlen(boundary); } else if (clen_s) { - uw_Basis_postBody pb = {clen_s, body}; + uw_Basis_postBody pb = {clen_s, body, body_len}; uw_postBody(ctx, pb); } } else if (strcmp(method, "GET")) { @@ -430,7 +434,7 @@ } } } - else if (!uw_hasPostBody(ctx)) { + else if (!is_fancy) { inputs = is_post ? body : query_string; if (inputs) { diff -r 69daa6d70299 -r f57983ba2a36 src/c/urweb.c --- a/src/c/urweb.c Sat Jul 21 15:16:57 2012 -0400 +++ b/src/c/urweb.c Sat Jul 21 15:34:07 2012 -0400 @@ -4100,29 +4100,28 @@ } uw_Basis_postField *uw_Basis_firstFormField(uw_context ctx, uw_Basis_string s) { - char *amp, *eq, *unurl, *copy; + char *unurl; uw_Basis_postField *f; - if (s[0] == 0) + if (!ctx->hasPostBody) + uw_error(ctx, FATAL, "firstFormField called when there is no POST body"); + + if (s < ctx->postBody.data || s >= ctx->postBody.data + ctx->postBody.len) return NULL; - amp = strchr(s, '&'); - copy = uw_malloc(ctx, amp ? amp - s + 1 : strlen(s) + 1); - if (amp) { - strncpy(copy, s, amp - s); - copy[amp - s] = 0; - } else - strcpy(copy, s); - - eq = strchr(copy, '='); - if (eq) - *eq++ = 0; - f = uw_malloc(ctx, sizeof(uw_Basis_postField)); - unurl = copy; + unurl = s; f->name = uw_Basis_unurlifyString(ctx, &unurl); - f->value = eq ? (unurl = eq, uw_Basis_unurlifyString(ctx, &unurl)) : ""; - f->remaining = amp ? amp+1 : ""; + s = strchr(s, 0); + if (!s) + uw_error(ctx, FATAL, "firstFormField: Missing null terminator"); + ++s; + unurl = s; + f->value = uw_Basis_unurlifyString(ctx, &unurl); + s = strchr(s, 0); + if (!s) + uw_error(ctx, FATAL, "firstFormField: Missing null terminator"); + f->remaining = s+1; return f; }