changeset 466:1626dcba13ee

Cookies work across pages
author Adam Chlipala <adamc@hcoop.net>
date Thu, 06 Nov 2008 14:03:50 -0500
parents ddd363e856ff
children 3f1b9231a37b
files include/urweb.h src/c/driver.c src/c/urweb.c src/monoize.sml tests/cookie.ur
diffstat 5 files changed, 27 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/include/urweb.h	Thu Nov 06 12:46:45 2008 -0500
+++ b/include/urweb.h	Thu Nov 06 14:03:50 2008 -0500
@@ -6,7 +6,7 @@
 
 extern uw_unit uw_unit_v;
 
-uw_context uw_init(size_t page_len, size_t heap_len);
+uw_context uw_init(size_t outHeaders_len, size_t page_len, size_t heap_len);
 void uw_set_db(uw_context, void*);
 void *uw_get_db(uw_context);
 void uw_free(uw_context);
@@ -101,5 +101,5 @@
 
 void uw_write_header(uw_context, uw_Basis_string);
 
-uw_Basis_string uw_Basis_get_cookie(uw_context, uw_Basis_string);
-uw_unit uw_Basis_set_cookie(uw_context, uw_Basis_string, uw_Basis_string);
+uw_Basis_string uw_Basis_get_cookie(uw_context, uw_Basis_string c);
+uw_unit uw_Basis_set_cookie(uw_context, uw_Basis_string prefix, uw_Basis_string c, uw_Basis_string v);
--- a/src/c/driver.c	Thu Nov 06 12:46:45 2008 -0500
+++ b/src/c/driver.c	Thu Nov 06 14:03:50 2008 -0500
@@ -71,7 +71,7 @@
 
 static void *worker(void *data) {
   int me = *(int *)data, retries_left = MAX_RETRIES;
-  uw_context ctx = uw_init(1024, 0);
+  uw_context ctx = uw_init(0, 1024, 0);
   
   while (1) {
     failure_kind fk = uw_begin_init(ctx);
--- a/src/c/urweb.c	Thu Nov 06 12:46:45 2008 -0500
+++ b/src/c/urweb.c	Thu Nov 06 14:03:50 2008 -0500
@@ -1152,11 +1152,13 @@
   }
 }
 
-uw_unit uw_Basis_set_cookie(uw_context ctx, uw_Basis_string c, uw_Basis_string v) {
+uw_unit uw_Basis_set_cookie(uw_context ctx, uw_Basis_string prefix, uw_Basis_string c, uw_Basis_string v) {
   uw_write_header(ctx, "Set-Cookie: ");
   uw_write_header(ctx, c);
   uw_write_header(ctx, "=");
   uw_write_header(ctx, v);
+  uw_write_header(ctx, "; path=");
+  uw_write_header(ctx, prefix);
   uw_write_header(ctx, "\r\n");
 
   return uw_unit_v;
--- a/src/monoize.sml	Thu Nov 06 12:46:45 2008 -0500
+++ b/src/monoize.sml	Thu Nov 06 14:03:50 2008 -0500
@@ -971,7 +971,10 @@
                 ((L'.EAbs ("c", s, (L'.TFun (t, (L'.TFun (un, un), loc)), loc),
                            (L'.EAbs ("v", t, (L'.TFun (un, un), loc),
                                      (L'.EAbs ("_", un, un,
-                                               (L'.EFfiApp ("Basis", "set_cookie", [(L'.ERel 2, loc), e]), loc)),
+                                               (L'.EFfiApp ("Basis", "set_cookie", [(L'.EPrim (Prim.String (!urlPrefix)),
+                                                                                     loc),
+                                                                                    (L'.ERel 2, loc),
+                                                                                    e]), loc)),
                                       loc)), loc)), loc),
                  fm)
             end            
--- a/tests/cookie.ur	Thu Nov 06 12:46:45 2008 -0500
+++ b/tests/cookie.ur	Thu Nov 06 14:03:50 2008 -0500
@@ -1,8 +1,22 @@
 cookie c : string
 
-fun main () : transaction page =
-    setCookie c "Hi";
+fun other () =
     so <- getCookie c;
     case so of
         None => return <xml>No cookie</xml>
       | Some s => return <xml>Cookie: {[s]}</xml>
+
+structure M = struct
+    fun aux () =
+        setCookie c "Hi";
+        so <- getCookie c;
+        case so of
+            None => return <xml>No cookie</xml>
+          | Some s => return <xml><body>Cookie: {[s]}<br/>
+            <a link={other ()}>Other</a></body></xml>
+end
+
+fun main () : transaction page = return <xml><body>
+  <a link={other ()}>Other</a><br/>
+  <a link={M.aux ()}>Aux</a><br/>
+</body></xml>