changeset 1788:f57983ba2a36

Get regular forms working again
author Adam Chlipala <adam@chlipala.net>
date Sat, 21 Jul 2012 15:34:07 -0400
parents 69daa6d70299
children 2e01a36701eb
files include/urweb/types.h src/c/request.c src/c/urweb.c
diffstat 3 files changed, 24 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- 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;
--- 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) {
--- 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;
 }