ADC

SIP 表达式

NetScaler 高级策略表达式语言包含许多在会话初始协议 (SIP) 连接上运行的表达式。这些表达式旨在用于在请求/响应基础上运行的任何支持协议的策略中。这些表达式可用于内容切换、速率限制、响应程序和重写策略。

某些限制适用于响应程序策略中使用的 SIP 表达式。在 SIP 负载平衡虚拟服务器上只允许执行 DROP、NOOP 或 RESPONDWITH 操作。响应程序策略可以绑定到负载平衡虚拟服务器、覆盖全局绑定点、默认全局绑定点或 sip_udp 策略标签。

SIP 协议使用的标头格式与 HTTP 协议使用的标头格式类似,因此许多新表达式的外观和功能与其 HTTP 类似表达式非常相似。每个 SIP 标头由一行包含 SIP 方法、URL 和版本组成,然后是一系列看起来像 HTTP 标头的名称/值对。

以下是其下方的表达式表中提及的 SIP 标头示例:

INVITE sip:16@www.sip.com:5060;transport=udp SIP/2.0
Record-Route: <sip:200.200.100.22;lr=on>
Via: SIP/2.0/UDP 200.200.100.22;branch=z9hG4bK444b.c8e103d1.0;rport=5060;
    received=10.102.84.18
Via: SIP/2.0/UDP 10.102.84.180:5060;branch=z9hG4bK03e76d0b;rport=5060;
    received=10.102.84.160
From: "12" <sip:12@sip_example.com>;tag=00127f54ec85a6d90cc14f45-53cc0185
To: "16" <sip:16@sip_example.com>;tag=00127f54ec85a6d90cc14f45-53cc0185
Call-ID: 00127f54-ec850017-0e46f5b9-5ec149c2@10.102.84.180
Max-Forwards: 69CSeq: 101 INVITE
User-Agent: Cisco-CP7940G/8.0
Contact: <sip:12@10.102.84.180:5060;transport=udp>
Expires: 180
Accept: application/sdp
Allow: ACK,BYE,CANCEL,INVITE,NOTIFY,OPTIONS,REFER,REGISTER,UPDATE
Supported: replaces,join,norefersub
Content-Length: 277
Content-Type: application/sdp
Content-Disposition: session;handling=optiona
<!--NeedCopy-->

SIP 参考表

下表包含对 SIP 标头进行操作的表达式列表。第一个表包含适用于请求标头的表达式。大多数基于响应的表达式与相应的基于请求的表达式几乎相同。要根据相应的请求表达式创建响应表达式,请将表达式的前两部分从 SIP.REQ 更改为 SIP.RES,然后进行其他明显的调整。第二个表包含响应所独有的响应表达式,没有等效的请求。您可以将下表中的任何元素单独用作完整的表达式,也可以使用各种运算符将这些表达式元素与其他元素组合以形成更复杂的表达式。

SIP 请求表达式

表达式 说明
SIP.REQ.METHOD 在 SIP 请求的方法上运行。支持的 SIP 请求方法有 ACK、BYE、取消、信息、邀请、消息、通知、选项、PRACK、发布、推荐、注册、订阅和更新。此表达式是文本类的派生物,因此所有适用于文本的操作都适用于此方法。例如,对于 INVITE sip:16@10.102.84.181:5060;transport=udp SIP/2.0 的 SIP 请求,此表达式返回 INVITE。
SIP.REQ.URL 在 SIP 请求 URL 上操作。此表达式是文本类的派生物,因此所有适用于文本的操作都适用于此方法。例如,对于 INVITE sip:16@10.102.84.181:5060;transport=udp SIP/2.0 的 SIP 请求,此表达式返回 ssip:16@10.102.84.181:5060;transport=udp。
SIP.REQ.URL.PROTOCOL 返回 URL 协议。例如,对于 sip:16@www.sip.com:5060;transport=udp 的 SIP URL,此表达式返回 sip。
SIP.REQ.URL.HOSTNAME 返回 SIP URL 的主机名部分。例如,对于 sip:16@www.sip.com:5060;transport=udp 的 SIP URL,此表达式返回 www.sip.com:5060。
SIP.REQ.URL.HOSTNAME.PORT 返回 SIP URL 主机名的端口部分。如果未指定端口,则此表达式返回默认 SIP 端口 5060。例如,对于 www.sip.com:5060 的 SIP 主机名,此表达式返回 5060。
SIP.REQ.URL.HOSTNAME.DOMAIN 返回 SIP URL 主机名的域名部分。如果主机是 IP 地址,则此表达式返回不正确的结果。例如,对于 www.sip.com: 5060 的 SIP 主机名,此表达式返回 sip.com。对于 192.168.43. 15:5060 的 SIP 主机名,此表达式会返回错误。
SIP.REQ.URL.HOSTNAME.SERVER 返回主机的服务器部分。例如,对于 www.sip.com: 5060 的 SIP 主机名,此表达式返回 www。
SIP.REQ.URL.USERNAME 返回 @ 字符之前的用户名。例如,对于 sip:16@www.sip.com:5060;transport=udp 的 SIP URL,此表达式返回 16。
SIP.REQ.VERSION 返回请求中的 SIP 版本号。例如,对于 INVITE sip:16@10.102.84.181:5060;transport=udp SIP/2.0 的 SIP 请求,此表达式返回 SIP/2.0。
SIP.REQ.VERSION.MAJOR 返回主要版本号(句点左边的数字)。例如,对于 SIP/2.0 的 SIP 版本号,此表达式返回 2。
SIP.REQ.VERSION.MINOR 返回次要版本号(句点右边的数字)。例如,对于 SIP/2.0 的 SIP 版本号,此表达式返回 0。
SIP.REQ.CONTENT_LENGTH 返回内容长度标题的内容。此表达式是 thesip_header_t 类的衍生物,因此可以使用所有可用于 SIP 标头的操作。例如,对于内容长度为 277 的 SIP 内容长度标头,此表达式返回 277。
SIP.REQ.TO 返回 To 标题的内容。例如,对于 To: “16” <sip:16@sip_example.com>;tag=00127f54ec85a6d90cc14f45-53cc0185 的 SIP To 标头,此表达式返回 “16” <sip:16@sip_example.com>;tag=00127f54ec85a6d90cc14f45-53cc0185。
SIP.REQ.TO.ADDRESS 返回 SIP URI,它位于 sip_url 对象中。所有可用于 SIP URI 的操作均可使用。例如,对于 To: “16” <sip:16@sip_example.com>;tag=00127f54ec85a6d90cc14f45-53cc0185 的 SIP To 标头,此表达式返回 sip:16@sip_example.com。
SIP.REQ.TO.DISPLAY_NAME 返回 To 标题的显示名称部分。例如,对于 To: “16” <sip:16@sip_example.com>;tag=00127f54ec85a6d90cc14f45-53cc0185 的 SIP To 标头,此表达式返回 16。
SIP.REQ.TO.TAG 返回 TO 标头中“标签”名称值对中的“标签”值。例如,对于 To: “16” <sip:16@sip_example.com>;tag=00127f54ec85a6d90cc14f45-53cc0185, 的 SIP To 标头,此表达式返回 00127f54ec85a6d90cc14f45-53cc0185。
SIP.REQ.FROM 返回 From 标题的内容。例如,对于 SIP From 标头为 “12” <sip:12@sip_example.com>;tag=00127f54ec85a6d90cc14f45-53cc0185,此表达式返回 sip:12@sip_example.com。
SIP.REQ.FROM.ADDRES 返回 SIP URI,它位于 sip_url 对象中。所有可用于 SIP URI 的操作均可使用。例如,对于 SIP From 标头为 “12” <sip:12@sip_example.com>;tag=00127f54ec85a6d90cc14f45-53cc0185,此表达式返回 sip:12@sip_example.com。
SIP.REQ.FROM.DISPLAY_NAME 返回 To 标题的显示名称部分。例如,对于 From: “12” <sip:12@sip_example.com>;tag=00127f54ec85a6d90cc14f45-53cc0185 的 SIP From 标头,此表达式返回 12。
SIP.REQ.FROM.TAG 返回 TO 标头中“标签”名称/值对中的“标签”值。例如,对于 From: “12” <sip:12@sip_example.com>;tag=00127f54ec85a6d90cc14f45-53cc0185 的 SIP From 标头,此表达式返回 00127f54ec85a6d90cc14f45-53cc0185。
SIP.REQ.VIA 返回完整的 Via 标头。如果请求中有多个 Via 标头,则返回最后一个 Via 标头。例如,对于示例 SIP 标头中的两个 Via 标头,此表达式返回 Via: SIP/2.0/UDP 10.102.84.180:5060;branch=z9hG4bK03e76d0b;rport=5060;received=10.102.84.160。
SIP.REQ.VIA.SENTBY_ADDRESS 返回发送请求的地址。例如,对于 Via 标头 Via: SIP/2.0/UDP 10.102.84.180:5060;branch=z9hG4bK03e76d0b;rport=5060;received=10.102.84.160,此表达式返回 10.102.84.180。
SIP.REQ.VIA.SENTBY_PORT 返回发送请求的端口。例如,对于 Via 标头Via: SIP/2.0/UDP 10.102.84.180:5060;branch=z9hG4bK03e76d0b;rport=5060;received=10.102.84.160,此表达式返回 5060。
SIP.REQ.VIA.RPORT 返回报表名称/值对中的值。例如,对于 Via 标头Via: SIP/2.0/UDP 10.102.84.180:5060;branch=z9hG4bK03e76d0b;rport=5060;received=10.102.84.160,此表达式返回 5060。
SIP.REQ.VIA.BRANCH 返回分支名称/值对中的值。例如,对于 Via: SIP/2.0/UDP 10.102.84.180:5060;branch=z9hG4bK03e76d0b;rport=5060;received=10.102.84.160,此表达式返回 z9hG4bK03e76d0b。
SIP.REQ.VIA.RECEIVED 返回收到的名称/值对中的值。例如,对于 Via 标头 Via: SIP/2.0/UDP 10.102.84.180:5060;branch=z9hG4bK03e76d0b;rport=5060;received=10.102.84.160,此表达式返回 10.102.84.160。
SIP.REQ.CALLID 返回 Callid 标头的内容。此表达式是 thesip_header_t 类的衍生物,因此可以使用所有可用于 SIP 标头的操作。例如,对于 Call-ID: 00127f54-ec850017-0e46f5b9-5ec149c2@10.102.84.180 的 SIP Callid 标头,此表达式返回 00127f54-ec850017-0e46f5b9-5ec149c2@10.102.84.180。
SIP.REQ.CSEQ 以整数形式返回 CSEQ 中的 CSEQ 数字。例如,对于 cseq: 101 INVITE 的 SIP CSEQ 标头,此表达式返回 101。
SIP.REQ.HEADER(<header_name>) 返回指定的 SIP 标头。对于 <header_name>,请替换所需标头的名称。例如,要返回 SIP 发件人标头,应键入 SIP.REQ.HEADER(“发件人”)。
SIP.REQ.HEADER(\<header_name>).INSTANCE(\) 返回指定 SIP 标头的指定实例。同一 SIP 标头可能会出现多个实例。如果您想要这样的 SIP 标头的特定实例(例如,特定的 Via 标头),则可以通过键入数字作为来指定该标头<line_number>。标头实例从最后一个 (0) 匹配到第一个实例。换句话说,SIP.REQ.HEADER(“Via”).INSTANCE(0) 返回 Via 标头的最后一个实例,而 SIP.REQ.HEADER(“Via”).INSTANCE(1) 返回最后一个实例,依此类推。例如,如果在示例 SIP 标头上使用,则 SIP.REQ.HEADER(“Via”).INSTANCE(1) 返回 Via: SIP/2.0/UDP 10.102.84.180:5060;branch=z9hG4bK03e76d0b;rport=5060。
SIP.REQ.HEADER(\<header_name>).VALUE(\) 返回指定 SIP 标头的指定实例的内容。用法与前面的表达式几乎相同。例如,如果在前面表格条目中的 SIP 标头示例中使用,则 SIP.REQ.HEADER(“Via”).VALUE(1) 返回 SIP/2.0/UDP 10.102.84.180:5060;branch=z9hG4bK03e76d0b;rport=5060。
SIP.REQ.HEADER(<header_name>).COUNT 以整数形式返回特定标头的实例数。例如,如果在上面的 SIP 标头示例中使用,则 SIP.REQ.HEADER(“Via”).COUNT 返回 2。
SIP.REQ.HEADER(<header_name>).EXISTS 返回 true 或 false 的布尔值,具体取决于指定的标头是否存在。例如,如果在上面的 SIP 标头示例中使用,则 SIP.REQ.HEADER(“Expires”).EXISTS 返回 true,而 SIP.REQ.HEADER(“Caller-ID”).EXISTS 返回 false。
SIP.REQ.HEADER(<header_name>).LIST 返回指定标题中以逗号分隔的参数列表。例如,如果在上面的 SIP 标头示例中使用,则 SIP.REQ.HEADER(“Allow”).LIST 返回 ACK,BYE,CANCEL,INVITE,NOTIFY,OPTIONS,REFER,REGISTER,UPDATE。您可以附加字符串.GET (<list_item_number>) 来选择特定的列表项。例如,要从上面的列表中获取第一项 (ACK),您可以键入 SIP.REQ.HEADER(“Allow”).LIST.GET(0)。要提取第二个项目 (BYE),您可以键入 SIP.REQ.HEADER(“Allow”).LIST.GET(1).。注意:如果指定的标头包含名称/值对列表,则返回整个名称/值对。
SIP.REQ.HEADER(\<header_name>).TYPECAST_SIP_HEADER_T(“\") 将 <header_name> 类型转换为 <in_header_name>。任何文本都可以类型化为 thesip_header_t 类,之后可以使用所有基于标题的操作。执行此操作后,您可以应用所有可以使用的操作<in_header_name>。例如,表达式 SIP.REQ.CONTENT_LENGTH.TYPECAST_SIP_HEADER_T 对内容长度标头的所有实例进行类型转换。执行此操作后,可以将所有标头操作应用于指定标头的所有实例。
SIP.REQ.HEADER(<header_name>).CONTAINS(<string>). 如果指定的文本字符串存在于指定标题的任何实例中,则返回布尔值 true。对指定标头的所有实例进行操作。标头实例从最后一个 (0) 匹配到第一个实例。
SIP.REQ.HEADER(<header_name>).EQUALS_ANY(<patset>) 如果与 <patset> 关联的任何模式与指定标题的任何实例中的任何内容相匹配,则返回布尔值 true。对指定标头的所有实例进行操作。标头实例从最后一个 (0) 匹配到第一个实例。
SIP.REQ.HEADER(<header_name>).CONTAINS_ANY(<patset>) 如果与 <patset> 关联的任何模式与指定标题的任何实例中的任何内容相匹配,则返回布尔值 true。对指定标头的所有实例进行操作。标头实例从最后一个 (0) 匹配到第一个实例。
SIP.REQ.HEADER(<header_name>).CONTAINS_INDEX(<patset>) 如果与 <patset> 关联的匹配模式与指定标题的任何实例中的任何内容相匹配,则返回该模式的索引。对指定标头的所有实例进行操作。标头实例从最后一个 (0) 匹配到第一个实例。
SIP.REQ.HEADER(<header_name>).EQUALS_INDEX(<patset>) 如果与 <patset> 关联的匹配模式与指定标头的任何实例相匹配,则返回该模式的索引。对指定标头的所有实例进行操作。标头实例从最后一个 (0) 匹配到第一个实例。
SIP.REQ.HEADER(<header_name>).SUBSTR(<string>) 如果指定的字符串存在于指定标头的任何实例中,则此表达式返回该字符串。例如,对于 SIP 标头 Via: SIP/2.0/UDP 10.102.84.180:5060;branch=z9hG4bK03e76d0b;rport=5060;received=10.102.84.160”,SIP.REQ.HEADER(“Via”).SUBSTR(“rport=5060”) 返回 “rport=5060”.SIP.REQ.HEADER(“Via”).SUBSTR(“rport=5061”) 返回一个空字符串。
SIP.REQ.HEADER(<header_name>).AFTER_STR(<string>) 如果指定的字符串存在于指定标头的任何实例中,则此表达式将立即返回该字符串之后的字符串。例如,对于 SIP 标头 Via: SIP/2.0/UDP 10.102.84.180:5060;branch=z9hG4bK03e76d0b;rport=5060;received=10.102.84.160,表达式 SIP.REQ.HEADER(“Via”).AFTER_STR(“rport=”) 返回 5060。
SIP.REQ.HEADER(<header_name>).REGEX_MATCH(<regex>) 如果指定的正则表达式 (regex) 与指定标头的任何实例相匹配,则返回布尔值 true。必须按以下格式指定正则表达式:re<delimiter>regular expression<same delimiter>。正则表达式的长度不能超过 1499 个字符。它必须符合 PCRE 正则表达式库。有关 PCRE 正则表达式语法的文档,请参见 http://www.pcre.org/pcre.txt。pcrepattern 手册页还包含有关使用 PCRE 正则表达式指定模式的有用信息。此表达式中支持的正则表达式语法与 PCRE 有一些区别。不允许向后引用。您应该避免使用递归正则表达式;尽管有些可行,但许多不行。点 (.) 元字符与换行符匹配。不支持 Unicode。set_Text_Mode (IGNORECASE) 会覆盖 (?i) 正则表达式中指定的内部选项。
SIP.REQ.HEADER(<header_name>).REGEX_SELECT(<regex>) 如果指定的正则表达式匹配指定标头的任何实例中的任何文本,则此表达式返回文本。例如,对于 SIP 标头 Via: SIP/2.0/UDP 10.102.84.180:5060;branch=z9hG4bK03e76d0b;rport=5060;received=10.102.84.160,表达式 SIP.REQ.HEADER(“Via”).REGEX_SELECT(“received=[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}”) 返回 received=10.102.84.160。
SIP.REQ.HEADER(<header_name>).AFTER_REGEX(<regex>) 如果指定的正则表达式与指定标题的任何实例中的任何文本匹配,则此表达式将立即返回该文本之后的字符串。例如,对于 SIP 标头 Via: SIP/2.0/UDP 10.102.84.180:5060;branch=z9hG4bK03e76d0b;rport=5060;received=10.102.84.160,表达式 SIP.REQ.HEADER(“Via”).AFTER_REGEX(“received=”) 返回 10.102.84.160。
SIP.REQ.HEADER(<header_name>).BEFORE_REGEX(<regex>) 如果指定的正则表达式与指定标题的任何实例中的任何文本匹配,则此表达式返回紧邻该文本之前的字符串。例如,对于 SIP 标头 Via: SIP/2.0/UDP 10.102.84.180:5060;branch=z9hG4bK03e76d0b;rport=5060;received=10.102.84.160,表达式 SIP.REQ.HEADER(“Via”).BEFORE_REGEX(“[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}”) 返回 received=。
SIP.REQ.FULL_HEADER 返回整个 SIP 标头,包括终止的 CR/LF。
SIP.REQ.IS_VALID 如果请求格式有效,则返回布尔值 true。
SIP.REQ.BODY(<length>) 返回请求正文,不超过指定长度。如果指定的长度大于请求正文的长度,则此表达式返回整个请求正文。
SIP.REQ.LB_VSERVER 返回为当前请求提供服务的负载平衡虚拟服务器 (LB vserver) 的名称。
SIP.REQ.CS_VSERVER 返回为当前请求提供服务的内容交换虚拟服务器 (CS vserver) 的名称。

SIP 响应表达式

表达式 说明
SIP.RES.STATUS 返回 SIP 响应状态码。例如,如果响应的第一行是 SIP/2.0 100 Tringy,则此表达式返回 100。
SIP.RES.STATUS_MSG 返回 SIP 响应状态消息。例如,如果响应的第一行是 SIP/2.0 100 Trying,则此表达式返回 Tringy。
SIP.RES.IS_REDIRECT 如果响应代码是重定向,则返回布尔值 true。
SIP.RES.METHOD 返回从 cseQ 标头中的请求方法字符串中提取的响应方法。
SIP 表达式