- CtdlLogPrintf(CTDL_DEBUG, "Done processing bounces\n");
-}
-
-
-
-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) {
- free(url);
- return 0; /* invalid syntax, no ipv6 */
- }
- 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;