24 {
"exchangeits", 7070,
false },
25 {
"exchangeit", 6969,
false },
26 {
"https", 443,
true },
29 {
"sip", 5060,
false },
31 {
"ldaps", 636,
false },
32 {
"ldap", 389,
false },
37 static int get_default_port(
WvString proto)
40 for (p = portmap; p->proto != NULL; p++)
42 if (strncmp(p->proto, proto, strlen(p->proto)) == 0)
51 static bool protocol_uses_slashes(
WvString proto)
54 for (p = portmap; p->proto != NULL; p++)
56 if (strncmp(p->proto, proto, strlen(p->proto)) == 0)
57 return p->uses_slashes;
63 WvUrl::WvUrl(WvStringParm url) : err(
"No error")
66 char *cptr, *wptr = work.edit();
74 cptr = wptr + strcspn(wptr,
" \t\r\n");
79 if (get_default_port(wptr) < 0)
81 err =
"WvUrl cannot handle the given protocol.";
85 cptr = strchr(wptr,
':');
88 err =
"No colon after the protocol.";
94 bool use_slashes = protocol_uses_slashes(proto);
95 wptr = cptr + (use_slashes ? 3 : 1);
97 cptr = strchr(wptr,
'@');
106 char *cptr2 = strchr(wptr,
':');
107 if (cptr2 && (*(cptr2+1) != 0))
110 password = cptr2 + 1;
118 cptr = strchr(wptr,
'/');
120 file = use_slashes ?
"/" :
"";
127 cptr = strchr(wptr,
':');
129 port = get_default_port(proto);
142 WvUrl::WvUrl(
const WvUrl &url) : err(
"No error")
149 password = url.password;
160 if (addr)
delete addr;
164 bool WvUrl::resolve()
169 numaddrs = dns.
findaddr(0, hostname, &ip);
172 err =
WvString(
"Host '%s' could not be found.", hostname);
176 else if (numaddrs < 0)
184 if (addr)
delete addr;
196 return WvString(
"(Invalid URL: %s)", err);
199 if (protocol_uses_slashes(proto))
200 protostr =
WvString(
"%s://", proto);
204 if (user && user.len() != 0)
207 if (password && password.len() != 0)
208 userstr.append(
WvString(
":%s@", password));
213 if (port && port != get_default_port(proto))
218 return WvString(
"%s%s%s%s%s", protostr, userstr, *addr, portstr, file);