From 33db47652628b299c96a591ec939ca2ea9f6e268 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lauren=C8=9Biu=20Nicola?= Date: Thu, 11 Nov 2021 18:51:59 +0200 Subject: [PATCH] presence: add option to return 200 instead of 202 on subscriptions RFC6665 mandates 200 return codes, although 202 seems mandated by RFC3265. We add a new parameter, `subs_respond_200`, to control this. --- src/modules/presence/doc/presence_admin.xml | 25 ++++++++++++++++++++- src/modules/presence/presence.c | 2 ++ src/modules/presence/presence.h | 1 + src/modules/presence/subscribe.c | 24 ++++++++++++-------- 4 files changed, 42 insertions(+), 10 deletions(-) diff --git a/src/modules/presence/doc/presence_admin.xml b/src/modules/presence/doc/presence_admin.xml index 32b67d6c6bb..18d276b73d7 100644 --- a/src/modules/presence/doc/presence_admin.xml +++ b/src/modules/presence/doc/presence_admin.xml @@ -792,7 +792,7 @@ modparam("presence", "subs_remove_match", 1) so newer documents have higher priority. - delete_subscription - integer value to + delete_subscription - integer value to give extra control of deleting the subscription after processing of event_route[presence:notify-reply]. If value = 1, it deletes the subscription. If xavp_cfg parameter is set but this attribute is not in the avp, @@ -980,6 +980,29 @@ modparam("presence", "timer_mode", 0) +
+ <varname>subs_respond_200</varname> (integer) + + Specify the response code for accepted SUBSCRIBE requests. + If set to 0, 202 Accepted will be returned. + If set to 1, 200 OK will be returned instead, in conformance to RFC6665 + which prohibits 202 responses. + + + + Default value is 0. + + + + Set <varname>subs_respond_200</varname> parameter + +... +modparam("presence", "subs_respond_200", 1) +... + + +
+
diff --git a/src/modules/presence/presence.c b/src/modules/presence/presence.c index 09751bbc15d..3e1e3474904 100644 --- a/src/modules/presence/presence.c +++ b/src/modules/presence/presence.c @@ -166,6 +166,7 @@ int pres_retrieve_order = 0; str pres_retrieve_order_by = str_init("priority"); int pres_enable_dmq = 0; int pres_delete_same_subs = 0; +int pres_subs_respond_200 = 0; int pres_db_table_lock_type = 1; db_locking_t pres_db_table_lock = DB_LOCKING_WRITE; @@ -243,6 +244,7 @@ static param_export_t params[]={ { "pres_subs_mode", PARAM_INT, &_pres_subs_mode}, { "delete_same_subs", PARAM_INT, &pres_delete_same_subs}, { "timer_mode", PARAM_INT, &pres_timer_mode}, + { "subs_respond_200", PARAM_INT, &pres_subs_respond_200}, {0,0,0} }; diff --git a/src/modules/presence/presence.h b/src/modules/presence/presence.h index e0e3495be66..381029184ad 100644 --- a/src/modules/presence/presence.h +++ b/src/modules/presence/presence.h @@ -99,6 +99,7 @@ extern str pres_xavp_cfg; extern int pres_retrieve_order; extern str pres_retrieve_order_by; extern int pres_enable_dmq; +extern int pres_subs_respond_200; extern int phtable_size; extern phtable_t *pres_htable; diff --git a/src/modules/presence/subscribe.c b/src/modules/presence/subscribe.c index 40421befb6c..b53528ce804 100644 --- a/src/modules/presence/subscribe.c +++ b/src/modules/presence/subscribe.c @@ -56,6 +56,10 @@ static str pu_500_rpl = str_init("Server Internal Error"); static str pu_489_rpl = str_init("Bad Event"); static str pu_423_rpl = str_init("Interval Too Brief"); +static int get_ok_reply_code() { + return pres_subs_respond_200 ? 200 : 202; +} + static int send_2XX_reply(sip_msg_t *msg, int reply_code, unsigned int lexpire, str *local_contact) { @@ -498,6 +502,7 @@ int update_subscription_notifier( struct sip_msg *msg, subs_t *subs, int to_tag_gen, int *sent_reply) { int num_peers = 0; + int reply_code; *sent_reply = 0; @@ -539,11 +544,9 @@ int update_subscription_notifier( } } - if(send_2XX_reply(msg, subs->event->type & PUBL_TYPE ? 202 : 200, - subs->expires, &subs->local_contact) - < 0) { - LM_ERR("sending %d response\n", - subs->event->type & PUBL_TYPE ? 202 : 200); + reply_code = subs->event->type & PUBL_TYPE ? get_ok_reply_code() : 200; + if(send_2XX_reply(msg, reply_code, subs->expires, &subs->local_contact) < 0) { + LM_ERR("sending %d response\n", reply_code); goto error; } *sent_reply = 1; @@ -558,6 +561,7 @@ int update_subscription( struct sip_msg *msg, subs_t *subs, int to_tag_gen, int *sent_reply) { unsigned int hash_code; + int reply_code; LM_DBG("update subscription\n"); printf_subs(subs); @@ -573,9 +577,10 @@ int update_subscription( &subs->from_tag, &subs->callid); if(subs->event->type & PUBL_TYPE) { - if(send_2XX_reply(msg, 202, subs->expires, &subs->local_contact) + reply_code = get_ok_reply_code(); + if(send_2XX_reply(msg, reply_code, subs->expires, &subs->local_contact) < 0) { - LM_ERR("sending 202 OK\n"); + LM_ERR("sending %d OK\n", reply_code); goto error; } *sent_reply = 1; @@ -656,8 +661,9 @@ int update_subscription( /* reply_and_notify */ if(subs->event->type & PUBL_TYPE) { - if(send_2XX_reply(msg, 202, subs->expires, &subs->local_contact) < 0) { - LM_ERR("sending 202 OK reply\n"); + reply_code = get_ok_reply_code(); + if(send_2XX_reply(msg, reply_code, subs->expires, &subs->local_contact) < 0) { + LM_ERR("sending %d OK\n", reply_code); goto error; } *sent_reply = 1;