调用 HTTP 标注

配置 HTTP 标注后,您可以通过在默认语法策略规则中包含 SYS.HTTP_CALLOUT(<name>) 表达式来调用标注。在此表达式中,<name> 是要调用的 HTTP 标注的名称。

您可以将默认语法表达式运算符与标注表达式一起使用来处理响应,然后执行适当的操作。来自 HTTP 标注代理的响应的返回类型决定了您可以在响应上使用的一组运算符。如果要分析的响应部分是文本,则可以使用文本运算符来分析响应。例如,您可以使用 INSTANTS (<string>) 运算符检查响应的指定部分是否包含特定字符串,如以下示例所示:

SYS.HTTP_CALLOUT(mycallout).contains("Good IP address")

如果您在响应程序策略中使用上述表达式,则可以配置适当的响应程序操作。

同样,如果要评估的响应部分是数字,则可以使用 GT (int) 等数字运算符。如果响应包含布尔值,则可以使用布尔运算符。

注意:HTTP 标注可以递归地调用自己。通过将 HTTP 标注表达式与防止递归的默认语法表达式相结合,可以避免 HTTP 标注递归。有关如何避免 HTTP 标注递归的信息,请参阅 避免 HTTP 标注递归

您还可以通过配置策略,每个策略在评估之前生成的标注后调用一个标注,来级联 HTTP 标注。在这种情况下,在一个策略调用标注后,当 Citrix ADC 设备在将标注发送到标注服务器之前解析标注时,第二组策略可以评估标注并调用其他标注,而这些标注又可以由第三组策略进行评估,依此类推。下面的示例介绍了这样的实现。

首先,您可以配置一个名为 MyCallout1 的 HTTP 标注,然后配置响应程序策略 Pol1 以调用 MyCallout1。然后,您可以配置第二个 HTTP 标注,MyCallout2 和响应程序策略 Pol2。您可以配置 Pol2 来评估我的标注 1 并调用我的标注输出 2。您可以在全局范围内绑定两个响应程序策略。

为了避免 HTTP 标注递归,MyCallout1 配置了一个名为“请求 1”的唯一自定义 HTTP 标头。“ Pol1 被配置为通过使用默认语法表达式避免 HTTP 标注递归

HTTP.REQ.HEADER("Request1").EQ("Callout Request").NOT.

Pol2 使用相同的默认语法表达式,但排除 .NOT 运算符,以便策略在 Citrix ADC 设备解析 MyCallout1 时对其进行评估。请注意,MyCallout2 标识了它自己的唯一标头,称为“Request2”,Pol2 包含一个默认语法表达式,以防止 MyCallout2 递归地调用自己。

示例

> add policy httpCallout myCallout1

Done

> set policy httpCallout myCallout1 -IPAddress 10.102.3.95 -port 80 -returnType TEXT -hostExpr
 ""10.102.3.95"" -urlStemExpr ""/cgi-bin/check_clnt_from_database.pl"" -headers Request1
("Callout Request") -parameters cip(CLIENT.IP.SRC) -resultExpr "HTTP.RES.BODY(100)"

Done

> add responder policy Pol1 "HTTP.REQ.HEADER("Request1").EQ("Callout Request").NOT &&
SYS.HTTP_CALLOUT(myCallout1).CONTAINS("IP Matched")" RESET

Done

> bind responder global Pol1 100 END -type OVERRIDE

Done

> add policy httpCallout myCallout2

Done

> set policy httpCallout myCallout2 -IPAddress 10.102.3.96 -port 80 -returnType TEXT -hostExpr
""10.102.3.96"" -urlStemExpr ""/cgi-bin/check_clnt_location_from_database.pl"" -headers Request2
("Callout Request") -parameters cip(CLIENT.IP.SRC) -resultExpr "HTTP.RES.BODY(200)"

 Done

> add responder policy Pol2 "HTTP.REQ.HEADER("Request2").EQ("Callout Request").NOT &&
 HTTP.REQ.HEADER("Request1").EQ("Callout Request") && SYS.HTTP_CALLOUT(myCallout2).CONTAINS
("APAC")" RESET

 Done

> bind responder global Pol2 110 END -type OVERRIDE

Done

调用 HTTP 标注