Evitar la recursión de llamada HTTP

Aunque el dispositivo Citrix ADC no comprueba la validez de la solicitud de llamada HTTP, analiza la solicitud una vez antes de enviar la solicitud al agente de llamada HTTP. Este análisis permite al dispositivo tratar la solicitud de llamada como cualquier otra solicitud entrante, lo que a su vez le permite configurar varias funciones útiles de Citrix ADC (como el almacenamiento en caché integrado) para trabajar en la solicitud de llamada. Sin embargo, durante este análisis, la solicitud de llamada HTTP puede golpear la misma directiva y, por lo tanto, invocarse recursivamente. El dispositivo detecta la invocación recursiva y genera una condición indefinida (UNDEF). Sin embargo, la invocación recursiva da como resultado que la directiva y los contadores de visitas de llamada HTTP se incrementen en dos recuentos cada uno en lugar de uno en cada uno.

Para evitar que una llamada se invoque a sí misma, debe identificar al menos una función única de la solicitud de llamada HTTP y, a continuación, excluir todas las solicitudes con esta función de ser procesadas por la regla de directiva que invoca la llamada. Para ello, incluya otra expresión de sintaxis predeterminada en la regla de directiva. La expresión debe preceder a la SYS.HTTP_CALLOUT(<name>) expresión para que se evalúe antes de que se evalúe la expresión de llamada. Por ejemplo:

<Expression that prevents callout recursion> && SYS.HTTP_CALLOUT(<name>)

Cuando configura una regla de directiva de esta manera, cuando el dispositivo genera la solicitud y la analiza, la regla compuesta se evalúa como FALSE, la llamada no se genera una segunda vez y los contadores de visitas se incrementan correctamente.

Una forma de asignar una función única a una solicitud de llamada HTTP es incluir un encabezado HTTP personalizado único al configurar la llamada. Lo que sigue es un ejemplo de una llamada HTTP llamada “myCallout.” La llamada genera una solicitud HTTP que comprueba si la dirección IP de un cliente está presente en una base de datos de direcciones IP en la lista negra. La llamada incluye un encabezado personalizado llamado “Solicitud”, que se establece en el valor “Solicitud de llamada.” Una directiva de respuesta enlazada globalmente, “Pol1”, invoca la llamada HTTP pero excluye todas las solicitudes cuyo encabezado de solicitud está establecido en este valor, evitando así una segunda invocación de myCallout. La expresión que impide una segunda invocación es HTTP.REQ.HEADER (“Solicitud”).EQ (“Solicitud de llamada”).NOT.

Ejemplo:

> add policy httpCallout myCallout
 Done

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

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

> bind responder global Pol1 100 END -type OVERRIDE
Done

Nota: También puede configurar una expresión para comprobar si la dirección URL de la solicitud incluye la expresión de dirección URL configurada para la llamada HTTP. Si quiere implementar este escenario, asegúrese de que el agente de llamada HTTP está dedicado a responder solo a las llamadas HTTP y no a otras solicitudes de cliente dirigidas a través del dispositivo. Si el agente de llamada HTTP es una aplicación o un servidor web que atiende a otras solicitudes de cliente, dicha expresión impedirá que el dispositivo procese esas solicitudes de cliente. En su lugar, utilice un encabezado personalizado único como se describió anteriormente.

Evitar la recursión de llamada HTTP