#define HAVE_FUNC 1
#endif
+#define ROUTE_MAX_HEADERS 20
+#define ROUTE_ENCODED_HEADER_MAX_CHARS (1024 * 3)
#define MAX_CODEC_CHECK_FRAMES 50
#define MAX_MISMATCH_FRAMES 5
#define MODNAME "mod_sofia"
uint32_t sofia_presence_get_cseq(sofia_profile_t *profile);
void sofia_glue_build_vid_refresh_message(switch_core_session_t *session, const char *pl);
+char *sofia_glue_get_encoded_fs_path(nua_handle_t *nh, sip_route_t *rt, switch_bool_t add_fs_path_prefix);
char *sofia_glue_gen_contact_str(sofia_profile_t *profile, sip_t const *sip, nua_handle_t *nh, sofia_dispatch_event_t *de, sofia_nat_parse_t *np);
void sofia_glue_pause_jitterbuffer(switch_core_session_t *session, switch_bool_t on);
void sofia_process_dispatch_event(sofia_dispatch_event_t **dep);
}
+char *sofia_glue_get_encoded_fs_path(nua_handle_t *nh, sip_route_t *rt, switch_bool_t add_fs_path_prefix)
+{
+ char *route = NULL;
+ int count = 0;
+ char route_buf[ROUTE_ENCODED_HEADER_MAX_CHARS] = {0};
+ sip_route_t *rrp;
+ switch_stream_handle_t rr_stream = { 0 };
+ SWITCH_STANDARD_STREAM(rr_stream);
+
+ if (add_fs_path_prefix) {
+ rr_stream.write_function(&rr_stream, ";fs_path=");
+ }
+
+ for(rrp = rt; rrp; rrp = rrp->r_next) {
+ char *sep = count == 0 ? "" : "%2C";
+ char *rr = sip_header_as_string(nua_handle_home(nh), (void *) rrp);
+ switch_url_encode(rr, route_buf, ROUTE_ENCODED_HEADER_MAX_CHARS);
+ rr_stream.write_function(&rr_stream, "%s%s", sep, route_buf);
+ su_free(nua_handle_home(nh), rr);
+
+ if (count >= ROUTE_MAX_HEADERS) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "ROUTE_MAX_HEADERS of %d reached\n", ROUTE_MAX_HEADERS);
+ break;
+ }
+ count++;
+ }
+
+ if (!zstr((char *) rr_stream.data)) {
+ route = rr_stream.data;
+ } else {
+ switch_safe_free(rr_stream.data);
+ }
+
+ // switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "fs_path with %d Route headers [%s]\n", count, route ? route : "");
+ return route;
+}
+
+
char *sofia_glue_gen_contact_str(sofia_profile_t *profile, sip_t const *sip, nua_handle_t *nh, sofia_dispatch_event_t *de, sofia_nat_parse_t *np)
{
char *contact_str = NULL;
}
if (sip->sip_record_route) {
- char *full_contact = sip_header_as_string(nua_handle_get_home(nh), (void *) contact);
- char *route = sofia_glue_strip_uri(sip_header_as_string(nua_handle_get_home(nh), (void *) sip->sip_record_route));
- char *full_contact_dup;
- char *route_encoded;
- int route_encoded_len;
- full_contact_dup = sofia_glue_get_url_from_contact(full_contact, 1);
- route_encoded_len = (int)(strlen(route) * 3) + 1;
- switch_zmalloc(route_encoded, route_encoded_len);
- switch_url_encode(route, route_encoded, route_encoded_len);
- contact_str = switch_mprintf("%s <%s;fs_path=%s>", display, full_contact_dup, route_encoded);
- free(route);
- free(full_contact_dup);
- free(route_encoded);
+ char *fs_path_str = sofia_glue_get_encoded_fs_path(nh, sip->sip_record_route, SWITCH_FALSE);
+ char *full_contact = sip_header_as_string(nua_handle_home(nh), (void *) contact);
+ char *full_contact_dup = sofia_glue_get_url_from_contact(full_contact, 1);
+ if (fs_path_str && full_contact_dup) {
+ contact_str = switch_mprintf("%s <%s;fs_path=%s>", display, full_contact_dup, fs_path_str);
+ } else {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Could not get fs_path str.\n");
+ }
+ switch_safe_free(fs_path_str);
+ switch_safe_free(full_contact_dup);
}
else if (np->is_nat && np->fs_path) {
char *full_contact = sip_header_as_string(nua_handle_get_home(nh), (void *) contact);
if (sip->sip_path) {
- char *path_stripped = NULL;
- char *path_val_to_encode = NULL;
- su_strlst_t *path_list = su_strlst_create(nua_handle_home(nh));
- sip_path_t *next_path = sip->sip_path;
- for (; next_path; next_path = next_path->r_next) {
- path_val = sip_header_as_string(nua_handle_home(nh), (void *) next_path);
- if (path_val) {
- path_stripped = sofia_glue_get_url_from_contact(path_val, SWITCH_TRUE);
- su_free(nua_handle_home(nh), path_val);
- su_strlst_dup_append(path_list, path_stripped);
- switch_safe_free(path_stripped);
- }
+ path_encoded = sofia_glue_get_encoded_fs_path(nh, sip->sip_path, SWITCH_TRUE);
+ if (!path_encoded) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Could not get fs_path str.\n");
}
- path_val = su_strlst_join(path_list, nua_handle_home(nh), ",");
- path_val_to_encode = su_strlst_join(path_list, nua_handle_home(nh), "%2C");
- su_strlst_destroy(path_list);
- if (path_val_to_encode) {
- path_encoded_len = (int)(strlen(path_val_to_encode) * 3) + 1;
- switch_zmalloc(path_encoded, path_encoded_len);
- switch_copy_string(path_encoded, ";fs_path=", 10);
- switch_url_encode(path_val_to_encode, path_encoded + 9, path_encoded_len - 9);
- su_free(nua_handle_home(nh), path_val_to_encode);
- }
} else if (is_nat) {
char my_contact_str[1024];
if (uparams) {