belle_sip_uri_t *belle_sip_channel_create_routable_uri(belle_sip_channel_t *chan) { const char *transport = belle_sip_channel_get_transport_name_lower_case(chan); belle_sip_uri_t* uri = belle_sip_uri_new(); unsigned char natted = chan->public_ip && strcmp(chan->public_ip,chan->local_ip)!=0; if (natted) { belle_sip_uri_set_host(uri, chan->public_ip); belle_sip_uri_set_port(uri, chan->public_port); } else { belle_sip_uri_set_host(uri, chan->local_ip); // With streamed protocols listening port is what we want if (chan->lp) belle_sip_uri_set_port(uri, belle_sip_uri_get_port(chan->lp->listening_uri)); else belle_sip_uri_set_port(uri,chan->local_port); } belle_sip_uri_set_transport_param(uri, transport); belle_sip_uri_set_lr_param(uri, TRUE); return uri; }
static void add_initial_route_set(belle_sip_request_t *request, const MSList *list){ const MSList *elem; for (elem=list;elem!=NULL;elem=elem->next){ SalAddress *addr=(SalAddress*)elem->data; belle_sip_header_route_t *route; belle_sip_uri_t *uri; /*Optimization: if the initial route set only contains one URI which is the same as the request URI, ommit it*/ if (elem==list && list->next==NULL){ belle_sip_uri_t *requri=belle_sip_request_get_uri(request); /*skip the first route it is the same as the request uri*/ if (strcmp(sal_address_get_domain(addr),belle_sip_uri_get_host(requri))==0 ){ ms_message("Skipping top route of initial route-set because same as request-uri."); continue; } } route=belle_sip_header_route_create((belle_sip_header_address_t*)addr); uri=belle_sip_header_address_get_uri((belle_sip_header_address_t*)route); belle_sip_uri_set_lr_param(uri,1); belle_sip_message_add_header((belle_sip_message_t*)request,(belle_sip_header_t*)route); } }