From 10e7c015b190778b45539a5d7f5c27d50a2b2ccf Mon Sep 17 00:00:00 2001 From: Richard Aas Date: Mon, 24 Mar 2014 14:13:13 +0000 Subject: [PATCH] sipsess: added sipsess_set_close_headers() --- include/re_sipsess.h | 1 + src/sipsess/close.c | 4 +++- src/sipsess/listen.c | 6 +++++- src/sipsess/sess.c | 30 ++++++++++++++++++++++++++++++ src/sipsess/sipsess.h | 1 + 5 files changed, 40 insertions(+), 2 deletions(-) diff --git a/include/re_sipsess.h b/include/re_sipsess.h index a97e343..e74d046 100644 --- a/include/re_sipsess.h +++ b/include/re_sipsess.h @@ -55,5 +55,6 @@ int sipsess_reject(struct sipsess *sess, uint16_t scode, const char *reason, int sipsess_modify(struct sipsess *sess, struct mbuf *desc); int sipsess_info(struct sipsess *sess, const char *ctype, struct mbuf *body, sip_resp_h *resph, void *arg); +int sipsess_set_close_headers(struct sipsess *sess, const char *hdrs, ...); void sipsess_close_all(struct sipsess_sock *sock); struct sip_dialog *sipsess_dialog(const struct sipsess *sess); diff --git a/src/sipsess/close.c b/src/sipsess/close.c index f13ea39..b680a9a 100644 --- a/src/sipsess/close.c +++ b/src/sipsess/close.c @@ -67,6 +67,8 @@ int sipsess_bye(struct sipsess *sess, bool reset_ls) return sip_drequestf(&sess->req, sess->sip, true, "BYE", sess->dlg, 0, sess->auth, NULL, bye_resp_handler, sess, + "%s" "Content-Length: 0\r\n" - "\r\n"); + "\r\n", + sess->close_hdrs); } diff --git a/src/sipsess/listen.c b/src/sipsess/listen.c index c81eff9..86a0ece 100644 --- a/src/sipsess/listen.c +++ b/src/sipsess/listen.c @@ -123,7 +123,11 @@ static void bye_handler(struct sipsess_sock *sock, const struct sip_msg *msg) return; } - (void)sip_treply(NULL, sip, msg, 200, "OK"); + (void)sip_treplyf(NULL, NULL, sip, msg, false, 200, "OK", + "%s" + "Content-Length: 0\r\n" + "\r\n", + sess->close_hdrs); sess->peerterm = true; diff --git a/src/sipsess/sess.c b/src/sipsess/sess.c index 0cf521f..ff505eb 100644 --- a/src/sipsess/sess.c +++ b/src/sipsess/sess.c @@ -145,6 +145,7 @@ static void destructor(void *arg) mem_deref(sess->auth); mem_deref(sess->cuser); mem_deref(sess->ctype); + mem_deref(sess->close_hdrs); mem_deref(sess->hdrs); mem_deref(sess->desc); mem_deref(sess->sock); @@ -232,3 +233,32 @@ struct sip_dialog *sipsess_dialog(const struct sipsess *sess) { return sess ? sess->dlg : NULL; } + + +/** + * Set extra SIP headers for inclusion in Session "close" messages + * like BYE and 200 OK. Multiple headers can be included. + * + * @param sess SIP Session + * @param hdrs Formatted strings with extra SIP Headers + * + * @return 0 if success, otherwise errorcode + */ +int sipsess_set_close_headers(struct sipsess *sess, const char *hdrs, ...) +{ + int err = 0; + va_list ap; + + if (!sess) + return EINVAL; + + sess->close_hdrs = mem_deref(sess->close_hdrs); + + if (hdrs) { + va_start(ap, hdrs); + err = re_vsdprintf(&sess->close_hdrs, hdrs, ap); + va_end(ap); + } + + return err; +} diff --git a/src/sipsess/sipsess.h b/src/sipsess/sipsess.h index 709ce7f..3bdfcc7 100644 --- a/src/sipsess/sipsess.h +++ b/src/sipsess/sipsess.h @@ -20,6 +20,7 @@ struct sipsess { struct sip *sip; char *cuser; char *ctype; + char *close_hdrs; struct mbuf *hdrs; struct mbuf *desc; sipsess_offer_h *offerh;