From dafdcc623cd46dba3663a3b5bb2663f8630a3a00 Mon Sep 17 00:00:00 2001 From: Sean Bright Date: Mon, 27 Jan 2020 20:58:53 -0500 Subject: [PATCH] res_pjsip_messaging: Allow Content-Type to be overridden ASTERISK-26082 #close Reported by: Alex Change-Id: I6549e90932016349bc72b0f053432dc25286f4fb --- res/res_pjsip_messaging.c | 38 +++++++++++++++++++++++++++++++++----- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/res/res_pjsip_messaging.c b/res/res_pjsip_messaging.c index 76d37f2b3b..da08b44df9 100644 --- a/res/res_pjsip_messaging.c +++ b/res/res_pjsip_messaging.c @@ -317,10 +317,7 @@ static int is_msg_var_blocked(const char *name) { int i; - /* - * Don't block Content-Type or Max-Forwards headers because the - * user can override them. - */ + /* Don't block the Max-Forwards header because the user can override it */ static const char *hdr[] = { "To", "From", @@ -331,6 +328,7 @@ static int is_msg_var_blocked(const char *name) "CSeq", "Allow", "Content-Length", + "Content-Type", "Request-URI", }; @@ -636,11 +634,40 @@ static struct msg_data *msg_data_create(const struct ast_msg *msg, const char *t return mdata; } +static void update_content_type(pjsip_tx_data *tdata, struct ast_msg *msg, struct ast_sip_body *body) +{ + static const pj_str_t CONTENT_TYPE = { "Content-Type", sizeof("Content-Type") - 1 }; + + const char *content_type = ast_msg_get_var(msg, pj_strbuf(&CONTENT_TYPE)); + if (content_type) { + pj_str_t type, subtype; + pjsip_ctype_hdr *parsed; + + /* Let pjsip do the parsing for us */ + parsed = pjsip_parse_hdr(tdata->pool, &CONTENT_TYPE, + ast_strdupa(content_type), strlen(content_type), + NULL); + + if (!parsed) { + ast_log(LOG_WARNING, "Failed to parse '%s' as a content type. Using text/plain\n", + content_type); + return; + } + + /* We need to turn type and subtype into zero-terminated strings */ + pj_strdup_with_null(tdata->pool, &type, &parsed->media.type); + pj_strdup_with_null(tdata->pool, &subtype, &parsed->media.subtype); + + body->type = pj_strbuf(&type); + body->subtype = pj_strbuf(&subtype); + } +} + static int msg_send(void *data) { RAII_VAR(struct msg_data *, mdata, data, ao2_cleanup); - const struct ast_sip_body body = { + struct ast_sip_body body = { .type = "text", .subtype = "plain", .body_text = ast_msg_get_body(mdata->msg) @@ -665,6 +692,7 @@ static int msg_send(void *data) update_to(tdata, mdata->to); update_from(tdata, mdata->from); + update_content_type(tdata, mdata->msg, &body); if (ast_sip_add_body(tdata, &body)) { pjsip_tx_data_dec_ref(tdata);