endpoint Protocol::endpoint::from_string(std::string const& url, boost_ec & ec) { if (url.empty()) { ec = MakeNetworkErrorCode(eNetworkErrorCode::ec_url_parse_error); return endpoint(); } static ::boost::regex re("((.*)://)?([^:/]+)(:(\\d+))?(/.*)?"); boost::smatch result; bool ok = boost::regex_match(url, result, re); if (!ok) { ec = MakeNetworkErrorCode(eNetworkErrorCode::ec_url_parse_error); return endpoint(); } endpoint ep(::boost::asio::ip::address::from_string(result[3].str(), ec), atoi(result[5].str().c_str())); if (ec) return endpoint(); ep.proto_ = str2proto(result[2].str()); ep.path_ = result[6].str(); return ep; }
inline static struct proxy_l* t_protoaddr2proxy(char *proto_par, char *addr_par) { struct proxy_l *proxy = 0; avp_t* avp; avp_value_t val; int proto, port, err; str s; char *c; switch(((fparam_t *)proto_par)->type) { case FPARAM_AVP: if (!(avp = search_first_avp(((fparam_t *)proto_par)->v.avp.flags, ((fparam_t *)proto_par)->v.avp.name, &val, 0))) { proto = PROTO_NONE; } else { if (avp->flags & AVP_VAL_STR) { proto = str2proto(val.s.s, val.s.len); } else { proto = val.n; } } break; case FPARAM_INT: proto = ((fparam_t *)proto_par)->v.i; break; case FPARAM_STRING: proto = str2proto( ((fparam_t *)proto_par)->v.asciiz, strlen(((fparam_t *)proto_par)->v.asciiz)); break; default: ERR("BUG: Invalid proto parameter value in t_protoaddr2proxy\n"); return 0; } switch(((fparam_t *)addr_par)->type) { case FPARAM_AVP: if (!(avp = search_first_avp(((fparam_t *)addr_par)->v.avp.flags, ((fparam_t *)addr_par)->v.avp.name, &val, 0))) { s.len = 0; } else { if ((avp->flags & AVP_VAL_STR) == 0) { LOG(L_ERR, "tm:t_protoaddr2proxy: avp <%.*s> value is not string\n", ((fparam_t *)addr_par)->v.avp.name.s.len, ((fparam_t *)addr_par)->v.avp.name.s.s); return 0; } s = val.s; } break; case FPARAM_STRING: s.s = ((fparam_t *) addr_par)->v.asciiz; s.len = strlen(s.s); break; default: ERR("BUG: Invalid addr parameter value in t_protoaddr2proxy\n"); return 0; } port = 5060; if (s.len) { c = memchr(s.s, ':', s.len); if (c) { port = str2s(c+1, s.len-(c-s.s+1), &err); if (err!=0) { LOG(L_ERR, "tm:t_protoaddr2proxy: bad port number <%.*s>\n", s.len, s.s); return 0; } s.len = c-s.s; } } if (!s.len) { LOG(L_ERR, "tm: protoaddr2proxy: host name is empty\n"); return 0; } proxy=mk_proxy(&s, port, proto); if (proxy==0) { LOG(L_ERR, "tm: protoaddr2proxy: bad host name in URI <%.*s>\n", s.len, s.s ); return 0; } return proxy; }