util: absuri: simplify + fix port in url with prefix "//"

use the port specified in the link for urls starting with "//" (use protocol).
This commit is contained in:
Hiltjo Posthuma 2015-08-22 16:18:10 +02:00
parent 6599b96752
commit 6d02ae93a3
1 changed files with 11 additions and 13 deletions

24
util.c
View File

@ -105,30 +105,28 @@ int
absuri(const char *link, const char *base, char *buf, size_t bufsiz)
{
struct uri ulink, ubase;
char tmp[4096] = "", *p, *port;
char tmp[4096], *host, *p, *port;
int r = -1, c;
size_t i;
buf[0] = '\0';
if (parseuri(base, &ubase, 0) == -1 ||
parseuri(link, &ulink, 1) == -1)
parseuri(link, &ulink, 1) == -1 ||
(!ulink.host[0] && !ubase.host[0]))
return -1;
if (!ulink.host[0] && !ubase.host[0])
return -1;
if (!strncmp(link, "//", 2))
port = "";
else
port = ulink.port[0] ? ulink.port : ubase.port[0] ? ubase.port : "";
if (!strncmp(link, "//", 2)) {
host = ulink.host;
port = ulink.port;
} else {
host = ulink.host[0] ? ulink.host : ubase.host;
port = ulink.port[0] ? ulink.port : ubase.port;
}
r = snprintf(tmp, sizeof(tmp), "%s://%s%s%s",
ulink.proto[0] ?
ulink.proto :
(ubase.proto[0] ? ubase.proto : "http"),
!strncmp(link, "//", 2) ?
ulink.host :
(ulink.host[0] ? ulink.host : ubase.host),
host,
port[0] ? ":" : "",
port);
if (r == -1 || (size_t)r >= sizeof(tmp))