diff --git a/channels/chan_pjsip.c b/channels/chan_pjsip.c
index 69c0beb9ea..e3d982c690 100644
--- a/channels/chan_pjsip.c
+++ b/channels/chan_pjsip.c
@@ -3243,6 +3243,11 @@ static struct ast_custom_function chan_pjsip_parse_uri_function = {
.read = pjsip_acf_parse_uri_read,
};
+static struct ast_custom_function chan_pjsip_parse_uri_from_function = {
+ .name = "PJSIP_PARSE_URI_FROM",
+ .read = pjsip_acf_parse_uri_read,
+};
+
static struct ast_custom_function media_offer_function = {
.name = "PJSIP_MEDIA_OFFER",
.read = pjsip_acf_media_offer_read,
@@ -3305,6 +3310,11 @@ static int load_module(void)
goto end;
}
+ if (ast_custom_function_register(&chan_pjsip_parse_uri_from_function)) {
+ ast_log(LOG_ERROR, "Unable to register PJSIP_PARSE_URI_FROM dialplan function\n");
+ goto end;
+ }
+
if (ast_custom_function_register(&media_offer_function)) {
ast_log(LOG_WARNING, "Unable to register PJSIP_MEDIA_OFFER dialplan function\n");
goto end;
@@ -3378,6 +3388,7 @@ end:
ast_custom_function_unregister(&media_offer_function);
ast_custom_function_unregister(&chan_pjsip_dial_contacts_function);
ast_custom_function_unregister(&chan_pjsip_parse_uri_function);
+ ast_custom_function_unregister(&chan_pjsip_parse_uri_from_function);
ast_custom_function_unregister(&session_refresh_function);
ast_unregister_application(app_pjsip_hangup);
ast_manager_unregister(app_pjsip_hangup);
@@ -3410,6 +3421,7 @@ static int unload_module(void)
ast_custom_function_unregister(&media_offer_function);
ast_custom_function_unregister(&chan_pjsip_dial_contacts_function);
ast_custom_function_unregister(&chan_pjsip_parse_uri_function);
+ ast_custom_function_unregister(&chan_pjsip_parse_uri_from_function);
ast_custom_function_unregister(&session_refresh_function);
ast_unregister_application(app_pjsip_hangup);
ast_manager_unregister(app_pjsip_hangup);
diff --git a/channels/pjsip/dialplan_functions.c b/channels/pjsip/dialplan_functions.c
index f1365adba9..7d0484c9ae 100644
--- a/channels/pjsip/dialplan_functions.c
+++ b/channels/pjsip/dialplan_functions.c
@@ -724,6 +724,7 @@ static int parse_uri_cb(void *data)
int pjsip_acf_parse_uri_read(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
{
struct parse_uri_args func_args = { 0, };
+ int reading_uri_from_var;
AST_DECLARE_APP_ARGS(args,
AST_APP_ARG(uri_str);
@@ -732,8 +733,29 @@ int pjsip_acf_parse_uri_read(struct ast_channel *chan, const char *cmd, char *da
AST_STANDARD_APP_ARGS(args, data);
+ reading_uri_from_var = !strcasecmp(cmd, "PJSIP_PARSE_URI_FROM");
+
+ if (reading_uri_from_var) {
+ const char *var;
+
+ if (ast_strlen_zero(args.uri_str)) {
+ ast_log(LOG_WARNING, "The name of a variable containing a URI must be specified when using the '%s' dialplan function\n", cmd);
+ return -1;
+ }
+
+ ast_channel_lock(chan);
+ if ((var = pbx_builtin_getvar_helper(chan, args.uri_str))) {
+ args.uri_str = ast_strdupa(var);
+ }
+ ast_channel_unlock(chan);
+ }
+
if (ast_strlen_zero(args.uri_str)) {
- ast_log(LOG_WARNING, "An URI must be specified when using the '%s' dialplan function\n", cmd);
+ if (reading_uri_from_var) {
+ ast_log(LOG_WARNING, "The variable provided to the '%s' dialplan function must contain a URI\n", cmd);
+ } else {
+ ast_log(LOG_WARNING, "A URI must be specified when using the '%s' dialplan function\n", cmd);
+ }
return -1;
}
diff --git a/channels/pjsip/dialplan_functions_doc.xml b/channels/pjsip/dialplan_functions_doc.xml
index be4ce91b96..3d19d929ba 100644
--- a/channels/pjsip/dialplan_functions_doc.xml
+++ b/channels/pjsip/dialplan_functions_doc.xml
@@ -223,7 +223,7 @@
17.0.0
- Parse an uri and return a type part of the URI.
+ Parse a URI and return a type part of the URI.
@@ -272,7 +272,66 @@
- Parse an URI and return a specified part of the URI.
+ Parse a URI and return a specified part of the URI.
+
+
+
+
+ 18.24.0
+ 20.9.0
+ 21.4.0
+
+
+ Parse the contents of a variable as a URI and return a type part of the URI.
+
+
+
+ Name of a variable that contains a URI to parse
+
+
+ The type parameter specifies which URI part to read
+
+
+ Display name.
+
+
+ URI scheme.
+
+
+ User part.
+
+
+ Password part.
+
+
+ Host part.
+
+
+ Port number, or zero.
+
+
+ User parameter.
+
+
+ Method parameter.
+
+
+ Transport parameter.
+
+
+ TTL param, or -1.
+
+
+ Loose routing param, or zero.
+
+
+ Maddr param.
+
+
+
+
+
+ Parse the contents of the provided variable as a URI and return a specified part of the URI.