Module: sems Branch: rco/offer_answer Commit: 5a7d2f8cbaa4a57dca92009f7e635cda13085aee URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sems/?a=commit;h=5a7d2f8cbaa4a57dca92009f7e635cda13085aee
Author: Raphael Coeffic <[email protected]> Committer: Raphael Coeffic <[email protected]> Date: Thu Apr 21 17:51:04 2011 +0200 added error handling for relaySip(...); --- core/AmB2BSession.cpp | 62 ++++++++++++++++++++++++++++++++++++++---------- core/AmB2BSession.h | 4 +- 2 files changed, 51 insertions(+), 15 deletions(-) diff --git a/core/AmB2BSession.cpp b/core/AmB2BSession.cpp index a13763b..39808f4 100644 --- a/core/AmB2BSession.cpp +++ b/core/AmB2BSession.cpp @@ -116,7 +116,12 @@ void AmB2BSession::onB2BEvent(B2BEvent* ev) B2BSipRequestEvent* req_ev = dynamic_cast<B2BSipRequestEvent*>(ev); assert(req_ev); + DBG("B2BSipRequest: %s (fwd=%s)\n", + req_ev->req.method.c_str(), + req_ev->forward?"true":"false"); + if(req_ev->forward){ + if (req_ev->req.method == SIP_METH_INVITE && dlg.getUACInvTransPending()) { // don't relay INVITE if INV trans pending @@ -128,7 +133,15 @@ void AmB2BSession::onB2BEvent(B2BEvent* ev) return; } - relaySip(req_ev->req); + if(relaySip(req_ev->req) < 0) { + // reply relayed request internally + AmSipReply n_reply; + n_reply.code = 500; + n_reply.reason = SIP_REPLY_SERVER_INTERNAL_ERROR; + n_reply.cseq = req_ev->req.cseq; + relayEvent(new B2BSipReplyEvent(n_reply, true, req_ev->req.method)); + return; + } } if( (req_ev->req.method == SIP_METH_BYE) || @@ -160,19 +173,28 @@ void AmB2BSession::onB2BEvent(B2BEvent* ev) AmSipReply n_reply(reply_ev->reply); n_reply.hdrs+=SIP_HDR_COLSP(SIP_HDR_CONTACT) + reply_ev->reply.contact+ CRLF; - relaySip(t_req->second,n_reply); + + if(relaySip(t_req->second,n_reply) < 0) { + terminateOtherLeg(); + terminateLeg(); + } } else { // relay response - relaySip(t_req->second,reply_ev->reply); + if(relaySip(t_req->second,reply_ev->reply) < 0) { + terminateOtherLeg(); + terminateLeg(); + } } if(reply_ev->reply.code >= 200){ if( (t_req->second.method == SIP_METH_INVITE) && - (reply_ev->reply.code == 487)){ + (reply_ev->reply.code >= 300)){ terminateLeg(); } + DBG("recvd_req.erase(<%u,%s>)\n", + t_req->first, t_req->second.method.c_str()); recvd_req.erase(t_req); } } else { @@ -636,7 +658,7 @@ bool AmB2BSession::refresh(int flags) { return sendEstablishedReInvite() == 0; } -void AmB2BSession::relaySip(const AmSipRequest& req) +int AmB2BSession::relaySip(const AmSipRequest& req) { if (req.method != "ACK") { relayed_req[dlg.cseq] = AmSipTransaction(req.method,req.cseq,req.tt); @@ -672,8 +694,11 @@ void AmB2BSession::relaySip(const AmSipRequest& req) } } - dlg.sendRequest(req.method, req.content_type, *body, *hdrs, SIP_FLAGS_VERBATIM); - // todo: relay error event back if sending fails + int err = dlg.sendRequest(req.method, req.content_type, *body, *hdrs, SIP_FLAGS_VERBATIM); + if(err < 0){ + ERROR("dlg.sendRequest() failed\n"); + return err; + } if ((refresh_method != REFRESH_UPDATE) && (req.method == SIP_METH_INVITE || @@ -693,11 +718,15 @@ void AmB2BSession::relaySip(const AmSipRequest& req) } if (t == relayed_req.end()) { ERROR("transaction for ACK not found in relayed requests\n"); - return; + return -1; } DBG("sending relayed ACK\n"); - dlg.send_200_ack(t->first, req.content_type, req.body, req.hdrs, SIP_FLAGS_VERBATIM); + int err = dlg.send_200_ack(t->first, req.content_type, req.body, req.hdrs, SIP_FLAGS_VERBATIM); + if(err < 0) { + ERROR("dlg.send_200_ack() failed\n"); + return err; + } if ((refresh_method != REFRESH_UPDATE) && !req.body.empty() && @@ -708,9 +737,11 @@ void AmB2BSession::relaySip(const AmSipRequest& req) relayed_req.erase(t); } + + return 0; } -void AmB2BSession::relaySip(const AmSipRequest& orig, const AmSipReply& reply) +int AmB2BSession::relaySip(const AmSipRequest& orig, const AmSipReply& reply) { const string* hdrs = &reply.hdrs; string m_hdrs; @@ -731,9 +762,13 @@ void AmB2BSession::relaySip(const AmSipRequest& orig, const AmSipReply& reply) } } - dlg.reply(orig,reply.code,reply.reason, - reply.content_type, - *body, *hdrs, SIP_FLAGS_VERBATIM); + int err = dlg.reply(orig,reply.code,reply.reason, + reply.content_type, + *body, *hdrs, SIP_FLAGS_VERBATIM); + if(err < 0){ + ERROR("dlg.reply() failed\n"); + return err; + } if ((refresh_method != REFRESH_UPDATE) && (orig.method == SIP_METH_INVITE || @@ -742,6 +777,7 @@ void AmB2BSession::relaySip(const AmSipRequest& orig, const AmSipReply& reply) saveSessionDescription(reply.content_type, reply.body); } + return 0; } int AmB2BSession::filterBody(string& content_type, string& body, AmSdp& filter_sdp, diff --git a/core/AmB2BSession.h b/core/AmB2BSession.h index f265d7e..9d85575 100644 --- a/core/AmB2BSession.h +++ b/core/AmB2BSession.h @@ -164,10 +164,10 @@ class AmB2BSession: public AmSession virtual int relayEvent(AmEvent* ev); /** send a relayed SIP Request */ - void relaySip(const AmSipRequest& req); + int relaySip(const AmSipRequest& req); /** send a relayed SIP Reply */ - void relaySip(const AmSipRequest& orig, const AmSipReply& reply); + int relaySip(const AmSipRequest& orig, const AmSipReply& reply); /** Terminate our leg and forget the other. */ virtual void terminateLeg(); _______________________________________________ Semsdev mailing list [email protected] http://lists.iptel.org/mailman/listinfo/semsdev
