/*
- * Sherlock Library -- URL Functions
+ * UCW Library -- URL Functions
*
* (c) 1997--2004 Martin Mares <mj@ucw.cz>
- * (c) 2001 Robert Spalek <robert@ucw.cz>
+ * (c) 2001--2005 Robert Spalek <robert@ucw.cz>
*
* This software may be freely distributed and used according to the terms
* of the GNU Lesser General Public License.
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 */
return 0;
}
+int
+url_enescape_friendly(byte *src, byte *dest)
+{
+ byte *end = dest + MAX_URL_SIZE - 10;
+ while (*src)
+ {
+ if (dest >= end)
+ return URL_ERR_TOO_LONG;
+ if (*src < NCC_MAX)
+ *dest++ = NCC_CHARS[*src++];
+ else if (*src >= 0x20 && *src < 0x7f)
+ *dest++ = *src++;
+ else
+ {
+ *dest++ = '%';
+ *dest++ = enhex(*src >> 4);
+ *dest++ = enhex(*src++ & 0x0f);
+ }
+ }
+ *dest = 0;
+ return 0;
+}
+
/* Split an URL (several parts may be copied to the destination buffer) */
byte *url_proto_names[URL_PROTO_MAX] = URL_PNAMES;
{
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;
}
}