diff --git a/plugins/janus_sip.c b/plugins/janus_sip.c index 0ed13b8c9f..b30b8f7ed3 100644 --- a/plugins/janus_sip.c +++ b/plugins/janus_sip.c @@ -120,6 +120,7 @@ "outbound_proxy" : "", "headers" : "", "contact_params" : "", + "incoming_header_prefixes" : "", "refresh" : ", "master_id" : } @@ -206,6 +207,7 @@ "call_id" : "", "result" : { "event" : "ringing", + "headers" : "" } } \endverbatim @@ -221,7 +223,8 @@ "call_id" : "", "result" : { "event" : "accepted", - "username" : "" + "username" : "", + "headers" : "" } } \endverbatim @@ -242,7 +245,8 @@ "call_id" : "", "result" : { "event" : "progress", - "username" : "" + "username" : "", + "headers" : "" } } \endverbatim @@ -283,7 +287,8 @@ "displayname" : "", "referred_by" : "", "replaces" : "", - "srtp" : "" + "srtp" : "", + "headers" : "" } } \endverbatim @@ -388,7 +393,8 @@ "event" : "message", "sender" : "", "displayname" : "", - "content" : "" + "content" : "", + "headers" : "" } } \endverbatim @@ -415,7 +421,8 @@ "sender" : "", "displayname" : "", "type" : "", - "content" : "" + "content" : "", + "headers" : "" } } \endverbatim @@ -445,7 +452,8 @@ "notify" : "", "substate" : "", "content-type" : "" - "content" : "" + "content" : "", + "headers" : "" } } \endverbatim @@ -561,7 +569,8 @@ "refer_id" : , "refer_to" : "", "referred_by" : "", - "replaces" : "" + "replaces" : "", + "headers" : "" } } \endverbatim @@ -697,7 +706,8 @@ static struct janus_json_parameter register_parameters[] = { {"headers", JSON_OBJECT, 0}, {"contact_params", JSON_OBJECT, 0}, {"master_id", JANUS_JSON_INTEGER, 0}, - {"refresh", JANUS_JSON_BOOL, 0} + {"refresh", JANUS_JSON_BOOL, 0}, + {"incoming_header_prefixes", JSON_ARRAY, 0} }; static struct janus_json_parameter subscribe_parameters[] = { {"to", JSON_STRING, 0}, @@ -963,6 +973,7 @@ typedef struct janus_sip_session { janus_refcount ref; janus_mutex mutex; char *hangup_reason_header; + GList *incoming_header_prefixes; } janus_sip_session; static GHashTable *sessions; static GHashTable *identities; @@ -1072,6 +1083,10 @@ static void janus_sip_session_free(const janus_refcount *session_ref) { g_free(session->hangup_reason_header); session->hangup_reason_header = NULL; } + if(session->incoming_header_prefixes) { + g_list_free_full(session->incoming_header_prefixes, g_free); + session->incoming_header_prefixes = NULL; + } janus_sip_srtp_cleanup(session); g_free(session); } @@ -1385,6 +1400,29 @@ static void janus_sip_remove_quotes(char *str) { } } +static json_t *janus_sip_get_incoming_headers(const sip_t *sip, const janus_sip_session *session) { + json_t *headers = json_object(); + if(!sip) + return headers; + sip_unknown_t *unknown_header = sip->sip_unknown; + while(unknown_header != NULL) { + GList *temp = session->incoming_header_prefixes; + while(temp != NULL) { + char *header_prefix = (char *) temp->data; + if(header_prefix != NULL && unknown_header->un_name != NULL) { + if(strncasecmp(unknown_header->un_name, header_prefix, strlen(header_prefix)) == 0) { + const char *header_name = g_strdup(unknown_header->un_name); + json_object_set(headers, header_name, json_string(unknown_header->un_value)); + break; + } + } + temp = temp->next; + } + unknown_header = unknown_header->un_next; + } + return headers; +} + /* Error codes */ #define JANUS_SIP_ERROR_UNKNOWN_ERROR 499 #define JANUS_SIP_ERROR_NO_MESSAGE 440 @@ -2706,6 +2744,19 @@ static void *janus_sip_handler(void *data) { g_hash_table_insert(masters, GUINT_TO_POINTER(session->master_id), session); janus_mutex_unlock(&sessions_mutex); } + + json_t *header_prefixes_json = json_object_get(root, "incoming_header_prefixes"); + if(header_prefixes_json) { + size_t index = 0; + json_t *value = NULL; + + json_array_foreach(header_prefixes_json, index, value) { + const char *header_prefix = json_string_value(value); + if(header_prefix) + session->incoming_header_prefixes = g_list_append(session->incoming_header_prefixes, g_strdup(header_prefix)); + } + } + /* If this is a refresh, get rid of the old values */ if(refresh) { /* Cleanup old values */ @@ -4465,6 +4516,10 @@ void janus_sip_sofia_callback(nua_event_t event, int status, char const *phrase, if(sip->sip_from && sip->sip_from->a_display) { json_object_set_new(calling, "displayname", json_string(sip->sip_from->a_display)); } + if(session->incoming_header_prefixes) { + json_t *headers = janus_sip_get_incoming_headers(sip, session); + json_object_set_new(calling, "headers", headers); + } char *referred_by = NULL; if(sip->sip_referred_by && sip->sip_referred_by->b_url) { char *rby_text = url_as_string(session->stack->s_home, sip->sip_referred_by->b_url); @@ -4583,6 +4638,10 @@ void janus_sip_sofia_callback(nua_event_t event, int status, char const *phrase, json_object_set_new(result, "replaces", json_string(replaces)); g_free(replaces); } + if(session->incoming_header_prefixes) { + json_t *headers = janus_sip_get_incoming_headers(sip, session); + json_object_set_new(result, "headers", headers); + } su_free(session->stack->s_home, refer_to); if(custom_headers != NULL) su_free(session->stack->s_home, custom_headers); @@ -4615,6 +4674,10 @@ void janus_sip_sofia_callback(nua_event_t event, int status, char const *phrase, } json_object_set_new(result, "type", json_string(type)); json_object_set_new(result, "content", json_string(payload)); + if(session->incoming_header_prefixes) { + json_t *headers = janus_sip_get_incoming_headers(sip, session); + json_object_set_new(result, "headers", headers); + } json_object_set_new(info, "result", result); int ret = gateway->push_event(session->handle, &janus_sip_plugin, session->transaction, info, NULL); JANUS_LOG(LOG_VERB, " >> Pushing event to peer: %d (%s)\n", ret, janus_get_api_error(ret)); @@ -4645,6 +4708,10 @@ void janus_sip_sofia_callback(nua_event_t event, int status, char const *phrase, json_object_set_new(result, "displayname", json_string(sip->sip_from->a_display)); } json_object_set_new(result, "content", json_string(payload)); + if(session->incoming_header_prefixes) { + json_t *headers = janus_sip_get_incoming_headers(sip, session); + json_object_set_new(result, "headers", headers); + } json_object_set_new(message, "result", result); int ret = gateway->push_event(session->handle, &janus_sip_plugin, session->transaction, message, NULL); JANUS_LOG(LOG_VERB, " >> Pushing event to peer: %d (%s)\n", ret, janus_get_api_error(ret)); @@ -4681,6 +4748,10 @@ void janus_sip_sofia_callback(nua_event_t event, int status, char const *phrase, if(sip->sip_content_type != NULL) json_object_set_new(result, "content-type", json_string(sip->sip_content_type->c_type)); json_object_set_new(result, "content", json_string(sip->sip_payload->pl_data)); + if(session->incoming_header_prefixes) { + json_t *headers = janus_sip_get_incoming_headers(sip, session); + json_object_set_new(result, "headers", headers); + } json_object_set_new(notify, "result", result); int ret = gateway->push_event(session->handle, &janus_sip_plugin, session->transaction, notify, NULL); JANUS_LOG(LOG_VERB, " >> Pushing event to peer: %d (%s)\n", ret, janus_get_api_error(ret)); @@ -4768,6 +4839,10 @@ void janus_sip_sofia_callback(nua_event_t event, int status, char const *phrase, json_object_set_new(ringing, "sip", json_string("event")); json_t *result = json_object(); json_object_set_new(result, "event", json_string("ringing")); + if(session->incoming_header_prefixes) { + json_t *headers = janus_sip_get_incoming_headers(sip, session); + json_object_set_new(result, "headers", headers); + } json_object_set_new(ringing, "result", result); json_object_set_new(ringing, "call_id", json_string(session->callid)); int ret = gateway->push_event(session->handle, &janus_sip_plugin, session->transaction, ringing, NULL); @@ -4975,6 +5050,10 @@ void janus_sip_sofia_callback(nua_event_t event, int status, char const *phrase, json_object_set_new(calling, "username", json_string(session->callee)); if(is_focus) json_object_set_new(calling, "isfocus", json_true()); + if(session->incoming_header_prefixes) { + json_t *headers = janus_sip_get_incoming_headers(sip, session); + json_object_set_new(calling, "headers", headers); + } json_object_set_new(call, "result", calling); json_object_set_new(call, "call_id", json_string(session->callid)); int ret = gateway->push_event(session->handle, &janus_sip_plugin, session->transaction, call, jsep); @@ -5137,6 +5216,10 @@ void janus_sip_sofia_callback(nua_event_t event, int status, char const *phrase, json_object_set_new(result, "event", json_string("registration_failed")); json_object_set_new(result, "code", json_integer(status)); json_object_set_new(result, "reason", json_string(phrase ? phrase : "")); + if(session->incoming_header_prefixes) { + json_t *headers = janus_sip_get_incoming_headers(sip, session); + json_object_set_new(result, "headers", headers); + } json_object_set_new(event, "result", result); int ret = gateway->push_event(session->handle, &janus_sip_plugin, session->transaction, event, NULL); JANUS_LOG(LOG_VERB, " >> Pushing event to peer: %d (%s)\n", ret, janus_get_api_error(ret)); @@ -5161,6 +5244,10 @@ void janus_sip_sofia_callback(nua_event_t event, int status, char const *phrase, json_t *result = json_object(); json_object_set_new(result, "event", json_string("subscribe_succeeded")); json_object_set_new(result, "code", json_integer(status)); + if(session->incoming_header_prefixes) { + json_t *headers = janus_sip_get_incoming_headers(sip, session); + json_object_set_new(result, "headers", headers); + } json_object_set_new(result, "reason", json_string(phrase ? phrase : "")); json_object_set_new(event, "result", result); int ret = gateway->push_event(session->handle, &janus_sip_plugin, session->transaction, event, NULL); @@ -5227,6 +5314,10 @@ void janus_sip_sofia_callback(nua_event_t event, int status, char const *phrase, json_object_set_new(result, "event", json_string("subscribe_failed")); json_object_set_new(result, "code", json_integer(status)); json_object_set_new(result, "reason", json_string(phrase ? phrase : "")); + if(session->incoming_header_prefixes) { + json_t *headers = janus_sip_get_incoming_headers(sip, session); + json_object_set_new(result, "headers", headers); + } json_object_set_new(event, "result", result); int ret = gateway->push_event(session->handle, &janus_sip_plugin, session->transaction, event, NULL); JANUS_LOG(LOG_VERB, " >> Pushing event to peer: %d (%s)\n", ret, janus_get_api_error(ret));