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
{
{
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, ':'))
{
}
}
else
- w = q;
- e = strchr(w, ':');
+ at = q;
+ e = strchr(at, ':');
if (e) /* host:port present */
{
uns p;
else if (p) /* Port 0 (e.g. in :/) is treated as default port */
u->port = p;
}
- u->host = w;
+ u->host = at;
}
}