X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=lib%2Furl.c;h=c4662372c99fc5afc493e83e486496a756b46890;hb=1d8112cb590e458baa899805908a8ac910f58163;hp=152b2d291257764c80350750194277a0b31ee4e7;hpb=56d6f96154b7f0406a1fe5ed94032594faef5a6e;p=libucw.git diff --git a/lib/url.c b/lib/url.c index 152b2d29..c4662372 100644 --- a/lib/url.c +++ b/lib/url.c @@ -33,19 +33,20 @@ static byte *url_component_separators = ""; static uns url_min_repeat_count = 0x7fffffff; static uns url_max_repeat_length = 0; -static struct cfitem url_config[] = { - { "URL", CT_SECTION, NULL }, - { "IgnoreSpaces", CT_INT, &url_ignore_spaces }, - { "IgnoreUnderflow", CT_INT, &url_ignore_underflow }, - { "ComponentSeparators", CT_STRING, &url_component_separators }, - { "MinRepeatCount", CT_INT, &url_min_repeat_count }, - { "MaxRepeatLength", CT_INT, &url_max_repeat_length }, - { NULL, CT_STOP, NULL } +static struct cf_section url_config = { + CF_ITEMS { + CF_UNS("IgnoreSpaces", &url_ignore_spaces), + CF_UNS("IgnoreUnderflow", &url_ignore_underflow), + CF_STRING("ComponentSeparators", &url_component_separators), + CF_UNS("MinRepeatCount", &url_min_repeat_count), + CF_UNS("MaxRepeatLength", &url_max_repeat_length), + CF_END + } }; static void CONSTRUCTOR url_init_config(void) { - cf_register(url_config); + cf_declare_section("URL", &url_config, 0); } /* Escaping and de-escaping */ @@ -159,7 +160,7 @@ url_enescape_friendly(byte *src, byte *dest) return URL_ERR_TOO_LONG; if (*src < NCC_MAX) *dest++ = NCC_CHARS[*src++]; - else if (*src < 0x80) + else if (*src >= 0x20 && *src < 0x7f) *dest++ = *src++; else { @@ -224,18 +225,28 @@ url_split(byte *s, struct url *u, byte *d) { if (s[1] == '/') /* Host spec */ { - byte *q, *w, *e; + byte *q, *e; + byte *at = NULL; char *ep; s += 2; q = d; while (*s && *s != '/' && *s != '?') /* Copy user:passwd@host:port */ - *d++ = *s++; + { + if (*s != '@') + *d++ = *s; + else if (!at) + { + *d++ = 0; + at = d; + } + else /* This shouldn't happen with sane URL's, but we need to be sure */ + *d++ = NCC_AT; + s++; + } *d++ = 0; - w = strchr(q, '@'); - if (w) /* user:passwd present */ + if (at) /* user:passwd present */ { - *w++ = 0; u->user = q; if (e = strchr(q, ':')) { @@ -244,8 +255,8 @@ url_split(byte *s, struct url *u, byte *d) } } else - w = q; - e = strchr(w, ':'); + at = q; + e = strchr(at, ':'); if (e) /* host:port present */ { uns p; @@ -256,7 +267,7 @@ url_split(byte *s, struct url *u, byte *d) else if (p) /* Port 0 (e.g. in :/) is treated as default port */ u->port = p; } - u->host = w; + u->host = at; } }