diff --git a/conf/vanilla/sip_profiles/internal.xml b/conf/vanilla/sip_profiles/internal.xml index d2af883b9d..583db26db3 100644 --- a/conf/vanilla/sip_profiles/internal.xml +++ b/conf/vanilla/sip_profiles/internal.xml @@ -185,6 +185,7 @@ + diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.h b/src/mod/endpoints/mod_sofia/mod_sofia.h index 5249bee570..71e9862a69 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.h +++ b/src/mod/endpoints/mod_sofia/mod_sofia.h @@ -271,6 +271,7 @@ typedef enum { PFLAG_TCP_PINGPONG, PFLAG_TCP_PING2PONG, PFLAG_MESSAGES_RESPOND_200_OK, + PFLAG_SUBSCRIBE_RESPOND_200_OK, PFLAG_PARSE_ALL_INVITE_HEADERS, /* No new flags below this line */ PFLAG_MAX diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c index 694d3d4856..915a6dee64 100644 --- a/src/mod/endpoints/mod_sofia/sofia.c +++ b/src/mod/endpoints/mod_sofia/sofia.c @@ -4045,6 +4045,12 @@ switch_status_t config_sofia(sofia_config_t reload, char *profile_name) } else { sofia_clear_pflag(profile, PFLAG_MESSAGES_RESPOND_200_OK); } + } else if (!strcasecmp(var, "sip-subscribe-respond-200-ok") && !zstr(val)) { + if (switch_true(val)) { + sofia_set_pflag(profile, PFLAG_SUBSCRIBE_RESPOND_200_OK); + } else { + sofia_clear_pflag(profile, PFLAG_SUBSCRIBE_RESPOND_200_OK); + } } else if (!strcasecmp(var, "odbc-dsn") && !zstr(val)) { profile->odbc_dsn = switch_core_strdup(profile->pool, val); } else if (!strcasecmp(var, "db-pre-trans-execute") && !zstr(val)) { diff --git a/src/mod/endpoints/mod_sofia/sofia_presence.c b/src/mod/endpoints/mod_sofia/sofia_presence.c index b6fb25e992..868bf5ff64 100644 --- a/src/mod/endpoints/mod_sofia/sofia_presence.c +++ b/src/mod/endpoints/mod_sofia/sofia_presence.c @@ -3875,8 +3875,11 @@ void sofia_presence_handle_sip_i_subscribe(int status, switch_event_t *params = NULL; /* Grandstream REALLY uses a header called Message Body */ extra_headers = switch_mprintf("MessageBody: %s\r\n", profile->pnp_prov_url); - - nua_respond(nh, SIP_202_ACCEPTED, NUTAG_WITH_THIS_MSG(de->data->e_msg), TAG_END()); + if (sofia_test_pflag(profile, PFLAG_SUBSCRIBE_RESPOND_200_OK)) { + nua_respond(nh, SIP_200_OK, NUTAG_WITH_THIS_MSG(de->data->e_msg), TAG_END()); + } else { + nua_respond(nh, SIP_202_ACCEPTED, NUTAG_WITH_THIS_MSG(de->data->e_msg), TAG_END()); + } switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "sending pnp NOTIFY for %s to provision to %s\n", uri, profile->pnp_prov_url); @@ -3956,11 +3959,19 @@ void sofia_presence_handle_sip_i_subscribe(int status, if (mod_sofia_globals.debug_presence > 0) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Responding to SUBSCRIBE with 202 Accepted\n"); } - nua_respond(nh, SIP_202_ACCEPTED, - SIPTAG_TO(sip->sip_to), - TAG_IF(new_contactstr, SIPTAG_CONTACT_STR(new_contactstr)), - NUTAG_WITH_THIS_MSG(de->data->e_msg), - SIPTAG_SUBSCRIPTION_STATE_STR(sstr), SIPTAG_EXPIRES_STR(exp_delta_str), TAG_IF(sticky, NUTAG_PROXY(sticky)), TAG_END()); + if (sofia_test_pflag(profile, PFLAG_SUBSCRIBE_RESPOND_200_OK)) { + nua_respond(nh, SIP_200_OK, + SIPTAG_TO(sip->sip_to), + TAG_IF(new_contactstr, SIPTAG_CONTACT_STR(new_contactstr)), + NUTAG_WITH_THIS_MSG(de->data->e_msg), + SIPTAG_SUBSCRIPTION_STATE_STR(sstr), SIPTAG_EXPIRES_STR(exp_delta_str), TAG_IF(sticky, NUTAG_PROXY(sticky)), TAG_END()); + } else { + nua_respond(nh, SIP_202_ACCEPTED, + SIPTAG_TO(sip->sip_to), + TAG_IF(new_contactstr, SIPTAG_CONTACT_STR(new_contactstr)), + NUTAG_WITH_THIS_MSG(de->data->e_msg), + SIPTAG_SUBSCRIPTION_STATE_STR(sstr), SIPTAG_EXPIRES_STR(exp_delta_str), TAG_IF(sticky, NUTAG_PROXY(sticky)), TAG_END()); + } switch_safe_free(new_contactstr); switch_safe_free(sticky);