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.REQ.HEADER( |
返回指定 SIP 标头的指定实例。可能会出现同一 SIP 标头的多个实例。如果您想要此类 SIP 标头的特定实例(例如,特定的 Via 标头),则可以通过键入数字作为指定该标头 |
SIP.REQ.HEADER( |
返回指定 SIP 标头的指定实例的内容。用法与上一个表达式几乎相同。例如,如果在前面的表条目中的 SIP 标头示例上使用,SIP.REQ.HEADER(“Via”).VALUE(1) 将返回 SIP/2.0/UDP 10.102.84.180:5060;branch=z9hG4bK03e76d0b;rport=5060。 |
SIP.REQ.HEADER( |
以整数形式返回特定标头的实例数。例如,如果在上述 SIP 标头示例中使用,则 SIP.REQ.HEADER(“Via”).COUNT 返回 2。 |
SIP.REQ.HEADER( |
返回一个布尔值为 true 或 false,具体取决于指定的标头是否存在。例如,如果在上述 SIP 标头示例中使用,则SIP.REQ.HEADER(“Expires”).EXISTS 返回 true,而 SIP.REQ.HEADER(“Caller-ID”).EXISTS 返回 false。 |
SIP.REQ.HEADER( |
返回指定标头中逗号分隔的参数列表。例如,如果在上述 SIP 标头示例中使用,SIP.REQ.HEADER(“Allow”).LIST 将返回 ACK,BYE,CANCEL,INVITE,NOTIFY,OPTIONS,REFER,REGISTER,UPDATE.。您可以追加字符串 .GET ( |
SIP.REQ.HEADER( |
类型 |
SIP.REQ.HEADER( |
如果指定的文本字符串存在于指定标头的任何实例中,则返回布尔值 true。在指定标头的所有实例上运行。头实例从上一个 (0) 到第一个匹配。 |
SIP.REQ.HEADER( |
如果任何与 |
SIP.REQ.HEADER( |
如果与 |
SIP.REQ.HEADER( |
返回匹配模式的索引, |
SIP.REQ.HEADER( |
返回匹配模式的索引, |
SIP.REQ.HEADER( |
如果指定字符串存在于指定标头的任何实例中,则此表达式将返回该字符串。例如,对于 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( |
如果指定的字符串存在于指定标头的任何实例中,则此表达式立即返回该字符串之后的字符串。例如,对于 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( |
如果指定的正则表达式 (正则表达式) 与指定标头的任何实例匹配,则返回布尔值 true。您必须以以下格式指定正则表达式:re |
SIP.REQ.HEADER( |
如果指定的正则表达式匹配指定标头的任何实例中的任何文本,则此表达式返回文本。例如,对于 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( |
如果指定的正则表达式匹配指定标头的任何实例中的任何文本,则此表达式立即返回该文本之后的字符串。例如,对于 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( |
如果指定的正则表达式匹配指定标头的任何实例中的任何文本,则此表达式将返回该文本之前的字符串。例如,对于 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 标头中的请求方法字符串中提取的响应程序法。 |