]> mj.ucw.cz Git - libucw.git/blobdiff - lib/url.c
Merge with git+ssh://git.ucw.cz/projects/sherlock/GIT/sherlock.git
[libucw.git] / lib / url.c
index 152b2d291257764c80350750194277a0b31ee4e7..c4662372c99fc5afc493e83e486496a756b46890 100644 (file)
--- 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;
        }
     }