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( |
返回指定的 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( |
如果指定的正则表达式 (regex) 与指定标头的任何实例相匹配,则返回布尔值 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 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 标头中的请求方法字符串中提取的响应方法。 |