]> mj.ucw.cz Git - libucw.git/commitdiff
When we encounter an URL with multiple @'s, the first one should be treated
authorMartin Mares <mj@ucw.cz>
Sat, 9 Jul 2005 09:32:45 +0000 (09:32 +0000)
committerMartin Mares <mj@ucw.cz>
Sat, 9 Jul 2005 09:32:45 +0000 (09:32 +0000)
as the username separator and the subsequent ones automatically escaped.

Therefore, `http://a@b@c.cz/' is normalized as `http://a@b%40c.cz/'.
It's probably an invalid URL (have to check all the possible loopholes
in the spec yet :) ), but it occurs in the wild anyway, so let's try
to treat them with grace.

lib/url.c

index 453538c229ef1176a3cedaaa56625a60324a1833..d5cbcea21a34d718b7e9b70f6ee09131574deaa4 100644 (file)
--- a/lib/url.c
+++ b/lib/url.c
@@ -224,18 +224,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 +254,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 +266,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;
        }
     }