#include <fcntl.h>
#include <sys/types.h>
#include "libcitadel.h"
+#include <sys/socket.h>
/**
* @defgroup URLHandling ParsedURL object to handle connection data
FreeStrBuf(&(*Url)->URL);
FreeStrBuf(&(*Url)->UrlWithoutCred);
FreeStrBuf(&(*Url)->CurlCreds);
+ FreeStrBuf(&(*Url)->UsrName);
+ FreeStrBuf(&(*Url)->Password);
if ((*Url)->Next != NULL)
FreeURL(&(*Url)->Next);
free(*Url);
*/
url->URL = NewStrBufDup(UrlStr);
url->Host = pch = ChrPtr(url->URL);
- url->LocalPart = strchr(pch, '/');
+ pEndHost = url->LocalPart = strchr(pch, '/');
if (url->LocalPart != NULL) {
if ((*(url->LocalPart + 1) == '/') &&
(*(url->LocalPart - 1) == ':')) { /* TODO: find default port for this protocol... */
url->Host = url->LocalPart + 2;
- url->LocalPart = strchr(url->Host, '/');
+ pEndHost = url->LocalPart = strchr(url->Host, '/');
if (url->LocalPart != NULL)
{
StrBufPeek(url->URL, url->LocalPart, 0, '\0');
}
}
if (url->LocalPart == NULL) {
- url->LocalPart = pch + StrLength(url->URL);
+ pEndHost = url->LocalPart = ChrPtr(url->URL) + StrLength(url->URL);
}
- pCredEnd = strchr(pch, '@');
+ pCredEnd = strrchr(ChrPtr(url->URL), '@');
if (pCredEnd >= url->LocalPart)
pCredEnd = NULL;
if (pCredEnd != NULL)
}
if (pPort != NULL)
url->Port = atol(pPort);
- url->IsIP = inet_pton(url->af, url->Host, &url->Addr.sin6_addr);
+ if (url->IPv6)
+ {
+ url->IsIP = inet_pton(AF_INET6, url->Host, &url->Addr.sin6_addr);
+ if (url->IsIP)
+ {
+ url->Addr.sin6_port = htons(url->Port);
+ url->Addr.sin6_port = AF_INET6;
+ }
+ }
+ else
+ {
+ url->IsIP = inet_pton(AF_INET, url->Host, &((struct sockaddr_in *)&(url->Addr))->sin_addr);
+ if (url->IsIP)
+ {
+ ((struct sockaddr_in *)&(url->Addr))->sin_port = htons(url->Port);
+ ((struct sockaddr_in *)&(url->Addr))->sin_family = AF_INET;
+ }
+ }
+
+ if (url->User != NULL) {
+ url->UsrName = NewStrBufPlain(url->User, pUserEnd - url->User);
+ StrBufUnescape(url->UsrName, 0);
+ url->User = ChrPtr(url->UsrName);
+ }
+
+ if (url->Pass != NULL) {
+ url->Password = NewStrBufPlain(url->Pass, pCredEnd - url->Pass);
+ StrBufUnescape(url->Password, 0);
+ url->Pass = ChrPtr(url->Password);
+ }
+
+ if (*Url != NULL)
+ url->Next = *Url;
*Url = url;
return 1;
}