SQUIDCEXTERN void urlInitialize(void);
SQUIDCEXTERN HttpRequest *urlParse(const HttpRequestMethod&, char *, HttpRequest *request = NULL);
SQUIDCEXTERN const char *urlCanonical(HttpRequest *);
-SQUIDCEXTERN int urlIsRelative(const char *);
-SQUIDCEXTERN const char *urlMakeAbsolute(const HttpRequest *, const char *);
+SQUIDCEXTERN bool urlIsRelative(const char *);
+SQUIDCEXTERN char *urlMakeAbsolute(const HttpRequest *, const char *);
SQUIDCEXTERN char *urlRInternal(const char *host, u_short port, const char *dir, const char *name);
SQUIDCEXTERN char *urlInternal(const char *dir, const char *name);
SQUIDCEXTERN int matchDomainName(const char *host, const char *domain);
* RFC 2396, Section 5 (Page 17) implies that in a relative URL, a '/' will
* appear before a ':'.
*/
-int
+bool
urlIsRelative(const char *url)
{
const char *p;
if (url == NULL) {
- return (0);
+ return (false);
}
if (*url == '\0') {
- return (0);
+ return (false);
}
for (p = url; *p != '\0' && *p != ':' && *p != '/'; p++);
if (*p == ':') {
- return (0);
+ return (false);
}
- return (1);
+ return (true);
}
/*
*
* It is assumed that you have already ensured that the URL is relative.
*
- * If NULL is returned, you should use the original URL unchanged.
+ * If NULL is returned it is an indication that the method in use in the
+ * request does not distinguish between relative and absolute and you should
+ * use the url unchanged.
*/
-const char *
+char *
urlMakeAbsolute(const HttpRequest * req, const char *relUrl)
{
- char *urlbuf;
- const char *path, *last_slash;
- size_t urllen, pathlen;
if (req->method.id() == METHOD_CONNECT) {
return (NULL);
}
- urlbuf = (char *)xmalloc(MAX_URL * sizeof(char));
+ char *urlbuf = (char *)xmalloc(MAX_URL * sizeof(char));
if (req->protocol == PROTO_URN) {
snprintf(urlbuf, MAX_URL, "urn:%s", req->urlpath.buf());
return (urlbuf);
}
- if (req->port != urlDefaultPort(req->protocol)) {
- urllen = snprintf(urlbuf, MAX_URL, "%s://%s%s%s:%d",
- ProtocolStr[req->protocol],
- req->login,
- *req->login ? "@" : null_string,
- req->GetHost(),
- req->port
- );
- } else {
- urllen = snprintf(urlbuf, MAX_URL, "%s://%s%s%s",
- ProtocolStr[req->protocol],
- req->login,
- *req->login ? "@" : null_string,
- req->GetHost()
- );
- }
-
- if (relUrl[0] == '/') {
- strncpy(&urlbuf[urllen], relUrl, MAX_URL - urllen - 1);
- } else {
- path = req->urlpath.buf();
- last_slash = strrchr(path, '/');
- if (last_slash == NULL) {
- urlbuf[urllen++] = '/';
- strncpy(&urlbuf[urllen], relUrl, MAX_URL - urllen - 1);
- } else {
- last_slash++;
- pathlen = last_slash - path;
- if (pathlen > MAX_URL - urllen - 1) {
- pathlen = MAX_URL - urllen - 1;
- }
- strncpy(&urlbuf[urllen], path, pathlen);
- urllen += pathlen;
- if (urllen + 1 < MAX_URL) {
- strncpy(&urlbuf[urllen], relUrl, MAX_URL - urllen - 1);
- }
- }
- }
+ size_t urllen;
+
+ if (req->port != urlDefaultPort(req->protocol)) {
+ urllen = snprintf(urlbuf, MAX_URL, "%s://%s%s%s:%d",
+ ProtocolStr[req->protocol],
+ req->login,
+ *req->login ? "@" : null_string,
+ req->GetHost(),
+ req->port
+ );
+ } else {
+ urllen = snprintf(urlbuf, MAX_URL, "%s://%s%s%s",
+ ProtocolStr[req->protocol],
+ req->login,
+ *req->login ? "@" : null_string,
+ req->GetHost()
+ );
+ }
+
+ if (relUrl[0] == '/') {
+ strncpy(&urlbuf[urllen], relUrl, MAX_URL - urllen - 1);
+ } else {
+ const char *path = req->urlpath.buf();
+ const char *last_slash = strrchr(path, '/');
+
+ if (last_slash == NULL) {
+ urlbuf[urllen++] = '/';
+ strncpy(&urlbuf[urllen], relUrl, MAX_URL - urllen - 1);
+ } else {
+ last_slash++;
+ size_t pathlen = last_slash - path;
+ if (pathlen > MAX_URL - urllen - 1) {
+ pathlen = MAX_URL - urllen - 1;
+ }
+ strncpy(&urlbuf[urllen], path, pathlen);
+ urllen += pathlen;
+ if (urllen + 1 < MAX_URL) {
+ strncpy(&urlbuf[urllen], relUrl, MAX_URL - urllen - 1);
+ }
+ }
+ }
return (urlbuf);
}