diff src/c/urweb.c @ 925:552c989c1601

Change string URLification to avoid using the empty string, which confuses Apache no2slash()
author Adam Chlipala <adamc@hcoop.net>
date Sat, 12 Sep 2009 09:31:50 -0400
parents d6a71f19a3d8
children d136bc34e4ca
line wrap: on
line diff
--- a/src/c/urweb.c	Thu Sep 10 14:55:27 2009 -0400
+++ b/src/c/urweb.c	Sat Sep 12 09:31:50 2009 -0400
@@ -1479,9 +1479,16 @@
 char *uw_Basis_urlifyString(uw_context ctx, uw_Basis_string s) {
   char *r, *p;
 
-  uw_check_heap(ctx, strlen(s) * 3 + 1);
-
-  for (r = p = ctx->heap.front; *s; s++) {
+  if (s[0] == '\0')
+    return "_";
+
+  uw_check_heap(ctx, strlen(s) * 3 + 1 + !!(s[0] == '_'));
+
+  r = p = ctx->heap.front;
+  if (s[0] == '_')
+    *p++ = '_';
+
+  for (; *s; s++) {
     char c = *s;
 
     if (c == ' ')
@@ -1547,7 +1554,16 @@
 }
 
 uw_unit uw_Basis_urlifyString_w(uw_context ctx, uw_Basis_string s) {
-  uw_check(ctx, strlen(s) * 3);
+  if (s[0] == '\0') {
+    uw_check(ctx, 1);
+    uw_writec_unsafe(ctx, '_');
+    return uw_unit_v;
+  }
+
+  uw_check(ctx, strlen(s) * 3 + !!(s[0] == '_'));
+
+  if (s[0] == '_')
+    uw_writec_unsafe(ctx, '_');
 
   for (; *s; s++) {
     char c = *s;
@@ -1612,6 +1628,11 @@
   char *s1, *s2;
   int n;
 
+  if (*s2 == '_')
+    ++s2;
+  else if (s2[0] == '%' && s2[1] == '5' && (s2[2] == 'f' || s2[2] == 'F'))
+    s2 += 3;
+
   for (s1 = r, s2 = s; *s2; ++s1, ++s2) {
     char c = *s2;