ADC

SIP 表达式

Citrix ADC 高级策略表达式语言包含许多在会话初始协议 (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, CANCEL, INFO, INVITE, MESSAGE, NOTIFY, OPTIONS, PRACK, PUBLISH, REFER, REGISTER, SUBSCRIBE, and UPDATE。此表达式是文本类的衍生物,因此适用于文本的所有操作都适用于此方法。例如,对于 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 返回“内容长度”标头的内容。此表达式是 thep_header_t 类的衍生物,因此可以使用 SIP 标头可用的所有操作。例如,对于 Content-Length: 277 的 SIP 内容长度标头,此表达式返回 277。
SIP.REQ.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_url 对象中找到的 SIP URI。可以使用 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: “16” <sip:16@sip_example.com>;tag=00127f54ec85a6d90cc14f45-53cc0185”的 SIP To 标头,此表达式返回 00127f54ec85a6d90cc14f45-53cc0185。
SIP.REQ.FROM 返回 From 标头的内容。例如,对于“From: “12” <sip:12@sip_example.com>;tag=00127f54ec85a6d90cc14f45-53cc0185”的 SIP From 标头,此表达式返回 sip:12@sip_example.com。
SIP.REQ.FROM.ADDRESS 返回在 sip_url 对象中找到的 SIP URI。可以使用 SIP URI 可用的所有操作。例如,对于“From: “12” <sip:12@sip_example.com>;tag=00127f54ec85a6d90cc14f45-53cc0185”的 SIP From 标头,此表达式返回 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 返回发送请求的端口。例如,对于 ViaVia: SIP/2.0/UDP 10.102.84.180:5060;branch=z9hG4bK03e76d0b;rport=5060;received=10.102.84.160 标头 ,此表达式返回 5060。
SIP.REQ.VIA.RPORT 返回 rport 名称/值对中的值。例如,对于 ViaVia: SIP/2.0/UDP 10.102.84.180:5060;branch=z9hG4bK03e76d0b;rport=5060;received=10.102.84.160 标头 ,此表达式返回 5060。
SIP.REQ.VIA.BRANCH 返回分支名称/值对中的值。例如,对于 Via 标头 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 返回 Calllid 标头的内容。此表达式是 thep_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() 返回指定的 SIP 标头。对于 ,替换所需标头的名称。例如,若要返回 SIP 发件人标头,您可以键入 SIP.REQ.HEADER("From")。
SIP.REQ.HEADER().INSTANCE() 返回指定 SIP 标头的指定实例。可能会出现同一 SIP 标头的多个实例。如果您想要此类 SIP 标头的特定实例(例如,特定的 Via 标头),则可以通过键入数字作为指定该标头 。头实例从上一个 (0) 到第一个匹配。换句话说,SIP.REQ.HEADER("Via").INSTANCE(0) 返回通过标头的最后一个实例,而 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().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().COUNT 以整数形式返回特定标头的实例数。例如,如果在上述 SIP 标头示例中使用,则 SIP.REQ.HEADER(“Via”).COUNT 返回 2。
SIP.REQ.HEADER().EXISTS 返回一个布尔值为 true 或 false,具体取决于指定的标头是否存在。例如,如果在上述 SIP 标头示例中使用,则SIP.REQ.HEADER(“Expires”).EXISTS 返回 true,而 SIP.REQ.HEADER(“Caller-ID”).EXISTS 返回 false。
SIP.REQ.HEADER().LIST 返回指定标头中逗号分隔的参数列表。例如,如果在上述 SIP 标头示例中使用,SIP.REQ.HEADER(“Allow”).LIST 将返回 ACK,BYE,CANCEL,INVITE,NOTIFY,OPTIONS,REFER,REGISTER,UPDATE.。您可以追加字符串 .GET () 以选择特定列表项。例如,要从上面的列表中获取第一个项目 (ACK),您可以键入 SIP.REQ.HEADER("Allow").LIST.GET(0)。要提取第二个项目(BYE),您可以键入 SIP.REQ.HEADER("Allow").LIST.GET(1)。注意:如果指定的标头包含名称/值对的列表,则返回整个名称/值对。
SIP.REQ.HEADER().TYPECAST_SIP_HEADER_T("") 类型 。任何文本都可以被类型化为 sip_header_t 类,之后可以使用所有基于标头的操作。执行此操作后,您可以应用可以与之一起使用的所有操作 。例如对于表达式 SIP.REQ.CONTENT_LENGTH.TYPECAST_SIP_HEADER_T 类型将内容长度标头的所有实例显示。执行此操作后,您可以将所有标头操作应用于指定标头的所有实例。
SIP.REQ.HEADER().CONTAINS(). 如果指定的文本字符串存在于指定标头的任何实例中,则返回布尔值 true。在指定标头的所有实例上运行。头实例从上一个 (0) 到第一个匹配。
SIP.REQ.HEADER().EQUALS_ANY() 如果任何与 指定标头的任何实例中的任何内容相匹配,则返回布尔值 true。在指定标头的所有实例上运行。头实例从上一个 (0) 到第一个匹配。
SIP.REQ.HEADER().CONTAINS_ANY() 如果与 指定标头的任何实例中的任何内容相匹配,则返回布尔值 true。在指定标头的所有实例上运行。头实例从上一个 (0) 到第一个匹配。
SIP.REQ.HEADER().CONTAINS_INDEX() 返回匹配模式的索引, 如果该模式与指定标头的任何实例中的任何内容匹配。在指定标头的所有实例上运行。头实例从上一个 (0) 到第一个匹配。
SIP.REQ.HEADER().EQUALS_INDEX() 返回匹配模式的索引, 如果匹配模式与指定标头的任何实例匹配。在指定标头的所有实例上运行。头实例从上一个 (0) 到第一个匹配。
SIP.REQ.HEADER().SUBSTR() 如果指定字符串存在于指定标头的任何实例中,则此表达式将返回该字符串。例如,对于 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().AFTER_STR() 如果指定的字符串存在于指定标头的任何实例中,则此表达式立即返回该字符串之后的字符串。例如,对于 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().REGEX_MATCH() 如果指定的正则表达式 (正则表达式) 与指定标头的任何实例匹配,则返回布尔值 true。您必须以以下格式指定正则表达式:re 正则表达式 。正则表达式的长度不能大于 1499 个字符。它必须符合 PCRE 正则表达式库。有关 PCRE 正则表达式语法的文档,请参阅http://www.pcre.org/pcre.txt。pcrepattern 手册页还提供了有关使用 PCRE 正则表达式指定模式的有用信息。此表达式中支持的正则表达式语法与 PCRE 有一些区别。反向引用是不允许的。您应该避免递归正则表达式; 虽然有些工作,但许多人不会。点 (.) 元字符匹配换行符。不支持 Unicode。设置文本模式(忽略)覆盖(? i)在正则表达式中指定的内部选项。
SIP.REQ.HEADER().REGEX_SELECT() 如果指定的正则表达式匹配指定标头的任何实例中的任何文本,则此表达式返回文本。例如,对于 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().AFTER_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().BEFORE_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() 返回请求正文,最多不超过指定长度。如果指定的长度大于请求正文的长度,则此表达式返回整个请求正文。
SIP.REQ.LB_VSERVER 返回为当前请求提供服务的负载平衡虚拟服务器 (LB虚拟服务器) 的名称。
SIP.REQ.CS_VSERVER 返回为当前请求提供服务的内容交换虚拟服务器 (CS虚拟服务器) 的名称。

SIP 响应表达式

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