Mercurial > urweb
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;