Add pjsip_regc_add_headers() APi to set headers to be added
to the REGISTER request. This solves the problem where headers
registered in the initial REGISTER request (such as User-Agent
header) are not sent in subsequent reregistration request.
git-svn-id: https://svn.pjsip.org/repos/pjproject/trunk@799 74dad513-b988-da41-8d7b-12977e46ad98
diff --git a/pjsip/src/pjsip-ua/sip_reg.c b/pjsip/src/pjsip-ua/sip_reg.c
index b777048..20bfb78 100644
--- a/pjsip/src/pjsip-ua/sip_reg.c
+++ b/pjsip/src/pjsip-ua/sip_reg.c
@@ -65,6 +65,7 @@
pjsip_expires_hdr *unreg_expires_hdr;
pj_uint32_t expires;
pjsip_route_hdr route_set;
+ pjsip_hdr hdr_list;
/* Authorization sessions. */
pjsip_auth_clt_sess auth_sess;
@@ -106,6 +107,7 @@
return status;
pj_list_init(®c->route_set);
+ pj_list_init(®c->hdr_list);
/* Done */
*p_regc = regc;
@@ -307,6 +309,25 @@
return PJ_SUCCESS;
}
+PJ_DEF(pj_status_t) pjsip_regc_add_headers( pjsip_regc *regc,
+ const pjsip_hdr *hdr_list)
+{
+ const pjsip_hdr *hdr;
+
+ PJ_ASSERT_RETURN(regc && hdr_list, PJ_EINVAL);
+
+ //This is "add" operation, so don't remove headers.
+ //pj_list_init(®c->hdr_list);
+
+ hdr = hdr_list->next;
+ while (hdr != hdr_list) {
+ pj_list_push_back(®c->hdr_list, pjsip_hdr_clone(regc->pool, hdr));
+ hdr = hdr->next;
+ }
+
+ return PJ_SUCCESS;
+}
+
static pj_status_t create_request(pjsip_regc *regc,
pjsip_tx_data **p_tdata)
{
@@ -350,6 +371,18 @@
}
}
+ /* Add additional request headers */
+ if (!pj_list_empty(®c->hdr_list)) {
+ const pjsip_hdr *hdr;
+
+ hdr = regc->hdr_list.next;
+ while (hdr != ®c->hdr_list) {
+ pjsip_hdr *new_hdr = pjsip_hdr_shallow_clone(tdata->pool, hdr);
+ pjsip_msg_add_hdr(tdata->msg, new_hdr);
+ hdr = hdr->next;
+ }
+ }
+
/* Done. */
*p_tdata = tdata;
return PJ_SUCCESS;
diff --git a/pjsip/src/pjsua-lib/pjsua_acc.c b/pjsip/src/pjsua-lib/pjsua_acc.c
index 10cc236..fd71f99 100644
--- a/pjsip/src/pjsua-lib/pjsua_acc.c
+++ b/pjsip/src/pjsua-lib/pjsua_acc.c
@@ -550,6 +550,22 @@
pjsip_regc_set_route_set( acc->regc, &acc->route_set );
}
+ /* Add other request headers. */
+ if (pjsua_var.ua_cfg.user_agent.slen) {
+ pjsip_hdr hdr_list;
+ const pj_str_t STR_USER_AGENT = { "User-Agent", 10 };
+ pjsip_generic_string_hdr *h;
+
+ pool = pj_pool_create_on_buf(NULL, contact_buf, sizeof(contact_buf));
+ pj_list_init(&hdr_list);
+
+ h = pjsip_generic_string_hdr_create(pool, &STR_USER_AGENT,
+ &pjsua_var.ua_cfg.user_agent);
+ pj_list_push_back(&hdr_list, (pjsip_hdr*)h);
+
+ pjsip_regc_add_headers(acc->regc, &hdr_list);
+ }
+
return PJ_SUCCESS;
}
@@ -596,7 +612,7 @@
}
if (status == PJ_SUCCESS) {
- pjsua_process_msg_data(tdata, NULL);
+ //pjsua_process_msg_data(tdata, NULL);
status = pjsip_regc_send( pjsua_var.acc[acc_id].regc, tdata );
}