From 5bcf68c92d15389f02ed0717146977a8f6734ab9 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Wed, 6 Feb 2013 09:48:04 -0600 Subject: [PATCH] handle route for ws and wss transport --- src/mod/endpoints/mod_sofia/mod_sofia.h | 4 +++- src/mod/endpoints/mod_sofia/sofia.c | 21 +++++++++++++++------ src/mod/endpoints/mod_sofia/sofia_glue.c | 10 ++++++++++ 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.h b/src/mod/endpoints/mod_sofia/mod_sofia.h index 269371b30c..e08e9d95ae 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.h +++ b/src/mod/endpoints/mod_sofia/mod_sofia.h @@ -391,7 +391,9 @@ typedef enum { SOFIA_TRANSPORT_UDP, SOFIA_TRANSPORT_TCP, SOFIA_TRANSPORT_TCP_TLS, - SOFIA_TRANSPORT_SCTP + SOFIA_TRANSPORT_SCTP, + SOFIA_TRANSPORT_WS, + SOFIA_TRANSPORT_WSS } sofia_transport_t; typedef enum { diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c index 10f0fc61f2..9c292024d9 100644 --- a/src/mod/endpoints/mod_sofia/sofia.c +++ b/src/mod/endpoints/mod_sofia/sofia.c @@ -7671,6 +7671,10 @@ void sofia_handle_sip_i_invite(switch_core_session_t *session, nua_t *nua, sofia sofia_glue_get_addr(de->data->e_msg, network_ip, sizeof(network_ip), &network_port); + if (sip && sip->sip_via && sip->sip_via->v_protocol && switch_stristr("sip/2.0/ws", sip->sip_via->v_protocol)) { + is_nat = "websockets"; + } + if (sofia_test_pflag(profile, PFLAG_AGGRESSIVE_NAT_DETECTION)) { if (sip && sip->sip_via) { const char *port = sip->sip_via->v_port; @@ -7897,17 +7901,22 @@ void sofia_handle_sip_i_invite(switch_core_session_t *session, nua_t *nua, sofia } } - if (sip->sip_contact && sip->sip_contact->m_url) { + if (sip->sip_via || (sip->sip_contact && sip->sip_contact->m_url)) { char tmp[35] = ""; const char *ipv6 = strchr(tech_pvt->mparams.remote_ip, ':'); - transport = sofia_glue_url2transport(sip->sip_contact->m_url); + if (sip->sip_via) { + transport = sofia_glue_via2transport(sip->sip_via); + } else { + transport = sofia_glue_url2transport(sip->sip_contact->m_url); + } + - tech_pvt->record_route= + tech_pvt->record_route = switch_core_session_sprintf(session, - "sip:%s@%s%s%s:%d;transport=%s", - sip->sip_contact->m_url->url_user, - ipv6 ? "[" : "", tech_pvt->mparams.remote_ip, ipv6 ? "]" : "", tech_pvt->mparams.remote_port, sofia_glue_transport2str(transport)); + "sip:%s%s%s:%d;transport=%s", + ipv6 ? "[" : "", tech_pvt->mparams.remote_ip, ipv6 ? "]" : "", + tech_pvt->mparams.remote_port, sofia_glue_transport2str(transport)); switch_channel_set_variable(channel, "sip_received_ip", tech_pvt->mparams.remote_ip); snprintf(tmp, sizeof(tmp), "%d", tech_pvt->mparams.remote_port); diff --git a/src/mod/endpoints/mod_sofia/sofia_glue.c b/src/mod/endpoints/mod_sofia/sofia_glue.c index a4b4749222..5a788867fe 100644 --- a/src/mod/endpoints/mod_sofia/sofia_glue.c +++ b/src/mod/endpoints/mod_sofia/sofia_glue.c @@ -386,6 +386,10 @@ sofia_transport_t sofia_glue_via2transport(const sip_via_t * via) return SOFIA_TRANSPORT_TCP_TLS; } else if (!strncasecmp(ptr, "sctp", 4)) { return SOFIA_TRANSPORT_SCTP; + } else if (!strncasecmp(ptr, "wss", 3)) { + return SOFIA_TRANSPORT_WSS; + } else if (!strncasecmp(ptr, "ws", 2)) { + return SOFIA_TRANSPORT_WS; } } @@ -404,6 +408,12 @@ const char *sofia_glue_transport2str(const sofia_transport_t tp) case SOFIA_TRANSPORT_SCTP: return "sctp"; + case SOFIA_TRANSPORT_WS: + return "ws"; + + case SOFIA_TRANSPORT_WSS: + return "wss"; + default: return "udp"; }