SIP expressions
The Citrix ADC Advanced policy expressions language contains a number of expressions that operate on Session Initiation Protocol (SIP) connections. These expressions are intended to be used in policies for any supported protocol that operates on a request/response basis. These expressions can be used in content switching, rate limiting, responder, and rewrite policies.
Certain limitations apply to SIP expressions used with responder policies. Only the DROP, NOOP or RESPONDWITH actions are allowed on a SIP load balancing virtual server. Responder policies can be bound to a load balancing virtual server, an override global bind point, a default global bind point, or a sip_udp policy label.
The header format used by the SIP protocol is similar to that used by the HTTP protocol, so many of the new expressions look and function much like their HTTP analogs. Each SIP header consists of a line that includes the SIP method, the URL, and the version, followed by a series of name-value pairs that look like HTTP headers.
Following is a sample SIP header that is referred to in the expressions tables beneath it:
INVITE sip:16@www.sip.com:5060;transport=udp SIP/2.0 Record-Route: 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" ;tag=00127f54ec85a6d90cc14f45-53cc0185 To: "16" ;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: 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
SIP reference tables
The following tables contain lists of expressions that operate on SIP headers. The first table contains expressions that apply to request headers. Most response-based expressions are nearly the same as the corresponding request-based expressions. To create a response expression from the corresponding request expression, you change the first two sections of the expression from SIP.REQ to SIP.RES, and make other obvious adjustments. The second table contains those response expressions that are unique to responses and have no request equivalents. You can use any element in the following tables as a complete expression on its own, or you can use various operators to combine these expression elements with others to form more complex expressions.
SIP request expressions
Expression | Description |
---|---|
SIP.REQ.METHOD | Operates on the method of the SIP request. The supported SIP request methods are ACK, BYE, CANCEL, INFO, INVITE, MESSAGE, NOTIFY, OPTIONS, PRACK, PUBLISH, REFER, REGISTER, SUBSCRIBE, and UPDATE. This expression is a derivative of the text class, so all operations that are applicable to text are applicable to this method. For example, for a SIP request of INVITE sip:16@10.102.84.181:5060;transport=udp SIP/2.0, this expression returns INVITE. |
SIP.REQ.URL | 作用于SIP请求URL。这个表情我s a derivative of the text class, so all operations that are applicable to text are applicable to this method. For example, for a SIP request of INVITE sip:16@10.102.84.181:5060;transport=udp SIP/2.0, this expression returnssip:16@10.102.84.181:5060;transport=udp. |
SIP.REQ.URL.PROTOCOL | Returns the URL protocol. For example, for a SIP URL ofsip:16@www.sip.com:5060;transport=udp, this expression returns sip. |
SIP.REQ.URL.HOSTNAME | Returns the hostname portion of the SIP URL. For example, for a SIP URL ofsip:16@www.sip.com:5060;transport=udp, this expression returns www.sip.com:5060. |
SIP.REQ.URL.HOSTNAME.PORT | Returns the port portion of the SIP URL hostname. If no port is specified, this expression returns the default SIP port, 5060. For example, for a SIP hostname of www.sip.com:5060, this expression returns 5060. |
SIP.REQ.URL.HOSTNAME.DOMAIN | Returns the domain name portion of the SIP URL hostname. If the host is an IP address, then this expression returns an incorrect result. For example, for a SIP hostname of www.sip.com:5060, this expression returns sip.com. For a SIP hostname of 192.168.43.15:5060, this expression returns an error. |
SIP.REQ.URL.HOSTNAME.SERVER | Returns the server portion of the host. For example, for a SIP hostname of www.sip.com:5060, this expression returns www. |
SIP.REQ.URL.USERNAME | Returns the username that precedes the @ character. For example, for a SIP URL of sip:16@www.sip.com:5060;transport=udp, this expression returns 16. |
SIP.REQ.VERSION | Returns the SIP version number in the request. For example, for a SIP request of INVITE sip:16@10.102.84.181:5060;transport=udp SIP/2.0, this expression returns SIP/2.0. |
SIP.REQ.VERSION.MAJOR | Returns the major version number (the number to the left of the period). For example, for a SIP version number of SIP/2.0, this expression returns 2. |
SIP.REQ.VERSION.MINOR | 返回小版本号(th的数量e right of the period). For example, for a SIP version number of SIP/2.0, this expression returns 0. |
SIP.REQ.CONTENT_LENGTH | Returns the contents of the Content-Length header. This expression is a derivative of thesip_header_t class, so all operations that are available for SIP headers can be used. For example, for a SIP Content-Length header of Content-Length: 277, this expression returns 277. |
SIP.REQ.TO | Returns the contents of the To header. For example, for a SIP To header of To: “16” |
SIP.REQ.TO.ADDRESS | Returns the SIP URI, which is found in the sip_url object. All operations that are available for SIP URIs can be used. For example, for a SIP To header of To: “16” |
SIP.REQ.TO.DISPLAY_NAME | Returns the display name portion of the To header. For example, for a SIP To header of To: “16” |
SIP.REQ.TO.TAG | Returns the “tag” vale from the “tag” name value pair in the TO header. For example, for a SIP To header of To: “16” |
SIP.REQ.FROM | Returns the contents of the From header. For example, for a SIP From header of From: “12” |
SIP.REQ.FROM.ADDRESS | Returns the SIP URI, which is found in the sip_url object. All operations that are available for SIP URIs can be used. For example, for a SIP From header of From: “12” |
SIP.REQ.FROM.DISPLAY_NAME | Returns the display name portion of the To header. For example, for a SIP From header of From: “12” |
SIP.REQ.FROM.TAG | Returns the “tag” value from the “tag” name/value pair in the TO header. For example, for a SIP From header of From: “12” |
SIP.REQ.VIA | Returns the complete Via header. If there are multiple Via headers in the request, returns the last Via header. For example, for the two Via headers in the sample SIP header, this expression returns Via: SIP/2.0/UDP 10.102.84.180:5060;branch=z9hG4bK03e76d0b;rport=5060;received=10.102.84.160. |
SIP.REQ.VIA.SENTBY_ADDRESS | Returns the address that sent the request. For example, for the Via header Via: SIP/2.0/UDP 10.102.84.180:5060;branch=z9hG4bK03e76d0b;rport=5060;received=10.102.84.160, this expression returns 10.102.84.180. |
SIP.REQ.VIA.SENTBY_PORT | Returns the port that sent the request. For example, for the Via header Via: SIP/2.0/UDP 10.102.84.180:5060;branch=z9hG4bK03e76d0b;rport=5060;received=10.102.84.160, this expression returns 5060. |
SIP.REQ.VIA.RPORT | Returns the value from the rport name/value pair. For example, for the Via header Via: SIP/2.0/UDP 10.102.84.180:5060;branch=z9hG4bK03e76d0b;rport=5060;received=10.102.84.160, this expression returns 5060. |
SIP.REQ.VIA.BRANCH | Returns the value from the branch name/value pair. For example, for the Via header Via: SIP/2.0/UDP 10.102.84.180:5060;branch=z9hG4bK03e76d0b;rport=5060;received=10.102.84.160, this expression returns z9hG4bK03e76d0b. |
SIP.REQ.VIA.RECEIVED | Returns the value from the received name/value pair. For example, for the Via header Via: SIP/2.0/UDP 10.102.84.180:5060;branch=z9hG4bK03e76d0b;rport=5060;received=10.102.84.160, this expression returns 10.102.84.160. |
SIP.REQ.CALLID | Returns the contents of the Callid header. This expression is a derivative of the sip_header_t class, so all operations that are available for SIP headers can be used. For example, for a SIP Callid header ofCall-ID: 00127f54-ec850017-0e46f5b9-5ec149c2@10.102.84.180, this expression returns00127f54-ec850017-0e46f5b9-5ec149c2@10.102.84.180. |
SIP.REQ.CSEQ | Returns the CSEQ number from the CSEQ, as an integer. For example, for a SIP CSEQ header of CSeq: 101 INVITE, this expression returns 101. |
SIP.REQ.HEADER( |
Returns the specified SIP header. For |
SIP.REQ.HEADER( |
Returns the specified instance of the specified SIP header. Multiple instances of the same SIP header can occur. Where you want a specific instance of such a SIP header (for example, a specific Via header), you can specify that header by typing a number as the |
SIP.REQ.HEADER( |
Returns the contents of the specified instance of the specified SIP header. The usage is nearly the same as the previous expression. For example, if used on the SIP header example in the preceding table entry, SIP.REQ.HEADER(“Via”).VALUE(1) returns SIP/2.0/UDP 10.102.84.180:5060;branch=z9hG4bK03e76d0b;rport=5060. |
SIP.REQ.HEADER( |
Returns the number of instances of a particular header as an integer. For example, if used on the SIP header example above, SIP.REQ.HEADER(“Via”).COUNT returns 2. |
SIP.REQ.HEADER( |
Returns a boolean value of true or false, depending upon whether the specified header exists or not. For example, if used on the SIP header example above, SIP.REQ.HEADER(“Expires”).EXISTSreturns true, while SIP.REQ.HEADER(“Caller-ID”).EXISTS returns false. |
SIP.REQ.HEADER( |
Returns the comma-separated parameter list in the specified header. For example, if used on the SIP header example above, SIP.REQ.HEADER(“Allow”).LIST returns ACK,BYE,CANCEL,INVITE,NOTIFY,OPTIONS,REFER,REGISTER,UPDATE. You can append the string .GET( |
SIP.REQ.HEADER( |
Typecasts |
SIP.REQ.HEADER( |
Returns boolean true if the specified text string is present in any instance of the specified header. Operates on all the instances of the specified header. Header instances are matched from last (0) to first. |
SIP.REQ.HEADER( |
Returns boolean true if any pattern associated with |
SIP.REQ.HEADER( |
Returns Boolean true if any pattern associated with |
SIP.REQ.HEADER( |
Returns the index of the matching pattern associated with |
SIP.REQ.HEADER( |
Returns the index of the matching pattern associated with |
SIP.REQ.HEADER( |
如果指定的字符串存在于任何实例of the specified header, this expression returns that string. For example, for the SIP header 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”) returns “rport=5060”.SIP.REQ.HEADER(“Via”).SUBSTR(“rport=5061”) returns an empty string. |
SIP.REQ.HEADER( |
如果指定的字符串存在于任何实例of the specified header, this expression returns the string immediately after that string. For example, for the SIP header Via: SIP/2.0/UDP 10.102.84.180:5060;branch=z9hG4bK03e76d0b;rport=5060;received=10.102.84.160, the expression SIP.REQ.HEADER(“Via”).AFTER_STR(“rport=”) returns 5060. |
SIP.REQ.HEADER( |
Returns boolean true if the specified regular expression (regex) matches any instance of the specified header. You must specify the regular expression in the following format: re |
SIP.REQ.HEADER( |
If the specified regex matches any text in any instance of the specified header, this expression returns the text. For example, for the SIP header Via: SIP/2.0/UDP 10.102.84.180:5060;branch=z9hG4bK03e76d0b;rport=5060;received=10.102.84.160, the expression SIP.REQ.HEADER(“Via”).REGEX_SELECT(“received=[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}”) returns received=10.102.84.160. |
SIP.REQ.HEADER( |
If the specified regex matches any text in any instance of the specified header, this expression returns the string immediately after that text. For example, for the SIP header Via: SIP/2.0/UDP 10.102.84.180:5060;branch=z9hG4bK03e76d0b;rport=5060;received=10.102.84.160, the expression SIP.REQ.HEADER(“Via”).AFTER_REGEX(“received=”) returns10.102.84.160. |
SIP.REQ.HEADER( |
If the specified regex matches any text in any instance of the specified header, this expression returns the string immediately before that text. For example, for the SIP header Via: SIP/2.0/UDP 10.102.84.180:5060;branch=z9hG4bK03e76d0b;rport=5060;received=10.102.84.160, the expression SIP.REQ.HEADER(“Via”).BEFORE_REGEX(“[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}”) returns received=. |
SIP.REQ.FULL_HEADER | Returns the entire SIP header, including the terminating CR/LF. |
SIP.REQ.IS_VALID | Returns boolean true if the request format is valid. |
SIP.REQ.BODY( |
Returns the request body, up to the specified length. If the specified length is greater than the length of the request body, this expression returns the entire request body. |
SIP.REQ.LB_VSERVER | Returns the name of the load balancing virtual server (LB vserver) that is serving the current request. |
SIP.REQ.CS_VSERVER | Returns the name of the content switching virtual server (CS vserver) that is serving the current request. |
SIP response expressions
Expression | Description |
---|---|
SIP.RES.STATUS | Returns the SIP response status code. For example, if the first line of the response is SIP/2.0 100 Trying, this expression returns 100. |
SIP.RES.STATUS_MSG | Returns the SIP response status message. For example, if the first line of the response is SIP/2.0 100 Trying, this expression returns Trying. |
SIP.RES.IS_REDIRECT | Returns boolean true if the response code is a redirect. |
SIP.RES.METHOD | Returns the response method extracted from the request method string in the CSeq header. |