[commit] r6688 - freeswitch/branches/stkn/sofia-exp/trunk/src/mod/endpoints/mod_sofia
Author: stkn Date: Tue Dec 11 19:47:25 2007 New Revision: 6688 Modified: freeswitch/branches/stkn/sofia-exp/trunk/src/mod/endpoints/mod_sofia/mod_sofia.c freeswitch/branches/stkn/sofia-exp/trunk/src/mod/endpoints/mod_sofia/mod_sofia.h freeswitch/branches/stkn/sofia-exp/trunk/src/mod/endpoints/mod_sofia/sofia.c freeswitch/branches/stkn/sofia-exp/trunk/src/mod/endpoints/mod_sofia/sofia_glue.c Log: Still not working... Modified: freeswitch/branches/stkn/sofia-exp/trunk/src/mod/endpoints/mod_sofia/mod_sofia.c ============================================================================== --- freeswitch/branches/stkn/sofia-exp/trunk/src/mod/endpoints/mod_sofia/mod_sofia.c (original) +++ freeswitch/branches/stkn/sofia-exp/trunk/src/mod/endpoints/mod_sofia/mod_sofia.c Tue Dec 11 19:47:25 2007 @@ -328,6 +328,8 @@ } } + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Answering channel with reply_contact: %s\n", tech_pvt->reply_contact); + nua_respond(tech_pvt->nh, SIP_200_OK, NUTAG_SESSION_TIMER(session_timeout), SIPTAG_CONTACT_STR(tech_pvt->reply_contact), Modified: freeswitch/branches/stkn/sofia-exp/trunk/src/mod/endpoints/mod_sofia/mod_sofia.h ============================================================================== --- freeswitch/branches/stkn/sofia-exp/trunk/src/mod/endpoints/mod_sofia/mod_sofia.h (original) +++ freeswitch/branches/stkn/sofia-exp/trunk/src/mod/endpoints/mod_sofia/mod_sofia.h Tue Dec 11 19:47:25 2007 @@ -220,6 +220,7 @@ char *username; char *url; char *bindurl; + char *tls_url; char *tls_bindurl; char *sipdomain; char *timer_name; @@ -533,4 +534,13 @@ \ if(_session) break; \ } while(!_session) - + + +/* + * Transport handling helper functions + */ +sofia_transport_t sofia_glue_via2transport(const sip_via_t *via); +sofia_transport_t sofia_glue_url2transport(const url_t *url); + +const char *sofia_glue_transport2str(const sofia_transport_t tp); +const char *sofia_glue_transport2scheme(const sofia_transport_t tp); Modified: freeswitch/branches/stkn/sofia-exp/trunk/src/mod/endpoints/mod_sofia/sofia.c ============================================================================== --- freeswitch/branches/stkn/sofia-exp/trunk/src/mod/endpoints/mod_sofia/sofia.c (original) +++ freeswitch/branches/stkn/sofia-exp/trunk/src/mod/endpoints/mod_sofia/sofia.c Tue Dec 11 19:47:25 2007 @@ -1062,8 +1062,10 @@ } if (profile->extsipip) { + profile->tls_url = switch_core_sprintf(profile->pool, "sips:mod_sofia@%s:%d", profile->extsipip, profile->tls_sip_port); profile->tls_bindurl = switch_core_sprintf(profile->pool, "sips:mod_sofia@%s:%d;maddr=%s", profile->extsipip, profile->tls_sip_port, profile->sipip); } else { + profile->tls_url = switch_core_sprintf(profile->pool, "sips:mod_sofia@%s:%d", profile->extsipip, profile->tls_sip_port); profile->tls_bindurl = switch_core_sprintf(profile->pool, "sips:mod_sofia@%s:%d", profile->sipip, profile->tls_sip_port); } @@ -2009,11 +2011,12 @@ if (sip->sip_to && sip->sip_to->a_url) { const char *val; - char *transport = (my_addrinfo->ai_socktype == SOCK_STREAM) ? "tcp" : "udp"; - + sofia_transport_t transport = sofia_glue_url2transport(sip->sip_contact->m_url); + url_set_chanvars(session, sip->sip_to->a_url, sip_to); if ((val = switch_channel_get_variable(channel, "sip_to_uri"))) { - tech_pvt->to_uri = switch_core_session_sprintf(session, "sip:%s;transport=%s", val, transport); + + tech_pvt->to_uri = switch_core_session_sprintf(session, "%s:%s;transport=%s", sofia_glue_transport2scheme(transport), val, sofia_glue_transport2str(transport)); if (profile->ndlb & PFLAG_NDLB_TO_IN_200_CONTACT) { if (strchr(tech_pvt->to_uri, '>')) { tech_pvt->reply_contact = tech_pvt->to_uri; @@ -2022,18 +2025,20 @@ } } else { if (strchr(profile->url, '>')) { - tech_pvt->reply_contact = switch_core_session_sprintf(session, "%s;transport=%s", profile->url, transport); + tech_pvt->reply_contact = switch_core_session_sprintf(session, "%s;transport=%s", profile->url, sofia_glue_transport2str(transport)); } else { - tech_pvt->reply_contact = switch_core_session_sprintf(session, "<%s;transport=%s>", profile->url, transport); + tech_pvt->reply_contact = switch_core_session_sprintf(session, "<%s;transport=%s>", profile->url, sofia_glue_transport2str(transport)); } } } else { if (strchr(profile->url, '>')) { - tech_pvt->reply_contact = switch_core_session_sprintf(session, "%s;transport=%s", profile->url, transport); + tech_pvt->reply_contact = switch_core_session_sprintf(session, "%s;transport=%s", profile->url, sofia_glue_transport2str(transport)); } else { - tech_pvt->reply_contact = switch_core_session_sprintf(session, "<%s;transport=%s>", profile->url, transport); + tech_pvt->reply_contact = switch_core_session_sprintf(session, "<%s;transport=%s>", profile->url, sofia_glue_transport2str(transport)); } } + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Resulting Reply-Contact: %s\n", tech_pvt->reply_contact); } if (sip->sip_contact && sip->sip_contact->m_url) { Modified: freeswitch/branches/stkn/sofia-exp/trunk/src/mod/endpoints/mod_sofia/sofia_glue.c ============================================================================== --- freeswitch/branches/stkn/sofia-exp/trunk/src/mod/endpoints/mod_sofia/sofia_glue.c (original) +++ freeswitch/branches/stkn/sofia-exp/trunk/src/mod/endpoints/mod_sofia/sofia_glue.c Tue Dec 11 19:47:25 2007 @@ -471,7 +471,121 @@ return SOFIA_TRANSPORT_UNKNOWN; } -static const char *sofia_glue_transport2str(const sofia_transport_t tp) +sofia_transport_t sofia_glue_url2transport(const url_t *url) +{ + char *ptr = NULL; + int tls = 0; + + if(!url) + return SOFIA_TRANSPORT_UNKNOWN; + + if (url->url_scheme && !strcasecmp(url->url_scheme, "sips")) { + tls++; + } + + ptr = (char *)url->url_params; + while(ptr) { + + if (!strncasecmp(ptr, "transport", 9)) { + ptr += 10; + + if (!strncasecmp(ptr, "udp", 3)) { + return SOFIA_TRANSPORT_UDP; + } + else if (!strncasecmp(ptr, "tcp", 3)) { + return SOFIA_TRANSPORT_TCP; + } + else if (!strncasecmp(ptr, "tls", 3)) { + return SOFIA_TRANSPORT_TCP_TLS; + } + else if (!strncasecmp(ptr, "sctp", 4)) { + return SOFIA_TRANSPORT_SCTP; + } + break; + } + + if ((ptr = strchr(ptr, ';'))) + ptr++; + } + + return (tls) ? SOFIA_TRANSPORT_TCP_TLS : SOFIA_TRANSPORT_UDP; +} + +sofia_transport_t sofia_glue_via2transport(const sip_via_t *via) +{ + char *ptr = NULL; + int tls = 0; + + if (!via || !via->v_protocol) + return SOFIA_TRANSPORT_UNKNOWN; + + if (!strcasecmp(via->v_protocol, "sips")) { + tls++; + } + + if ((ptr = strrchr(via->v_protocol, '/'))) { + ptr++; + + if (!strcasecmp(ptr, "udp")) { + return SOFIA_TRANSPORT_UDP; + } + else if(!strcasecmp(ptr, "tcp")) { + return SOFIA_TRANSPORT_TCP; + } + else if(!strcasecmp(ptr, "tls")) { + return SOFIA_TRANSPORT_TCP_TLS; + } + else if(!strcasecmp(ptr, "sctp")) { + return SOFIA_TRANSPORT_SCTP; + } + } + + return SOFIA_TRANSPORT_UNKNOWN; +} + +#if 0 +sofia_transport_t sofia_glue_uri2transport(const char *uri) +{ + char *scheme = NULL, *transport = NULL; + int tls = 0; + + if ((scheme = strchr(uri, '<'))) { + scheme++; + } else { + scheme = (char *)uri; + } + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "scheme: %s\n", scheme); + + if (!strncasecmp(scheme, "sips", 4)) { + tls = 1; + } + + if (!(transport = strchr(uri, ';'))) { + return (tls) ? SOFIA_TRANSPORT_TCP_TLS : SOFIA_TRANSPORT_UDP; + } else { + transport = strchr(transport, '='); + if (transport) + transport++; + } + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "transport: %s\n", transport); + + if (!strncasecmp(transport, "tls", 3)) { + return SOFIA_TRANSPORT_TCP_TLS; + } + else if (!strncasecmp(transport, "tcp", 3)) { + return (tls) ? SOFIA_TRANSPORT_TCP_TLS : SOFIA_TRANSPORT_TCP; + } + else if (!strncasecmp(transport, "sctp", 4)) { + return SOFIA_TRANSPORT_SCTP; + } + + return (tls) ? SOFIA_TRANSPORT_TCP_TLS : SOFIA_TRANSPORT_UDP; +} +#endif + +const char *sofia_glue_transport2str(const sofia_transport_t tp) { switch(tp) { case SOFIA_TRANSPORT_TCP: @@ -488,7 +602,7 @@ } } -static const char *sofia_glue_transport2scheme(const sofia_transport_t tp) +const char *sofia_glue_transport2scheme(const sofia_transport_t tp) { switch (tp) { case SOFIA_TRANSPORT_TCP_TLS: @@ -499,6 +613,17 @@ } } +static int sofia_glue_transport_has_tls(const sofia_transport_t tp) +{ + switch(tp) { + case SOFIA_TRANSPORT_TCP_TLS: + return 1; + + default: + return 0; + } +} + char *sofia_overcome_sip_uri_weakness(switch_core_session_t *session, const char *uri, const sofia_transport_t transport, switch_bool_t uri_only) { char *stripped = switch_core_session_strdup(session, uri); @@ -611,7 +736,7 @@ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "URL Error! [%s]\n", tech_pvt->dest); return SWITCH_STATUS_FALSE; } - + if ((d_url = sofia_glue_get_url_from_contact(tech_pvt->dest, 1))) { url = d_url; } else { @@ -620,16 +745,12 @@ url_str = url; - if (switch_strlen_zero(tech_pvt->invite_contact)) { - tech_pvt->invite_contact = tech_pvt->profile->url; - } - if (!switch_strlen_zero(tech_pvt->gateway_from_str)) { use_from_str = tech_pvt->gateway_from_str; } else { use_from_str = tech_pvt->from_str; } - + rpid_domain = switch_core_session_strdup(session, use_from_str); sofia_glue_get_url_from_contact(rpid_domain, 0); if ((rpid_domain = strchr(rpid_domain, '@'))) { @@ -655,12 +776,19 @@ } } + if (switch_strlen_zero(tech_pvt->invite_contact)) { + if (sofia_glue_transport_has_tls(transport)) + tech_pvt->invite_contact = tech_pvt->profile->tls_url; + else + tech_pvt->invite_contact = tech_pvt->profile->url; + } + url_str = sofia_overcome_sip_uri_weakness(session, url, transport, SWITCH_TRUE); invite_contact = sofia_overcome_sip_uri_weakness(session, tech_pvt->invite_contact, transport, SWITCH_FALSE); from_str = sofia_overcome_sip_uri_weakness(session, use_from_str, 0, SWITCH_FALSE); to_str = sofia_overcome_sip_uri_weakness(session, tech_pvt->dest_to, 0, SWITCH_FALSE); - - /* + + /* Does the "genius" who wanted SIP to be "text-based" so it was "easier to read" even use it now, or did he just suggest it to make our lives miserable? */
participants (1)
-
Freeswitch SVN