summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES6
-rw-r--r--channels/chan_sip.c5
-rw-r--r--configs/samples/pjsip.conf.sample2
-rw-r--r--configs/samples/sip.conf.sample11
-rwxr-xr-xconfigure2
-rw-r--r--configure.ac2
-rw-r--r--contrib/ast-db-manage/config/versions/4e2493ef32e6_add_contact_user_to_endpoint.py22
-rwxr-xr-xcontrib/scripts/sip_to_pjsip/sip_to_pjsip.py147
-rw-r--r--include/asterisk/res_pjsip.h2
-rw-r--r--res/res_ari_applications.c6
-rw-r--r--res/res_ari_asterisk.c26
-rw-r--r--res/res_ari_bridges.c16
-rw-r--r--res/res_ari_channels.c34
-rw-r--r--res/res_ari_device_states.c4
-rw-r--r--res/res_ari_endpoints.c10
-rw-r--r--res/res_ari_events.c6
-rw-r--r--res/res_ari_mailboxes.c4
-rw-r--r--res/res_ari_playbacks.c6
-rw-r--r--res/res_ari_recordings.c18
-rw-r--r--res/res_ari_sounds.c4
-rw-r--r--res/res_format_attr_g729.c76
-rw-r--r--res/res_odbc.c1
-rw-r--r--res/res_odbc_transaction.c1
-rw-r--r--res/res_pjsip.c26
-rw-r--r--res/res_pjsip/pjsip_configuration.c27
-rw-r--r--res/res_pjsip_session.c30
-rw-r--r--rest-api-templates/api.wiki.mustache4
-rw-r--r--rest-api-templates/swagger_model.py4
28 files changed, 363 insertions, 139 deletions
diff --git a/CHANGES b/CHANGES
index 95354791b..1dfd445c8 100644
--- a/CHANGES
+++ b/CHANGES
@@ -37,6 +37,12 @@ chan_pjsip
dialplan function PJSIP_MEDIA_OFFER, this allows the formats on a PJSIP
channel to be re-negotiated and updated after session set up.
+res_pjsip
+------------------
+ * A new endpoint configuration parameter 'contact_user' has been added which
+ when set will override the default user set on Contact headers in outgoing
+ requests.
+
------------------------------------------------------------------------------
--- Functionality changes from Asterisk 13.10.0 to Asterisk 13.11.0 ----------
------------------------------------------------------------------------------
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index f58c19e6d..c0aae46c5 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -12981,10 +12981,7 @@ static void add_codec_to_sdp(const struct sip_pvt *p,
framing = ast_format_cap_get_format_framing(p->caps, format);
- if (ast_format_cmp(format, ast_format_g729) == AST_FORMAT_CMP_EQUAL) {
- /* Indicate that we don't support VAD (G.729 annex B) */
- ast_str_append(a_buf, 0, "a=fmtp:%d annexb=no\r\n", rtp_code);
- } else if (ast_format_cmp(format, ast_format_g723) == AST_FORMAT_CMP_EQUAL) {
+ if (ast_format_cmp(format, ast_format_g723) == AST_FORMAT_CMP_EQUAL) {
/* Indicate that we don't support VAD (G.723.1 annex A) */
ast_str_append(a_buf, 0, "a=fmtp:%d annexa=no\r\n", rtp_code);
} else if (ast_format_cmp(format, ast_format_g719) == AST_FORMAT_CMP_EQUAL) {
diff --git a/configs/samples/pjsip.conf.sample b/configs/samples/pjsip.conf.sample
index 2851945ed..994c8e01c 100644
--- a/configs/samples/pjsip.conf.sample
+++ b/configs/samples/pjsip.conf.sample
@@ -760,6 +760,8 @@
;rtp_timeout_hold= ; Hang up channel if RTP is not received for the specified
; number of seconds when the channel is on hold (default:
; "0" or not enabled)
+;contact_user= ; On outgoing requests, force the user portion of the Contact
+ ; header to this value (default: "")
;==========================AUTH SECTION OPTIONS=========================
;[auth]
diff --git a/configs/samples/sip.conf.sample b/configs/samples/sip.conf.sample
index 5c3238e2a..27012614e 100644
--- a/configs/samples/sip.conf.sample
+++ b/configs/samples/sip.conf.sample
@@ -592,7 +592,16 @@ srvlookup=yes ; Enable DNS SRV lookups on outbound calls
;
;tlsclientmethod=tlsv1 ; values include tlsv1, sslv3, sslv2.
; Specify protocol for outbound client connections.
- ; If left unspecified, the default is sslv2.
+ ; If left unspecified, the default is the general-
+ ; purpose version-flexible SSL/TLS method (sslv23).
+ ; With that, the actual protocol version used will
+ ; be negotiated to the highest version mutually
+ ; supported by Asterisk and the remote server, i.e.
+ ; TLSv1.2. The supported protocols are listed at
+ ; http://www.openssl.org/docs/ssl/SSL_CTX_new.html
+ ; SSLv2 and SSLv3 are disabled within Asterisk.
+ ; Your distribution might have changed that list
+ ; further.
;
;--------------------------- SIP timers ----------------------------------------------------
; These timers are used primarily in INVITE transactions.
diff --git a/configure b/configure
index 1f6c88869..7f6b5dddf 100755
--- a/configure
+++ b/configure
@@ -25329,7 +25329,7 @@ if test "x${PBX_PJ_SSL_CERT_LOAD_FROM_FILES2}" != "x1" -a "${USE_PJ_SSL_CERT_LOA
pbxlibdir="-L${PJ_SSL_CERT_LOAD_FROM_FILES2_DIR}"
fi
fi
- pbxfuncname="pjsip/include/pjsip/sip_util.h"
+ pbxfuncname="pj_ssl_cert_load_from_files2"
if test "x${pbxfuncname}" = "x" ; then # empty lib, assume only headers
AST_PJ_SSL_CERT_LOAD_FROM_FILES2_FOUND=yes
else
diff --git a/configure.ac b/configure.ac
index 637059cd4..588a50075 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2178,7 +2178,7 @@ if test "$USE_PJPROJECT" != "no" ; then
CPPFLAGS="${saved_cppflags}"
AST_EXT_LIB_CHECK([PJSIP_GET_DEST_INFO], [pjsip], [pjsip_get_dest_info], [pjsip.h], [$PJPROJECT_LIB], [$PJPROJECT_CFLAGS])
- AST_EXT_LIB_CHECK([PJ_SSL_CERT_LOAD_FROM_FILES2], [pj], [pjsip/include/pjsip/sip_util.h], [pjlib.h], [$PJPROJECT_LIB], [$PJPROJECT_CFLAGS])
+ AST_EXT_LIB_CHECK([PJ_SSL_CERT_LOAD_FROM_FILES2], [pj], [pj_ssl_cert_load_from_files2], [pjlib.h], [$PJPROJECT_LIB], [$PJPROJECT_CFLAGS])
AST_EXT_LIB_CHECK([PJSIP_EXTERNAL_RESOLVER], [pjsip], [pjsip_endpt_set_ext_resolver], [pjsip.h], [$PJPROJECT_LIBS], [$PJPROJECT_CFLAGS])
saved_cppflags="${CPPFLAGS}"
diff --git a/contrib/ast-db-manage/config/versions/4e2493ef32e6_add_contact_user_to_endpoint.py b/contrib/ast-db-manage/config/versions/4e2493ef32e6_add_contact_user_to_endpoint.py
new file mode 100644
index 000000000..f91cff04e
--- /dev/null
+++ b/contrib/ast-db-manage/config/versions/4e2493ef32e6_add_contact_user_to_endpoint.py
@@ -0,0 +1,22 @@
+"""Add contact_user to endpoint
+
+Revision ID: 4e2493ef32e6
+Revises: 3772f8f828da
+Create Date: 2016-08-16 14:19:58.918466
+
+"""
+
+# revision identifiers, used by Alembic.
+revision = '4e2493ef32e6'
+down_revision = '3772f8f828da'
+
+from alembic import op
+import sqlalchemy as sa
+
+
+def upgrade():
+ op.add_column('ps_endpoints', sa.Column('contact_user', sa.String(80)))
+
+
+def downgrade():
+ op.drop_column('ps_endpoints', 'contact_user')
diff --git a/contrib/scripts/sip_to_pjsip/sip_to_pjsip.py b/contrib/scripts/sip_to_pjsip/sip_to_pjsip.py
index 890921673..ac5aa6cc1 100755
--- a/contrib/scripts/sip_to_pjsip/sip_to_pjsip.py
+++ b/contrib/scripts/sip_to_pjsip/sip_to_pjsip.py
@@ -54,10 +54,11 @@ def set_value(key=None, val=None, section=None, pjsip=None,
def merge_value(key=None, val=None, section=None, pjsip=None,
- nmapped=None, type='endpoint', section_to=None):
+ nmapped=None, type='endpoint', section_to=None,
+ key_to=None):
"""Merge values from the given section with those from the default."""
def _merge_value(k, v, s, r, n):
- merge_value(key if key else k, v, s, r, n, type, section_to)
+ merge_value(key if key else k, v, s, r, n, type, section_to, key_to)
# if no value or section return the merge_value
# function with the enclosed key and type
@@ -71,7 +72,8 @@ def merge_value(key=None, val=None, section=None, pjsip=None,
sect = sip.default(section)[0]
# for each merged value add it to pjsip.conf
for i in sect.get_merged(key):
- set_value(key, i, section_to if section_to else section,
+ set_value(key_to if key_to else key, i,
+ section_to if section_to else section,
pjsip, nmapped, type)
@@ -133,11 +135,14 @@ def set_timers(key, val, section, pjsip, nmapped):
found in sip.conf.
"""
# pjsip.conf values can be yes/no, required, always
+ # 'required' is a new feature of chan_pjsip, which rejects
+ # all SIP clients not supporting Session Timers
+ # 'Accept' is the default value of chan_sip and maps to 'yes'
+ # chan_sip ignores the case, for example 'session-timers=Refuse'
+ val = val.lower()
if val == 'originate':
set_value('timers', 'always', section, pjsip, nmapped)
- elif val == 'accept':
- set_value('timers', 'required', section, pjsip, nmapped)
- elif val == 'never':
+ elif val == 'refuse':
set_value('timers', 'no', section, pjsip, nmapped)
else:
set_value('timers', 'yes', section, pjsip, nmapped)
@@ -396,7 +401,7 @@ peer_map = [
['trustpid', set_value('trust_id_inbound')],
['sendrpid', from_sendrpid], # send_pai, send_rpid
['send_diversion', set_value],
- ['encrpytion', set_media_encryption],
+ ['encryption', set_media_encryption],
['avpf', set_value('use_avpf')],
['recordonfeature', set_record_on_feature], # automixon
['recordofffeature', set_record_off_feature], # automixon
@@ -440,6 +445,9 @@ peer_map = [
['host', from_host], # contact, max_contacts
['qualifyfreq', set_value('qualify_frequency', type='aor')],
+ ['maxexpiry', set_value('maximum_expiration', type='aor')],
+ ['minexpiry', set_value('minimum_expiration', type='aor')],
+ ['defaultexpiry', set_value('default_expiration', type='aor')],
############################# maps to auth#####################################
# type = auth
@@ -454,9 +462,9 @@ peer_map = [
['permit', merge_value(type='acl', section_to='acl')],
['deny', merge_value(type='acl', section_to='acl')],
['acl', merge_value(type='acl', section_to='acl')],
- ['contactpermit', merge_value('contact_permit', type='acl', section_to='acl')],
- ['contactdeny', merge_value('contact_deny', type='acl', section_to='acl')],
- ['contactacl', merge_value('contact_acl', type='acl', section_to='acl')],
+ ['contactpermit', merge_value(type='acl', section_to='acl', key_to='contact_permit')],
+ ['contactdeny', merge_value(type='acl', section_to='acl', key_to='contact_deny')],
+ ['contactacl', merge_value(type='acl', section_to='acl', key_to='contact_acl')],
########################### maps to transport #################################
# type = transport
@@ -464,6 +472,7 @@ peer_map = [
# bind
# async_operations
# ca_list_file
+# ca_list_path
# cert_file
# privkey_file
# password
@@ -499,21 +508,6 @@ peer_map = [
]
-def add_localnet(section, pjsip, nmapped):
- """
- Adds localnet values from sip.conf's general section to a transport in
- pjsip.conf. Ideally, we would have just created a template with the
- localnet sections, but because this is a script, it's not hard to add
- the same thing on to every transport.
- """
- try:
- merge_value('local_net', sip.get('general', 'localnet')[0], 'general',
- pjsip, nmapped, 'transport', section)
- except LookupError:
- # No localnet options configured. No biggie!
- pass
-
-
def set_transport_common(section, pjsip, nmapped):
"""
sip.conf has several global settings that in pjsip.conf apply to individual
@@ -527,21 +521,21 @@ def set_transport_common(section, pjsip, nmapped):
"""
try:
- merge_value('local_net', sip.get('general', 'localnet')[0], 'general',
- pjsip, nmapped, 'transport', section)
+ merge_value('localnet', sip.get('general', 'localnet')[0], 'general',
+ pjsip, nmapped, 'transport', section, "local_net")
except LookupError:
# No localnet options configured. Move on.
pass
try:
- set_value('tos', sip.get('general', 'sip_tos')[0], 'general', pjsip,
- nmapped, 'transport', section)
+ set_value('tos', sip.get('general', 'tos_sip')[0], section, pjsip,
+ nmapped, 'transport')
except LookupError:
pass
try:
- set_value('cos', sip.get('general', 'sip_cos')[0], 'general', pjsip,
- nmapped, 'transport', section)
+ set_value('cos', sip.get('general', 'cos_sip')[0], section, pjsip,
+ nmapped, 'transport')
except LookupError:
pass
@@ -697,6 +691,12 @@ def set_tls_bindaddr(val, pjsip, nmapped):
set_value('bind', bind, 'transport-tls', pjsip, nmapped, 'transport')
+def set_tls_cert_file(val, pjsip, nmapped):
+ """Sets cert_file based on sip.conf tlscertfile"""
+ set_value('cert_file', val, 'transport-tls', pjsip, nmapped,
+ 'transport')
+
+
def set_tls_private_key(val, pjsip, nmapped):
"""Sets privkey_file based on sip.conf tlsprivatekey or sslprivatekey"""
set_value('priv_key_file', val, 'transport-tls', pjsip, nmapped,
@@ -714,6 +714,12 @@ def set_tls_cafile(val, pjsip, nmapped):
'transport')
+def set_tls_capath(val, pjsip, nmapped):
+ """Sets ca_list_path based on sip.conf tlscapath"""
+ set_value('ca_list_path', val, 'transport-tls', pjsip, nmapped,
+ 'transport')
+
+
def set_tls_verifyclient(val, pjsip, nmapped):
"""Sets verify_client based on sip.conf tlsverifyclient"""
set_value('verify_client', val, 'transport-tls', pjsip, nmapped,
@@ -731,11 +737,6 @@ def set_tls_verifyserver(val, pjsip, nmapped):
'transport')
-def set_tls_method(val, pjsip, nmapped):
- """Sets method based on sip.conf tlsclientmethod or sslclientmethod"""
- set_value('method', val, 'transport-tls', pjsip, nmapped, 'transport')
-
-
def create_tls(sip, pjsip, nmapped):
"""
Creates a 'transport-tls' section in pjsip.conf based on the following
@@ -755,12 +756,13 @@ def create_tls(sip, pjsip, nmapped):
tls_map = [
(['tlsbindaddr', 'sslbindaddr'], set_tls_bindaddr),
+ (['tlscertfile', 'sslcert', 'tlscert'], set_tls_cert_file),
(['tlsprivatekey', 'sslprivatekey'], set_tls_private_key),
(['tlscipher', 'sslcipher'], set_tls_cipher),
(['tlscafile'], set_tls_cafile),
+ (['tlscapath', 'tlscadir'], set_tls_capath),
(['tlsverifyclient'], set_tls_verifyclient),
- (['tlsdontverifyserver'], set_tls_verifyserver),
- (['tlsclientmethod', 'sslclientmethod'], set_tls_method)
+ (['tlsdontverifyserver'], set_tls_verifyserver)
]
try:
@@ -780,6 +782,23 @@ def create_tls(sip, pjsip, nmapped):
except LookupError:
pass
+ try:
+ method = sip.multi_get('general', ['tlsclientmethod', 'sslclientmethod'])[0]
+ print 'In chan_sip, you specified the TLS version. With chan_sip, this was just for outbound client connections. In chan_pjsip, this value is for client and server. Instead, consider not to specify \'tlsclientmethod\' for chan_sip and \'method = sslv23\' for chan_pjsip.'
+ except LookupError:
+ """
+ OpenSSL emerged during the 90s. SSLv2 and SSLv3 were the only
+ existing methods at that time. The OpenSSL project continued. And as
+ of today (OpenSSL 1.0.2) this does not start SSLv2 and SSLv3 anymore
+ but TLSv1.0 and v1.2. Or stated differently: This method should
+ have been called 'method = secure' or 'method = automatic' back in
+ the 90s. The PJProject did not realize this and uses 'tlsv1' as
+ default when unspecified, which disables TLSv1.2. chan_sip used
+ 'sslv23' as default when unspecified, which gives TLSv1.0 and v1.2.
+ """
+ method = 'sslv23'
+ set_value('method', method, 'transport-tls', pjsip, nmapped, 'transport')
+
set_transport_common('transport-tls', pjsip, nmapped)
try:
extern_addr = sip.multi_get('general', ['externaddr', 'externip',
@@ -907,6 +926,17 @@ class Registration:
the right of the user, then finish by using rpartition calls to remove
everything to the left of the user.
"""
+ self.peer = ''
+ self.protocol = 'udp'
+ protocols = ['udp', 'tcp', 'tls']
+ for protocol in protocols:
+ position = user_part.find(protocol + '://')
+ if -1 < position:
+ post_transport = user_part[position + 6:]
+ self.peer, sep, self.protocol = user_part[:position + 3].rpartition('?')
+ user_part = post_transport
+ break
+
colons = user_part.count(':')
if (colons == 3):
# :domainport:secret:authuser
@@ -927,11 +957,7 @@ class Registration:
# Invalid setting
raise
- pre_domain, sep, self.domain = pre_auth.partition('@')
- self.peer, sep, post_peer = pre_domain.rpartition('?')
- transport, sep, self.user = post_peer.rpartition('://')
-
- self.protocol = transport if transport else 'udp'
+ self.user, sep, self.domain = pre_auth.partition('@')
def write(self, pjsip, nmapped):
"""
@@ -981,9 +1007,8 @@ class Registration:
if hasattr(self, 'secret') and self.secret:
set_value('password', self.secret, auth_section, pjsip, nmapped,
'auth')
- if hasattr(self, 'authuser'):
- set_value('username', self.authuser or self.user, auth_section,
- pjsip, nmapped, 'auth')
+ set_value('username', self.authuser if hasattr(self, 'authuser')
+ else self.user, auth_section, pjsip, nmapped, 'auth')
set_value('outbound_auth', auth_section, section, pjsip, nmapped,
'registration')
@@ -1080,6 +1105,35 @@ def find_non_mapped(sections, nmapped):
pass
+def map_system(sip, pjsip, nmapped):
+ section = 'system' # Just a label; you as user can change that
+ type = 'system' # Not a label, therefore not the same as section
+
+ try:
+ user_agent = sip.get('general', 'useragent')[0]
+ set_value('user_agent', user_agent, 'global', pjsip, nmapped, 'global')
+ except LookupError:
+ pass
+
+ try:
+ timer_t1 = sip.get('general', 'timert1')[0]
+ set_value('timer_t1', timer_t1, section, pjsip, nmapped, type)
+ except LookupError:
+ pass
+
+ try:
+ timer_b = sip.get('general', 'timerb')[0]
+ set_value('timer_b', timer_b, section, pjsip, nmapped, type)
+ except LookupError:
+ pass
+
+ try:
+ compact_headers = sip.get('general', 'compactheaders')[0]
+ set_value('compact_headers', compact_headers, section, pjsip, nmapped, type)
+ except LookupError:
+ pass
+
+
def convert(sip, filename, non_mappings, include):
"""
Entry point for configuration file conversion. This
@@ -1092,6 +1146,7 @@ def convert(sip, filename, non_mappings, include):
nmapped = non_mapped(non_mappings[filename])
if not include:
# Don't duplicate transport and registration configs
+ map_system(sip, pjsip, nmapped)
map_transports(sip, pjsip, nmapped)
map_registrations(sip, pjsip, nmapped)
map_auth(sip, pjsip, nmapped)
diff --git a/include/asterisk/res_pjsip.h b/include/asterisk/res_pjsip.h
index 72a2ff351..002182b9a 100644
--- a/include/asterisk/res_pjsip.h
+++ b/include/asterisk/res_pjsip.h
@@ -751,6 +751,8 @@ struct ast_sip_endpoint {
struct ast_acl_list *contact_acl;
/*! The number of seconds into call to disable fax detection. (0 = disabled) */
unsigned int faxdetect_timeout;
+ /*! Override the user on the outgoing Contact header with this value. */
+ char *contact_user;
};
/*!
diff --git a/res/res_ari_applications.c b/res/res_ari_applications.c
index e81d16498..dd868a602 100644
--- a/res/res_ari_applications.c
+++ b/res/res_ari_applications.c
@@ -496,7 +496,7 @@ fin: __attribute__((unused))
return;
}
-/*! \brief REST handler for /api-docs/applications.{format} */
+/*! \brief REST handler for /api-docs/applications.json */
static struct stasis_rest_handlers applications_applicationName_subscription = {
.path_segment = "subscription",
.callbacks = {
@@ -506,7 +506,7 @@ static struct stasis_rest_handlers applications_applicationName_subscription = {
.num_children = 0,
.children = { }
};
-/*! \brief REST handler for /api-docs/applications.{format} */
+/*! \brief REST handler for /api-docs/applications.json */
static struct stasis_rest_handlers applications_applicationName = {
.path_segment = "applicationName",
.is_wildcard = 1,
@@ -516,7 +516,7 @@ static struct stasis_rest_handlers applications_applicationName = {
.num_children = 1,
.children = { &applications_applicationName_subscription, }
};
-/*! \brief REST handler for /api-docs/applications.{format} */
+/*! \brief REST handler for /api-docs/applications.json */
static struct stasis_rest_handlers applications = {
.path_segment = "applications",
.callbacks = {
diff --git a/res/res_ari_asterisk.c b/res/res_ari_asterisk.c
index fe6e3d363..b52a2a722 100644
--- a/res/res_ari_asterisk.c
+++ b/res/res_ari_asterisk.c
@@ -1178,7 +1178,7 @@ fin: __attribute__((unused))
return;
}
-/*! \brief REST handler for /api-docs/asterisk.{format} */
+/*! \brief REST handler for /api-docs/asterisk.json */
static struct stasis_rest_handlers asterisk_config_dynamic_configClass_objectType_id = {
.path_segment = "id",
.is_wildcard = 1,
@@ -1190,7 +1190,7 @@ static struct stasis_rest_handlers asterisk_config_dynamic_configClass_objectTyp
.num_children = 0,
.children = { }
};
-/*! \brief REST handler for /api-docs/asterisk.{format} */
+/*! \brief REST handler for /api-docs/asterisk.json */
static struct stasis_rest_handlers asterisk_config_dynamic_configClass_objectType = {
.path_segment = "objectType",
.is_wildcard = 1,
@@ -1199,7 +1199,7 @@ static struct stasis_rest_handlers asterisk_config_dynamic_configClass_objectTyp
.num_children = 1,
.children = { &asterisk_config_dynamic_configClass_objectType_id, }
};
-/*! \brief REST handler for /api-docs/asterisk.{format} */
+/*! \brief REST handler for /api-docs/asterisk.json */
static struct stasis_rest_handlers asterisk_config_dynamic_configClass = {
.path_segment = "configClass",
.is_wildcard = 1,
@@ -1208,7 +1208,7 @@ static struct stasis_rest_handlers asterisk_config_dynamic_configClass = {
.num_children = 1,
.children = { &asterisk_config_dynamic_configClass_objectType, }
};
-/*! \brief REST handler for /api-docs/asterisk.{format} */
+/*! \brief REST handler for /api-docs/asterisk.json */
static struct stasis_rest_handlers asterisk_config_dynamic = {
.path_segment = "dynamic",
.callbacks = {
@@ -1216,7 +1216,7 @@ static struct stasis_rest_handlers asterisk_config_dynamic = {
.num_children = 1,
.children = { &asterisk_config_dynamic_configClass, }
};
-/*! \brief REST handler for /api-docs/asterisk.{format} */
+/*! \brief REST handler for /api-docs/asterisk.json */
static struct stasis_rest_handlers asterisk_config = {
.path_segment = "config",
.callbacks = {
@@ -1224,7 +1224,7 @@ static struct stasis_rest_handlers asterisk_config = {
.num_children = 1,
.children = { &asterisk_config_dynamic, }
};
-/*! \brief REST handler for /api-docs/asterisk.{format} */
+/*! \brief REST handler for /api-docs/asterisk.json */
static struct stasis_rest_handlers asterisk_info = {
.path_segment = "info",
.callbacks = {
@@ -1233,7 +1233,7 @@ static struct stasis_rest_handlers asterisk_info = {
.num_children = 0,
.children = { }
};
-/*! \brief REST handler for /api-docs/asterisk.{format} */
+/*! \brief REST handler for /api-docs/asterisk.json */
static struct stasis_rest_handlers asterisk_modules_moduleName = {
.path_segment = "moduleName",
.is_wildcard = 1,
@@ -1246,7 +1246,7 @@ static struct stasis_rest_handlers asterisk_modules_moduleName = {
.num_children = 0,
.children = { }
};
-/*! \brief REST handler for /api-docs/asterisk.{format} */
+/*! \brief REST handler for /api-docs/asterisk.json */
static struct stasis_rest_handlers asterisk_modules = {
.path_segment = "modules",
.callbacks = {
@@ -1255,7 +1255,7 @@ static struct stasis_rest_handlers asterisk_modules = {
.num_children = 1,
.children = { &asterisk_modules_moduleName, }
};
-/*! \brief REST handler for /api-docs/asterisk.{format} */
+/*! \brief REST handler for /api-docs/asterisk.json */
static struct stasis_rest_handlers asterisk_logging_logChannelName_rotate = {
.path_segment = "rotate",
.callbacks = {
@@ -1264,7 +1264,7 @@ static struct stasis_rest_handlers asterisk_logging_logChannelName_rotate = {
.num_children = 0,
.children = { }
};
-/*! \brief REST handler for /api-docs/asterisk.{format} */
+/*! \brief REST handler for /api-docs/asterisk.json */
static struct stasis_rest_handlers asterisk_logging_logChannelName = {
.path_segment = "logChannelName",
.is_wildcard = 1,
@@ -1275,7 +1275,7 @@ static struct stasis_rest_handlers asterisk_logging_logChannelName = {
.num_children = 1,
.children = { &asterisk_logging_logChannelName_rotate, }
};
-/*! \brief REST handler for /api-docs/asterisk.{format} */
+/*! \brief REST handler for /api-docs/asterisk.json */
static struct stasis_rest_handlers asterisk_logging = {
.path_segment = "logging",
.callbacks = {
@@ -1284,7 +1284,7 @@ static struct stasis_rest_handlers asterisk_logging = {
.num_children = 1,
.children = { &asterisk_logging_logChannelName, }
};
-/*! \brief REST handler for /api-docs/asterisk.{format} */
+/*! \brief REST handler for /api-docs/asterisk.json */
static struct stasis_rest_handlers asterisk_variable = {
.path_segment = "variable",
.callbacks = {
@@ -1294,7 +1294,7 @@ static struct stasis_rest_handlers asterisk_variable = {
.num_children = 0,
.children = { }
};
-/*! \brief REST handler for /api-docs/asterisk.{format} */
+/*! \brief REST handler for /api-docs/asterisk.json */
static struct stasis_rest_handlers asterisk = {
.path_segment = "asterisk",
.callbacks = {
diff --git a/res/res_ari_bridges.c b/res/res_ari_bridges.c
index 860ff1dc0..889d42213 100644
--- a/res/res_ari_bridges.c
+++ b/res/res_ari_bridges.c
@@ -1318,7 +1318,7 @@ fin: __attribute__((unused))
return;
}
-/*! \brief REST handler for /api-docs/bridges.{format} */
+/*! \brief REST handler for /api-docs/bridges.json */
static struct stasis_rest_handlers bridges_bridgeId_addChannel = {
.path_segment = "addChannel",
.callbacks = {
@@ -1327,7 +1327,7 @@ static struct stasis_rest_handlers bridges_bridgeId_addChannel = {
.num_children = 0,
.children = { }
};
-/*! \brief REST handler for /api-docs/bridges.{format} */
+/*! \brief REST handler for /api-docs/bridges.json */
static struct stasis_rest_handlers bridges_bridgeId_removeChannel = {
.path_segment = "removeChannel",
.callbacks = {
@@ -1336,7 +1336,7 @@ static struct stasis_rest_handlers bridges_bridgeId_removeChannel = {
.num_children = 0,
.children = { }
};
-/*! \brief REST handler for /api-docs/bridges.{format} */
+/*! \brief REST handler for /api-docs/bridges.json */
static struct stasis_rest_handlers bridges_bridgeId_moh = {
.path_segment = "moh",
.callbacks = {
@@ -1346,7 +1346,7 @@ static struct stasis_rest_handlers bridges_bridgeId_moh = {
.num_children = 0,
.children = { }
};
-/*! \brief REST handler for /api-docs/bridges.{format} */
+/*! \brief REST handler for /api-docs/bridges.json */
static struct stasis_rest_handlers bridges_bridgeId_play_playbackId = {
.path_segment = "playbackId",
.is_wildcard = 1,
@@ -1356,7 +1356,7 @@ static struct stasis_rest_handlers bridges_bridgeId_play_playbackId = {
.num_children = 0,
.children = { }
};
-/*! \brief REST handler for /api-docs/bridges.{format} */
+/*! \brief REST handler for /api-docs/bridges.json */
static struct stasis_rest_handlers bridges_bridgeId_play = {
.path_segment = "play",
.callbacks = {
@@ -1365,7 +1365,7 @@ static struct stasis_rest_handlers bridges_bridgeId_play = {
.num_children = 1,
.children = { &bridges_bridgeId_play_playbackId, }
};
-/*! \brief REST handler for /api-docs/bridges.{format} */
+/*! \brief REST handler for /api-docs/bridges.json */
static struct stasis_rest_handlers bridges_bridgeId_record = {
.path_segment = "record",
.callbacks = {
@@ -1374,7 +1374,7 @@ static struct stasis_rest_handlers bridges_bridgeId_record = {
.num_children = 0,
.children = { }
};
-/*! \brief REST handler for /api-docs/bridges.{format} */
+/*! \brief REST handler for /api-docs/bridges.json */
static struct stasis_rest_handlers bridges_bridgeId = {
.path_segment = "bridgeId",
.is_wildcard = 1,
@@ -1386,7 +1386,7 @@ static struct stasis_rest_handlers bridges_bridgeId = {
.num_children = 5,
.children = { &bridges_bridgeId_addChannel,&bridges_bridgeId_removeChannel,&bridges_bridgeId_moh,&bridges_bridgeId_play,&bridges_bridgeId_record, }
};
-/*! \brief REST handler for /api-docs/bridges.{format} */
+/*! \brief REST handler for /api-docs/bridges.json */
static struct stasis_rest_handlers bridges = {
.path_segment = "bridges",
.callbacks = {
diff --git a/res/res_ari_channels.c b/res/res_ari_channels.c
index a14a9c8cb..9dc19cc86 100644
--- a/res/res_ari_channels.c
+++ b/res/res_ari_channels.c
@@ -2567,7 +2567,7 @@ fin: __attribute__((unused))
return;
}
-/*! \brief REST handler for /api-docs/channels.{format} */
+/*! \brief REST handler for /api-docs/channels.json */
static struct stasis_rest_handlers channels_channelId_continue = {
.path_segment = "continue",
.callbacks = {
@@ -2576,7 +2576,7 @@ static struct stasis_rest_handlers channels_channelId_continue = {
.num_children = 0,
.children = { }
};
-/*! \brief REST handler for /api-docs/channels.{format} */
+/*! \brief REST handler for /api-docs/channels.json */
static struct stasis_rest_handlers channels_channelId_redirect = {
.path_segment = "redirect",
.callbacks = {
@@ -2585,7 +2585,7 @@ static struct stasis_rest_handlers channels_channelId_redirect = {
.num_children = 0,
.children = { }
};
-/*! \brief REST handler for /api-docs/channels.{format} */
+/*! \brief REST handler for /api-docs/channels.json */
static struct stasis_rest_handlers channels_channelId_answer = {
.path_segment = "answer",
.callbacks = {
@@ -2594,7 +2594,7 @@ static struct stasis_rest_handlers channels_channelId_answer = {
.num_children = 0,
.children = { }
};
-/*! \brief REST handler for /api-docs/channels.{format} */
+/*! \brief REST handler for /api-docs/channels.json */
static struct stasis_rest_handlers channels_channelId_ring = {
.path_segment = "ring",
.callbacks = {
@@ -2604,7 +2604,7 @@ static struct stasis_rest_handlers channels_channelId_ring = {
.num_children = 0,
.children = { }
};
-/*! \brief REST handler for /api-docs/channels.{format} */
+/*! \brief REST handler for /api-docs/channels.json */
static struct stasis_rest_handlers channels_channelId_dtmf = {
.path_segment = "dtmf",
.callbacks = {
@@ -2613,7 +2613,7 @@ static struct stasis_rest_handlers channels_channelId_dtmf = {
.num_children = 0,
.children = { }
};
-/*! \brief REST handler for /api-docs/channels.{format} */
+/*! \brief REST handler for /api-docs/channels.json */
static struct stasis_rest_handlers channels_channelId_mute = {
.path_segment = "mute",
.callbacks = {
@@ -2623,7 +2623,7 @@ static struct stasis_rest_handlers channels_channelId_mute = {
.num_children = 0,
.children = { }
};
-/*! \brief REST handler for /api-docs/channels.{format} */
+/*! \brief REST handler for /api-docs/channels.json */
static struct stasis_rest_handlers channels_channelId_hold = {
.path_segment = "hold",
.callbacks = {
@@ -2633,7 +2633,7 @@ static struct stasis_rest_handlers channels_channelId_hold = {
.num_children = 0,
.children = { }
};
-/*! \brief REST handler for /api-docs/channels.{format} */
+/*! \brief REST handler for /api-docs/channels.json */
static struct stasis_rest_handlers channels_channelId_moh = {
.path_segment = "moh",
.callbacks = {
@@ -2643,7 +2643,7 @@ static struct stasis_rest_handlers channels_channelId_moh = {
.num_children = 0,
.children = { }
};
-/*! \brief REST handler for /api-docs/channels.{format} */
+/*! \brief REST handler for /api-docs/channels.json */
static struct stasis_rest_handlers channels_channelId_silence = {
.path_segment = "silence",
.callbacks = {
@@ -2653,7 +2653,7 @@ static struct stasis_rest_handlers channels_channelId_silence = {
.num_children = 0,
.children = { }
};
-/*! \brief REST handler for /api-docs/channels.{format} */
+/*! \brief REST handler for /api-docs/channels.json */
static struct stasis_rest_handlers channels_channelId_play_playbackId = {
.path_segment = "playbackId",
.is_wildcard = 1,
@@ -2663,7 +2663,7 @@ static struct stasis_rest_handlers channels_channelId_play_playbackId = {
.num_children = 0,
.children = { }
};
-/*! \brief REST handler for /api-docs/channels.{format} */
+/*! \brief REST handler for /api-docs/channels.json */
static struct stasis_rest_handlers channels_channelId_play = {
.path_segment = "play",
.callbacks = {
@@ -2672,7 +2672,7 @@ static struct stasis_rest_handlers channels_channelId_play = {
.num_children = 1,
.children = { &channels_channelId_play_playbackId, }
};
-/*! \brief REST handler for /api-docs/channels.{format} */
+/*! \brief REST handler for /api-docs/channels.json */
static struct stasis_rest_handlers channels_channelId_record = {
.path_segment = "record",
.callbacks = {
@@ -2681,7 +2681,7 @@ static struct stasis_rest_handlers channels_channelId_record = {
.num_children = 0,
.children = { }
};
-/*! \brief REST handler for /api-docs/channels.{format} */
+/*! \brief REST handler for /api-docs/channels.json */
static struct stasis_rest_handlers channels_channelId_variable = {
.path_segment = "variable",
.callbacks = {
@@ -2691,7 +2691,7 @@ static struct stasis_rest_handlers channels_channelId_variable = {
.num_children = 0,
.children = { }
};
-/*! \brief REST handler for /api-docs/channels.{format} */
+/*! \brief REST handler for /api-docs/channels.json */
static struct stasis_rest_handlers channels_channelId_snoop_snoopId = {
.path_segment = "snoopId",
.is_wildcard = 1,
@@ -2701,7 +2701,7 @@ static struct stasis_rest_handlers channels_channelId_snoop_snoopId = {
.num_children = 0,
.children = { }
};
-/*! \brief REST handler for /api-docs/channels.{format} */
+/*! \brief REST handler for /api-docs/channels.json */
static struct stasis_rest_handlers channels_channelId_snoop = {
.path_segment = "snoop",
.callbacks = {
@@ -2710,7 +2710,7 @@ static struct stasis_rest_handlers channels_channelId_snoop = {
.num_children = 1,
.children = { &channels_channelId_snoop_snoopId, }
};
-/*! \brief REST handler for /api-docs/channels.{format} */
+/*! \brief REST handler for /api-docs/channels.json */
static struct stasis_rest_handlers channels_channelId = {
.path_segment = "channelId",
.is_wildcard = 1,
@@ -2722,7 +2722,7 @@ static struct stasis_rest_handlers channels_channelId = {
.num_children = 13,
.children = { &channels_channelId_continue,&channels_channelId_redirect,&channels_channelId_answer,&channels_channelId_ring,&channels_channelId_dtmf,&channels_channelId_mute,&channels_channelId_hold,&channels_channelId_moh,&channels_channelId_silence,&channels_channelId_play,&channels_channelId_record,&channels_channelId_variable,&channels_channelId_snoop, }
};
-/*! \brief REST handler for /api-docs/channels.{format} */
+/*! \brief REST handler for /api-docs/channels.json */
static struct stasis_rest_handlers channels = {
.path_segment = "channels",
.callbacks = {
diff --git a/res/res_ari_device_states.c b/res/res_ari_device_states.c
index f15e3da78..6d5d19f58 100644
--- a/res/res_ari_device_states.c
+++ b/res/res_ari_device_states.c
@@ -320,7 +320,7 @@ fin: __attribute__((unused))
return;
}
-/*! \brief REST handler for /api-docs/deviceStates.{format} */
+/*! \brief REST handler for /api-docs/deviceStates.json */
static struct stasis_rest_handlers deviceStates_deviceName = {
.path_segment = "deviceName",
.is_wildcard = 1,
@@ -332,7 +332,7 @@ static struct stasis_rest_handlers deviceStates_deviceName = {
.num_children = 0,
.children = { }
};
-/*! \brief REST handler for /api-docs/deviceStates.{format} */
+/*! \brief REST handler for /api-docs/deviceStates.json */
static struct stasis_rest_handlers deviceStates = {
.path_segment = "deviceStates",
.callbacks = {
diff --git a/res/res_ari_endpoints.c b/res/res_ari_endpoints.c
index 4d54ff3bd..e3ade435d 100644
--- a/res/res_ari_endpoints.c
+++ b/res/res_ari_endpoints.c
@@ -434,7 +434,7 @@ fin: __attribute__((unused))
return;
}
-/*! \brief REST handler for /api-docs/endpoints.{format} */
+/*! \brief REST handler for /api-docs/endpoints.json */
static struct stasis_rest_handlers endpoints_sendMessage = {
.path_segment = "sendMessage",
.callbacks = {
@@ -443,7 +443,7 @@ static struct stasis_rest_handlers endpoints_sendMessage = {
.num_children = 0,
.children = { }
};
-/*! \brief REST handler for /api-docs/endpoints.{format} */
+/*! \brief REST handler for /api-docs/endpoints.json */
static struct stasis_rest_handlers endpoints_tech_resource_sendMessage = {
.path_segment = "sendMessage",
.callbacks = {
@@ -452,7 +452,7 @@ static struct stasis_rest_handlers endpoints_tech_resource_sendMessage = {
.num_children = 0,
.children = { }
};
-/*! \brief REST handler for /api-docs/endpoints.{format} */
+/*! \brief REST handler for /api-docs/endpoints.json */
static struct stasis_rest_handlers endpoints_tech_resource = {
.path_segment = "resource",
.is_wildcard = 1,
@@ -462,7 +462,7 @@ static struct stasis_rest_handlers endpoints_tech_resource = {
.num_children = 1,
.children = { &endpoints_tech_resource_sendMessage, }
};
-/*! \brief REST handler for /api-docs/endpoints.{format} */
+/*! \brief REST handler for /api-docs/endpoints.json */
static struct stasis_rest_handlers endpoints_tech = {
.path_segment = "tech",
.is_wildcard = 1,
@@ -472,7 +472,7 @@ static struct stasis_rest_handlers endpoints_tech = {
.num_children = 1,
.children = { &endpoints_tech_resource, }
};
-/*! \brief REST handler for /api-docs/endpoints.{format} */
+/*! \brief REST handler for /api-docs/endpoints.json */
static struct stasis_rest_handlers endpoints = {
.path_segment = "endpoints",
.callbacks = {
diff --git a/res/res_ari_events.c b/res/res_ari_events.c
index 65bd38d5b..e85db4c45 100644
--- a/res/res_ari_events.c
+++ b/res/res_ari_events.c
@@ -407,7 +407,7 @@ fin: __attribute__((unused))
return;
}
-/*! \brief REST handler for /api-docs/events.{format} */
+/*! \brief REST handler for /api-docs/events.json */
static struct stasis_rest_handlers events_user_eventName = {
.path_segment = "eventName",
.is_wildcard = 1,
@@ -417,7 +417,7 @@ static struct stasis_rest_handlers events_user_eventName = {
.num_children = 0,
.children = { }
};
-/*! \brief REST handler for /api-docs/events.{format} */
+/*! \brief REST handler for /api-docs/events.json */
static struct stasis_rest_handlers events_user = {
.path_segment = "user",
.callbacks = {
@@ -425,7 +425,7 @@ static struct stasis_rest_handlers events_user = {
.num_children = 1,
.children = { &events_user_eventName, }
};
-/*! \brief REST handler for /api-docs/events.{format} */
+/*! \brief REST handler for /api-docs/events.json */
static struct stasis_rest_handlers events = {
.path_segment = "events",
.callbacks = {
diff --git a/res/res_ari_mailboxes.c b/res/res_ari_mailboxes.c
index 2b3404f2b..6ed16a84e 100644
--- a/res/res_ari_mailboxes.c
+++ b/res/res_ari_mailboxes.c
@@ -326,7 +326,7 @@ fin: __attribute__((unused))
return;
}
-/*! \brief REST handler for /api-docs/mailboxes.{format} */
+/*! \brief REST handler for /api-docs/mailboxes.json */
static struct stasis_rest_handlers mailboxes_mailboxName = {
.path_segment = "mailboxName",
.is_wildcard = 1,
@@ -338,7 +338,7 @@ static struct stasis_rest_handlers mailboxes_mailboxName = {
.num_children = 0,
.children = { }
};
-/*! \brief REST handler for /api-docs/mailboxes.{format} */
+/*! \brief REST handler for /api-docs/mailboxes.json */
static struct stasis_rest_handlers mailboxes = {
.path_segment = "mailboxes",
.callbacks = {
diff --git a/res/res_ari_playbacks.c b/res/res_ari_playbacks.c
index de38ad86d..233603303 100644
--- a/res/res_ari_playbacks.c
+++ b/res/res_ari_playbacks.c
@@ -270,7 +270,7 @@ fin: __attribute__((unused))
return;
}
-/*! \brief REST handler for /api-docs/playbacks.{format} */
+/*! \brief REST handler for /api-docs/playbacks.json */
static struct stasis_rest_handlers playbacks_playbackId_control = {
.path_segment = "control",
.callbacks = {
@@ -279,7 +279,7 @@ static struct stasis_rest_handlers playbacks_playbackId_control = {
.num_children = 0,
.children = { }
};
-/*! \brief REST handler for /api-docs/playbacks.{format} */
+/*! \brief REST handler for /api-docs/playbacks.json */
static struct stasis_rest_handlers playbacks_playbackId = {
.path_segment = "playbackId",
.is_wildcard = 1,
@@ -290,7 +290,7 @@ static struct stasis_rest_handlers playbacks_playbackId = {
.num_children = 1,
.children = { &playbacks_playbackId_control, }
};
-/*! \brief REST handler for /api-docs/playbacks.{format} */
+/*! \brief REST handler for /api-docs/playbacks.json */
static struct stasis_rest_handlers playbacks = {
.path_segment = "playbacks",
.callbacks = {
diff --git a/res/res_ari_recordings.c b/res/res_ari_recordings.c
index dede53c48..04ce0ac97 100644
--- a/res/res_ari_recordings.c
+++ b/res/res_ari_recordings.c
@@ -737,7 +737,7 @@ fin: __attribute__((unused))
return;
}
-/*! \brief REST handler for /api-docs/recordings.{format} */
+/*! \brief REST handler for /api-docs/recordings.json */
static struct stasis_rest_handlers recordings_stored_recordingName_copy = {
.path_segment = "copy",
.callbacks = {
@@ -746,7 +746,7 @@ static struct stasis_rest_handlers recordings_stored_recordingName_copy = {
.num_children = 0,
.children = { }
};
-/*! \brief REST handler for /api-docs/recordings.{format} */
+/*! \brief REST handler for /api-docs/recordings.json */
static struct stasis_rest_handlers recordings_stored_recordingName = {
.path_segment = "recordingName",
.is_wildcard = 1,
@@ -757,7 +757,7 @@ static struct stasis_rest_handlers recordings_stored_recordingName = {
.num_children = 1,
.children = { &recordings_stored_recordingName_copy, }
};
-/*! \brief REST handler for /api-docs/recordings.{format} */
+/*! \brief REST handler for /api-docs/recordings.json */
static struct stasis_rest_handlers recordings_stored = {
.path_segment = "stored",
.callbacks = {
@@ -766,7 +766,7 @@ static struct stasis_rest_handlers recordings_stored = {
.num_children = 1,
.children = { &recordings_stored_recordingName, }
};
-/*! \brief REST handler for /api-docs/recordings.{format} */
+/*! \brief REST handler for /api-docs/recordings.json */
static struct stasis_rest_handlers recordings_live_recordingName_stop = {
.path_segment = "stop",
.callbacks = {
@@ -775,7 +775,7 @@ static struct stasis_rest_handlers recordings_live_recordingName_stop = {
.num_children = 0,
.children = { }
};
-/*! \brief REST handler for /api-docs/recordings.{format} */
+/*! \brief REST handler for /api-docs/recordings.json */
static struct stasis_rest_handlers recordings_live_recordingName_pause = {
.path_segment = "pause",
.callbacks = {
@@ -785,7 +785,7 @@ static struct stasis_rest_handlers recordings_live_recordingName_pause = {
.num_children = 0,
.children = { }
};
-/*! \brief REST handler for /api-docs/recordings.{format} */
+/*! \brief REST handler for /api-docs/recordings.json */
static struct stasis_rest_handlers recordings_live_recordingName_mute = {
.path_segment = "mute",
.callbacks = {
@@ -795,7 +795,7 @@ static struct stasis_rest_handlers recordings_live_recordingName_mute = {
.num_children = 0,
.children = { }
};
-/*! \brief REST handler for /api-docs/recordings.{format} */
+/*! \brief REST handler for /api-docs/recordings.json */
static struct stasis_rest_handlers recordings_live_recordingName = {
.path_segment = "recordingName",
.is_wildcard = 1,
@@ -806,7 +806,7 @@ static struct stasis_rest_handlers recordings_live_recordingName = {
.num_children = 3,
.children = { &recordings_live_recordingName_stop,&recordings_live_recordingName_pause,&recordings_live_recordingName_mute, }
};
-/*! \brief REST handler for /api-docs/recordings.{format} */
+/*! \brief REST handler for /api-docs/recordings.json */
static struct stasis_rest_handlers recordings_live = {
.path_segment = "live",
.callbacks = {
@@ -814,7 +814,7 @@ static struct stasis_rest_handlers recordings_live = {
.num_children = 1,
.children = { &recordings_live_recordingName, }
};
-/*! \brief REST handler for /api-docs/recordings.{format} */
+/*! \brief REST handler for /api-docs/recordings.json */
static struct stasis_rest_handlers recordings = {
.path_segment = "recordings",
.callbacks = {
diff --git a/res/res_ari_sounds.c b/res/res_ari_sounds.c
index c53330d54..935025dec 100644
--- a/res/res_ari_sounds.c
+++ b/res/res_ari_sounds.c
@@ -208,7 +208,7 @@ fin: __attribute__((unused))
return;
}
-/*! \brief REST handler for /api-docs/sounds.{format} */
+/*! \brief REST handler for /api-docs/sounds.json */
static struct stasis_rest_handlers sounds_soundId = {
.path_segment = "soundId",
.is_wildcard = 1,
@@ -218,7 +218,7 @@ static struct stasis_rest_handlers sounds_soundId = {
.num_children = 0,
.children = { }
};
-/*! \brief REST handler for /api-docs/sounds.{format} */
+/*! \brief REST handler for /api-docs/sounds.json */
static struct stasis_rest_handlers sounds = {
.path_segment = "sounds",
.callbacks = {
diff --git a/res/res_format_attr_g729.c b/res/res_format_attr_g729.c
new file mode 100644
index 000000000..5ba4920d9
--- /dev/null
+++ b/res/res_format_attr_g729.c
@@ -0,0 +1,76 @@
+/*
+ * Asterisk -- An open source telephony toolkit.
+ *
+ * Copyright (C) 2016, Digium, Inc.
+ *
+ * Jason Parker <jparker@sangoma.com>
+ *
+ * See http://www.asterisk.org for more information about
+ * the Asterisk project. Please do not directly contact
+ * any of the maintainers of this project for assistance;
+ * the project provides a web site, mailing lists and IRC
+ * channels for your use.
+ *
+ * This program is free software, distributed under the terms of
+ * the GNU General Public License Version 2. See the LICENSE file
+ * at the top of the source tree.
+ */
+
+/*** MODULEINFO
+ <support_level>core</support_level>
+ ***/
+
+#include "asterisk.h"
+
+ASTERISK_REGISTER_FILE()
+
+#include "asterisk/module.h"
+#include "asterisk/format.h"
+
+/* Destroy is a required callback and must exist */
+static void g729_destroy(struct ast_format *format)
+{
+}
+
+/* Clone is a required callback and must exist */
+static int g729_clone(const struct ast_format *src, struct ast_format *dst)
+{
+ return 0;
+}
+
+static void g729_generate_sdp_fmtp(const struct ast_format *format, unsigned int payload, struct ast_str **str)
+{
+ /*
+ * According to the rfc the joint annexb format parameter should be set to 'yes'
+ * or 'no' based on the answerer (rfc7261 - 3.3). However, Asterisk being a B2BUA
+ * makes things tricky. So for now Asterisk will set annexb=no.
+ */
+ ast_str_append(str, 0, "a=fmtp:%u annexb=no\r\n", payload);
+}
+
+static struct ast_format_interface g729_interface = {
+ .format_destroy = g729_destroy,
+ .format_clone = g729_clone,
+ .format_generate_sdp_fmtp = g729_generate_sdp_fmtp,
+};
+
+static int load_module(void)
+{
+ if (ast_format_interface_register("g729", &g729_interface)) {
+ return AST_MODULE_LOAD_DECLINE;
+ }
+
+ return AST_MODULE_LOAD_SUCCESS;
+}
+
+static int unload_module(void)
+{
+ return 0;
+}
+
+AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "G.729 Format Attribute Module",
+ .support_level = AST_MODULE_SUPPORT_CORE,
+ .load = load_module,
+ .unload = unload_module,
+ .load_pri = AST_MODPRI_CHANNEL_DEPEND,
+);
diff --git a/res/res_odbc.c b/res/res_odbc.c
index 31ea29b03..2477def5b 100644
--- a/res/res_odbc.c
+++ b/res/res_odbc.c
@@ -41,6 +41,7 @@
/*** MODULEINFO
<depend>generic_odbc</depend>
+ <depend>res_odbc_transaction</depend>
<depend>ltdl</depend>
<support_level>core</support_level>
***/
diff --git a/res/res_odbc_transaction.c b/res/res_odbc_transaction.c
index 33800c3ce..b849a293e 100644
--- a/res/res_odbc_transaction.c
+++ b/res/res_odbc_transaction.c
@@ -26,7 +26,6 @@
#include "asterisk/module.h"
/*** MODULEINFO
- <depend>res_odbc</depend>
<support_level>core</support_level>
***/
diff --git a/res/res_pjsip.c b/res/res_pjsip.c
index aafb3a211..96c07d501 100644
--- a/res/res_pjsip.c
+++ b/res/res_pjsip.c
@@ -913,6 +913,12 @@
then the <replaceable>context</replaceable> setting is used.
</para></description>
</configOption>
+ <configOption name="contact_user" default="">
+ <synopsis>Force the user on the outgoing Contact header to this value.</synopsis>
+ <description><para>
+ On outbound requests, force the user portion of the Contact header to this value.
+ </para></description>
+ </configOption>
</configObject>
<configObject name="auth">
<synopsis>Authentication type</synopsis>
@@ -2869,8 +2875,16 @@ pjsip_dialog *ast_sip_create_dialog_uac(const struct ast_sip_endpoint *endpoint,
/* Update the dialog with the new local URI, we do it afterwards so we can use the dialog pool for construction */
pj_strdup_with_null(dlg->pool, &dlg->local.info_str, &local_uri);
dlg->local.info->uri = pjsip_parse_uri(dlg->pool, dlg->local.info_str.ptr, dlg->local.info_str.slen, 0);
+
dlg->local.contact = pjsip_parse_hdr(dlg->pool, &HCONTACT, local_uri.ptr, local_uri.slen, NULL);
+ if (!ast_strlen_zero(endpoint->contact_user)) {
+ pjsip_sip_uri *sip_uri;
+
+ sip_uri = pjsip_uri_get_uri(dlg->local.contact->uri);
+ pj_strdup2(dlg->pool, &sip_uri->user, endpoint->contact_user);
+ }
+
/* If a request user has been specified and we are permitted to change it, do so */
if (!ast_strlen_zero(request_user)) {
pjsip_sip_uri *sip_uri;
@@ -3172,6 +3186,18 @@ static int create_out_of_dialog_request(const pjsip_method *method, struct ast_s
return -1;
}
+ if (endpoint && !ast_strlen_zero(endpoint->contact_user)){
+ pjsip_contact_hdr *contact_hdr;
+ pjsip_sip_uri *contact_uri;
+ static const pj_str_t HCONTACT = { "Contact", 7 };
+
+ contact_hdr = pjsip_msg_find_hdr_by_name((*tdata)->msg, &HCONTACT, NULL);
+ if (contact_hdr) {
+ contact_uri = pjsip_uri_get_uri(contact_hdr->uri);
+ pj_strdup2(pool, &contact_uri->user, endpoint->contact_user);
+ }
+ }
+
/* Add the user=phone parameter if applicable */
ast_sip_add_usereqphone(endpoint, (*tdata)->pool, (*tdata)->msg->line.req.uri);
diff --git a/res/res_pjsip/pjsip_configuration.c b/res/res_pjsip/pjsip_configuration.c
index 9e757e230..c3012c4b2 100644
--- a/res/res_pjsip/pjsip_configuration.c
+++ b/res/res_pjsip/pjsip_configuration.c
@@ -1211,6 +1211,31 @@ static int voicemail_extension_to_str(const void *obj, const intptr_t *args, cha
return 0;
}
+static int contact_user_handler(const struct aco_option *opt,
+ struct ast_variable *var, void *obj)
+{
+ struct ast_sip_endpoint *endpoint = obj;
+
+ endpoint->contact_user = ast_strdup(var->value);
+ if (!endpoint->contact_user) {
+ return -1;
+ }
+
+ return 0;
+}
+
+static int contact_user_to_str(const void *obj, const intptr_t *args, char **buf)
+{
+ const struct ast_sip_endpoint *endpoint = obj;
+
+ *buf = ast_strdup(endpoint->contact_user);
+ if (!(*buf)) {
+ return -1;
+ }
+
+ return 0;
+}
+
static void *sip_nat_hook_alloc(const char *name)
{
return ast_sorcery_generic_alloc(sizeof(struct ast_sip_nat_hook), NULL);
@@ -1907,6 +1932,7 @@ int ast_res_pjsip_initialize_configuration(const struct ast_module_info *ast_mod
ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "contact_permit", "", endpoint_acl_handler, NULL, NULL, 0, 0);
ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "contact_acl", "", endpoint_acl_handler, contact_acl_to_str, NULL, 0, 0);
ast_sorcery_object_field_register(sip_sorcery, "endpoint", "subscribe_context", "", OPT_CHAR_ARRAY_T, 0, CHARFLDSET(struct ast_sip_endpoint, subscription.context));
+ ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "contact_user", "", contact_user_handler, contact_user_to_str, NULL, 0, 0);
if (ast_sip_initialize_sorcery_transport()) {
ast_log(LOG_ERROR, "Failed to register SIP transport support with sorcery\n");
@@ -2038,6 +2064,7 @@ static void endpoint_destructor(void* obj)
ao2_cleanup(endpoint->persistent);
ast_variables_destroy(endpoint->channel_vars);
AST_VECTOR_FREE(&endpoint->ident_method_order);
+ ast_free(endpoint->contact_user);
}
static int init_subscription_configuration(struct ast_sip_endpoint_subscription_configuration *subscription)
diff --git a/res/res_pjsip_session.c b/res/res_pjsip_session.c
index a41e0aa5d..856626a02 100644
--- a/res/res_pjsip_session.c
+++ b/res/res_pjsip_session.c
@@ -2741,22 +2741,21 @@ static void session_inv_on_tsx_state_changed(pjsip_inv_session *inv, pjsip_trans
}
break;
case PJSIP_EVENT_TRANSPORT_ERROR:
- /*
- * Clear the module data now to block session_inv_on_state_changed()
- * from calling session_end() if it hasn't already done so.
- */
- inv->mod_data[id] = NULL;
+ if (inv->state == PJSIP_INV_STATE_DISCONNECTED) {
+ /*
+ * Clear the module data now to block session_inv_on_state_changed()
+ * from calling session_end() if it hasn't already done so.
+ */
+ inv->mod_data[id] = NULL;
- if (inv->state != PJSIP_INV_STATE_DISCONNECTED) {
- session_end(session);
+ /*
+ * Pass the session ref held by session->inv_session to
+ * session_end_completion().
+ */
+ session_end_completion(session);
+ return;
}
-
- /*
- * Pass the session ref held by session->inv_session to
- * session_end_completion().
- */
- session_end_completion(session);
- return;
+ break;
case PJSIP_EVENT_TIMER:
/*
* The timer event is run by the pjsip monitor thread and not
@@ -2776,7 +2775,8 @@ static void session_inv_on_tsx_state_changed(pjsip_inv_session *inv, pjsip_trans
* Pass the session ref held by session->inv_session to
* session_end_completion().
*/
- if (ast_sip_push_task(session->serializer, session_end_completion, session)) {
+ if (session
+ && ast_sip_push_task(session->serializer, session_end_completion, session)) {
/* Do it anyway even though this is not the right thread. */
session_end_completion(session);
}
diff --git a/rest-api-templates/api.wiki.mustache b/rest-api-templates/api.wiki.mustache
index 0a54a64a7..ad12bb695 100644
--- a/rest-api-templates/api.wiki.mustache
+++ b/rest-api-templates/api.wiki.mustache
@@ -1,7 +1,8 @@
{{#api_declaration}}
h1. {{name_title}}
-|| Method || Path || Return Model || Summary ||
+|| Method || Path<br>h5. Parameters are case-sensitive || Return Model || Summary ||
+
{{#apis}}
{{#operations}}
| {{http_method}} | [{{wiki_path}}|#{{nickname}}] | {{#response_class}}{{#is_primitive}}{{name}}{{/is_primitive}}{{^is_primitive}}[{{wiki_name}}|{{wiki_prefix}} REST Data Models#{{singular_name}}]{{/is_primitive}}{{/response_class}} | {{summary}} |
@@ -17,6 +18,7 @@ h2. {{nickname}}: {{http_method}} {{wiki_path}}
{{#has_path_parameters}}
h3. Path parameters
+Parameters are case-sensitive.
{{#path_parameters}}
* {{name}}: _{{data_type}}_ - {{{wiki_description}}}
{{#default_value}}
diff --git a/rest-api-templates/swagger_model.py b/rest-api-templates/swagger_model.py
index f3b49e12e..e0eda0143 100644
--- a/rest-api-templates/swagger_model.py
+++ b/rest-api-templates/swagger_model.py
@@ -688,7 +688,7 @@ class ResourceApi(Stringify):
def load(self, api_json, processor, context):
context = context.next_stack(api_json, 'path')
validate_required_fields(api_json, self.required_fields, context)
- self.path = api_json['path']
+ self.path = api_json['path'].replace('{format}', 'json')
self.description = api_json['description']
if not self.path or self.path[0] != '/':
@@ -697,7 +697,7 @@ class ResourceApi(Stringify):
return self
def load_api_declaration(self, base_dir, processor):
- self.file = (base_dir + self.path).replace('{format}', 'json')
+ self.file = (base_dir + self.path)
self.api_declaration = ApiDeclaration().load_file(self.file, processor)
processor.process_resource_api(self, [self.file])