/*
- * Sherlock Library -- URL Functions
+ * UCW Library -- URL Functions
*
- * (c) 1997 Martin Mares, <mj@atrey.karlin.mff.cuni.cz>
+ * (c) 1997--2004 Martin Mares <mj@ucw.cz>
+ * (c) 2001 Robert Spalek <robert@ucw.cz>
+ *
+ * This software may be freely distributed and used according to the terms
+ * of the GNU Lesser General Public License.
*/
+#ifndef _UCW_URL_H
+#define _UCW_URL_H
+
#define MAX_URL_SIZE 1024
/* Non-control meanings of control characters */
#define NCC_AT 5
#define NCC_EQUAL 6
#define NCC_AND 7
-#define NCC_MAX 8
+#define NCC_HASH 8
+#define NCC_MAX 9
+
+#define NCC_CHARS " ;/?:@=&#"
/* Remove/Introduce '%' escapes */
-int url_deescape(byte *, byte *);
-int url_enescape(byte *, byte *);
+int url_deescape(const byte *s, byte *d);
+int url_enescape(const byte *s, byte *d);
+int url_enescape_friendly(const byte *src, byte *dest); // for cards.c only
/* URL splitting and normalization */
byte *protocol;
uns protoid;
byte *user;
+ byte *pass;
byte *host;
uns port; /* ~0 if unspec */
byte *rest;
byte *buf, *bufend;
};
-int url_split(byte *, struct url *, byte *);
-int url_normalize(struct url *, struct url *);
-int url_canonicalize(struct url *);
-int url_pack(struct url *, byte *);
-int url_canon_split(byte *, byte *, byte *, struct url *);
-uns identify_protocol(byte *);
+int url_split(byte *s, struct url *u, byte *d);
+int url_normalize(struct url *u, struct url *b);
+int url_canonicalize(struct url *u);
+int url_pack(struct url *u, byte *d);
+int url_canon_split_rel(const byte *url, byte *buf1, byte *buf2, struct url *u, struct url *base);
+int url_auto_canonicalize_rel(const byte *src, byte *dst, struct url *base);
+uns identify_protocol(const byte *p);
+int url_has_repeated_component(const byte *url);
+
+static inline int url_canon_split(const byte *url, byte *buf1, byte *buf2, struct url *u)
+{ return url_canon_split_rel(url, buf1, buf2, u, NULL); }
+
+static inline int url_auto_canonicalize(const byte *src, byte *dst)
+{ return url_auto_canonicalize_rel(src, dst, NULL); }
/* Error codes */
#define URL_PROTO_UNKNOWN 0
#define URL_PROTO_HTTP 1
#define URL_PROTO_FTP 2
-#define URL_PROTO_MAX 3
+#define URL_PROTO_FILE 3
+#define URL_PROTO_MAX 4
+
+#define URL_PNAMES { "unknown", "http", "ftp", "file" }
+#define URL_DEFPORTS { ~0, 80, 21, 0 }
+#define URL_PATH_FLAGS { 0, 1, 1, 1 }
+
+extern byte *url_proto_names[];
-#define URL_PNAMES { "unknown", "http", "ftp" }
+#endif