mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-29 18:19:30 +00:00
res_pjsip_session: Add configurable behavior for redirects.
The action taken when a redirect occurs is now configurable on a per-endpoint basis. The redirect can either be treated as a redirect to a local extension, to a URI that is dialed through the Asterisk core, or to a URI that is dialed within PJSIP itself. (closes issue ASTERISK-21710) Reported by: Matt Jordan Review: https://reviewboard.asterisk.org/r/2963/ ........ Merged revisions 403207 from http://svn.asterisk.org/svn/asterisk/branches/12 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@403208 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -2065,13 +2065,31 @@ static void session_inv_on_media_update(pjsip_inv_session *inv, pj_status_t stat
|
||||
static pjsip_redirect_op session_inv_on_redirected(pjsip_inv_session *inv, const pjsip_uri *target, const pjsip_event *e)
|
||||
{
|
||||
struct ast_sip_session *session = inv->mod_data[session_module.id];
|
||||
const pjsip_sip_uri *uri;
|
||||
|
||||
if (PJSIP_URI_SCHEME_IS_SIP(target) || PJSIP_URI_SCHEME_IS_SIPS(target)) {
|
||||
const pjsip_sip_uri *uri = pjsip_uri_get_uri(target);
|
||||
if (session->endpoint->redirect_method == AST_SIP_REDIRECT_URI_PJSIP) {
|
||||
return PJSIP_REDIRECT_ACCEPT;
|
||||
}
|
||||
|
||||
if (!PJSIP_URI_SCHEME_IS_SIP(target) && !PJSIP_URI_SCHEME_IS_SIPS(target)) {
|
||||
return PJSIP_REDIRECT_STOP;
|
||||
}
|
||||
|
||||
uri = pjsip_uri_get_uri(target);
|
||||
|
||||
if (session->endpoint->redirect_method == AST_SIP_REDIRECT_USER) {
|
||||
char exten[AST_MAX_EXTENSION];
|
||||
|
||||
ast_copy_pj_str(exten, &uri->user, sizeof(exten));
|
||||
ast_channel_call_forward_set(session->channel, exten);
|
||||
} else if (session->endpoint->redirect_method == AST_SIP_REDIRECT_URI_CORE) {
|
||||
char target_uri[PJSIP_MAX_URL_SIZE];
|
||||
/* PJSIP/ + endpoint length + / + max URL size */
|
||||
char forward[8 + strlen(ast_sorcery_object_get_id(session->endpoint)) + PJSIP_MAX_URL_SIZE];
|
||||
|
||||
pjsip_uri_print(PJSIP_URI_IN_REQ_URI, uri, target_uri, sizeof(target_uri));
|
||||
sprintf(forward, "PJSIP/%s/%s", ast_sorcery_object_get_id(session->endpoint), target_uri);
|
||||
ast_channel_call_forward_set(session->channel, forward);
|
||||
}
|
||||
|
||||
return PJSIP_REDIRECT_STOP;
|
||||
|
Reference in New Issue
Block a user