From e7e9c3a84aa02b47864f22b5edf4f9c412ac82f9 Mon Sep 17 00:00:00 2001 From: Wilfried Goesgens Date: Fri, 1 Apr 2011 16:51:48 +0200 Subject: [PATCH] move URL parsing / struct over into libcitadel --- citadel/event_client.h | 3 +- citadel/modules/smtp/serv_smtpqueue.c | 82 ------------------- citadel/modules/smtp/smtpqueue.h | 15 ---- libcitadel/Makefile.in | 1 + libcitadel/lib/libcitadel.h | 23 ++++++ libcitadel/lib/urlhandling.c | 111 ++++++++++++++++++++++++++ 6 files changed, 137 insertions(+), 98 deletions(-) create mode 100644 libcitadel/lib/urlhandling.c diff --git a/citadel/event_client.h b/citadel/event_client.h index 57d920407..e98a13a8d 100644 --- a/citadel/event_client.h +++ b/citadel/event_client.h @@ -35,9 +35,10 @@ struct AsyncIO { StrBuf *Host; char service[32]; - /* To cycle through several possible services... */ + /* To cycle through several possible services... * / struct addrinfo *res; struct addrinfo *curr_ai; + */ /* connection related */ int IP6; diff --git a/citadel/modules/smtp/serv_smtpqueue.c b/citadel/modules/smtp/serv_smtpqueue.c index 87fbc3865..65cde8f15 100644 --- a/citadel/modules/smtp/serv_smtpqueue.c +++ b/citadel/modules/smtp/serv_smtpqueue.c @@ -136,16 +136,6 @@ void RemoveQItem(OneQueItem *MyQItem) DeleteHashPos(&It); } -void FreeURL(ParsedURL** Url) -{ - if (*Url != NULL) { - FreeStrBuf(&(*Url)->URL); - if ((*Url)->Next != NULL) - FreeURL(&(*Url)->Next); - free(*Url); - *Url = NULL; - } -} void FreeMailQEntry(void *qv) { @@ -599,78 +589,6 @@ void smtpq_do_bounce(OneQueItem *MyQItem, StrBuf *OMsgTxt) -int ParseURL(ParsedURL **Url, StrBuf *UrlStr, short DefaultPort) -{ - const char *pch, *pEndHost, *pPort, *pCredEnd, *pUserEnd; - ParsedURL *url = (ParsedURL *)malloc(sizeof(ParsedURL)); - memset(url, 0, sizeof(ParsedURL)); - - url->af = AF_INET; - url->Port = DefaultPort; - /* - * http://username:passvoid@[ipv6]:port/url - */ - url->URL = NewStrBufDup(UrlStr); - url->Host = pch = ChrPtr(url->URL); - url->LocalPart = strchr(pch, '/'); - if (url->LocalPart != NULL) { - if ((*(url->LocalPart + 1) == '/') && - (*(url->LocalPart + 2) == ':')) { /* TODO: find default port for this protocol... */ - url->Host = url->LocalPart + 3; - url->LocalPart = strchr(url->Host, '/'); - } - } - if (url->LocalPart == NULL) { - url->LocalPart = pch + StrLength(url->URL); - } - - pCredEnd = strchr(pch, '@'); - if (pCredEnd >= url->LocalPart) - pCredEnd = NULL; - if (pCredEnd != NULL) - { - url->User = url->Host; - url->Host = pCredEnd + 1; - pUserEnd = strchr(url->User, ':'); - - if (pUserEnd > pCredEnd) - pUserEnd = pCredEnd; - else { - url->Pass = pUserEnd + 1; - } - StrBufPeek(url->URL, pUserEnd, 0, '\0'); - StrBufPeek(url->URL, pCredEnd, 0, '\0'); - } - - pPort = NULL; - if (*url->Host == '[') { - url->Host ++; - pEndHost = strchr(url->Host, ']'); - if (pEndHost == NULL) { - FreeStrBuf(&url->URL); - free(url); - return 0; /* invalid syntax, no ipv6 */ - } - StrBufPeek(url->URL, pEndHost, 0, '\0'); - if (*(pEndHost + 1) == ':'){ - StrBufPeek(url->URL, pEndHost + 1, 0, '\0'); - pPort = pEndHost + 2; - } - url->af = AF_INET6; - } - else { - pPort = strchr(url->Host, ':'); - if (pPort != NULL) { - StrBufPeek(url->URL, pPort, 0, '\0'); - pPort ++; - } - } - if (pPort != NULL) - url->Port = atol(pPort); - url->IsIP = inet_pton(url->af, url->Host, &url->Addr); - *Url = url; - return 1; -} /* { diff --git a/citadel/modules/smtp/smtpqueue.h b/citadel/modules/smtp/smtpqueue.h index 1ae1034b4..2b252899a 100644 --- a/citadel/modules/smtp/smtpqueue.h +++ b/citadel/modules/smtp/smtpqueue.h @@ -2,21 +2,6 @@ /* SMTP CLIENT (Queue Management) STUFF */ /*****************************************************************************/ -typedef struct ParsedURL ParsedURL; -struct ParsedURL { - StrBuf *URL; - unsigned Port; - const char *Host; - const char *User; - const char *Pass; - const char *LocalPart; - int IsIP; - int IPv6; - int af; - struct hostent *HEnt; - struct in6_addr Addr; - ParsedURL *Next; -}; #define MaxAttempts 15 diff --git a/libcitadel/Makefile.in b/libcitadel/Makefile.in index 84234628e..66da7e903 100755 --- a/libcitadel/Makefile.in +++ b/libcitadel/Makefile.in @@ -113,6 +113,7 @@ LIB_OBJS = lib/libcitadel.lo \ lib/stringbuf.lo \ lib/json.lo \ lib/wildfire.lo \ + lib/urlhandling.o \ lib/xdgmime/xdgmime.lo \ lib/xdgmime/xdgmimeglob.lo \ lib/xdgmime/xdgmimeint.lo \ diff --git a/libcitadel/lib/libcitadel.h b/libcitadel/lib/libcitadel.h index d74b9f12d..b16e3296c 100644 --- a/libcitadel/lib/libcitadel.h +++ b/libcitadel/lib/libcitadel.h @@ -14,6 +14,9 @@ #include #include #include +#include +#include + #define LIBCITADEL_VERSION_NUMBER 789 /* @@ -352,6 +355,26 @@ int LoadIconDir(const char *DirName); const char *GetIconFilename(char *MimeType, size_t len); +/* URL parsing & connection data */ +typedef struct ParsedURL ParsedURL; +struct ParsedURL { + StrBuf *URL; + unsigned Port; + const char *Host; + const char *User; + const char *Pass; + const char *LocalPart; + int IsIP; + int IPv6; + int af; + struct hostent *HEnt; + struct in6_addr Addr; + ParsedURL *Next; +}; + +void FreeURL(ParsedURL** Url); +int ParseURL(ParsedURL **Url, StrBuf *UrlStr, unsigned short DefaultPort); + /* tools */ diff --git a/libcitadel/lib/urlhandling.c b/libcitadel/lib/urlhandling.c new file mode 100644 index 000000000..a8856fafd --- /dev/null +++ b/libcitadel/lib/urlhandling.c @@ -0,0 +1,111 @@ +#include "sysdep.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "libcitadel.h" + +/** + * @defgroup URLHandling ParsedURL object to handle connection data + */ + +/** + * @ingroup URLHandling + * @brief frees a linked list of ParsedURL + * @param Url (list) of ParsedURL to be freet; Pointer is NULL'ed for the caller. + */ +void FreeURL(ParsedURL** Url) +{ + if (*Url != NULL) { + FreeStrBuf(&(*Url)->URL); + if ((*Url)->Next != NULL) + FreeURL(&(*Url)->Next); + free(*Url); + *Url = NULL; + } +} + +/** + * @ingroup URLHandling + * @brief parses the string provided with UrlStr into *Url + * @param Url on success this contains the parsed object; needs to be free'd by caller. + * @param UrlStr String we should parse into parts + * @param DefaultPort Which is the default port here? + */ +int ParseURL(ParsedURL **Url, StrBuf *UrlStr, unsigned short DefaultPort) +{ + const char *pch, *pEndHost, *pPort, *pCredEnd, *pUserEnd; + ParsedURL *url = (ParsedURL *)malloc(sizeof(ParsedURL)); + memset(url, 0, sizeof(ParsedURL)); + + url->af = AF_INET; + url->Port = DefaultPort; + /* + * http://username:passvoid@[ipv6]:port/url + */ + url->URL = NewStrBufDup(UrlStr); + url->Host = pch = ChrPtr(url->URL); + url->LocalPart = strchr(pch, '/'); + if (url->LocalPart != NULL) { + if ((*(url->LocalPart + 1) == '/') && + (*(url->LocalPart + 2) == ':')) { /* TODO: find default port for this protocol... */ + url->Host = url->LocalPart + 3; + url->LocalPart = strchr(url->Host, '/'); + } + } + if (url->LocalPart == NULL) { + url->LocalPart = pch + StrLength(url->URL); + } + + pCredEnd = strchr(pch, '@'); + if (pCredEnd >= url->LocalPart) + pCredEnd = NULL; + if (pCredEnd != NULL) + { + url->User = url->Host; + url->Host = pCredEnd + 1; + pUserEnd = strchr(url->User, ':'); + + if (pUserEnd > pCredEnd) + pUserEnd = pCredEnd; + else { + url->Pass = pUserEnd + 1; + } + StrBufPeek(url->URL, pUserEnd, 0, '\0'); + StrBufPeek(url->URL, pCredEnd, 0, '\0'); + } + + pPort = NULL; + if (*url->Host == '[') { + url->Host ++; + pEndHost = strchr(url->Host, ']'); + if (pEndHost == NULL) { + FreeStrBuf(&url->URL); + free(url); + return 0; /* invalid syntax, no ipv6 */ + } + StrBufPeek(url->URL, pEndHost, 0, '\0'); + if (*(pEndHost + 1) == ':'){ + StrBufPeek(url->URL, pEndHost + 1, 0, '\0'); + pPort = pEndHost + 2; + } + url->af = AF_INET6; + } + else { + pPort = strchr(url->Host, ':'); + if (pPort != NULL) { + StrBufPeek(url->URL, pPort, 0, '\0'); + pPort ++; + } + } + if (pPort != NULL) + url->Port = atol(pPort); + url->IsIP = inet_pton(url->af, url->Host, &url->Addr); + *Url = url; + return 1; +} -- 2.30.2