Citrix ADC

Expresiones de directiva avanzadas compuestas

Puede configurar una expresión de directiva avanzada que contenga operadores booleanos o aritméticos y varias operaciones atómicas. La siguiente expresión compuesta contiene un AND booleano:

http.req.hostname.eq("mycompany.com") && http.req.method.eq(post)

La siguiente expresión agrega el valor de dos destinos y compara el resultado con un tercer valor:

http.req.url.length + http.req.cookie.length \<= 500

Una expresión compuesta puede contener cualquier número de operadores lógicos y aritméticos. La siguiente expresión evalúa la longitud de una solicitud HTTP sobre la base de su URL y cookie, evalúa el texto en el encabezado y realiza un AND booleano en estos dos resultados:

http.req.url.length + http.req.cookie.length \<= 500 && http.req.header.contains("some text")

Puede utilizar paréntesis para controlar el orden de evaluación en una expresión compuesta.

Booleanos en expresiones compuestas

Las expresiones compuestas se configuran con los siguientes operadores:

  • &&.

    Este operador es un AND lógico. Para que la expresión se evalúe como TRUE, todos los componentes unidos por Y deben evaluarse como TRUE. A continuación se muestra un ejemplo:

    http.req.url.hostname.eq (“MiHost”) && http.req.header (“MiHeader”).exists

  • ||.

    Este operador es un OR lógico. Si algún componente de la expresión que está unido por OR se evalúa como TRUE, la expresión completa es TRUE.

  • !.

    Realiza un NO lógico en la expresión.

En algunos casos, la utilidad de configuración de Citrix ADC ofrece operadores AND, NOT y OR en el cuadro de diálogo Agregar expresión. Sin embargo, estos son de uso limitado. Citrix recomienda utilizar los operadores &&, ||, y! para configurar expresiones compuestas que utilizan lógica booleana.

Paréntesis en expresiones compuestas

Puede utilizar paréntesis para controlar el orden de evaluación de una expresión. A continuación se muestra un ejemplo:

http.req.url.contains("myCompany.com") || (http.req.url.hostname.eq("myHost") && http.req.header("myHeader").exists)

El siguiente es otro ejemplo:

(http.req.header("Content-Type").exists && http.req.header("Content-Type").eq("text/html")) || (http.req.header("Transfer-Encoding").exists || http.req.header("Content-Length").exists)

Operaciones compuestas para cadenas

En la tabla siguiente se describen los operadores que se pueden utilizar para configurar operaciones compuestas en datos de cadena.

Operaciones que producen un valor de cadena Descripción
str + str Concatena el valor de la expresión a la izquierda del operador con el valor a la derecha. A continuación se presenta un ejemplo: Http.req.hostname + http.req.url.protocol
str + núm Concatena el valor de la expresión a la izquierda del operador con un valor numérico a la derecha. A continuación se presenta un ejemplo: Http.req.hostname + http.req.url.content_length
núm + str Concatena el valor numérico de la expresión en el lado izquierdo del operador con un valor de cadena a la derecha. A continuación se presenta un ejemplo: Http.req.url.content_length + http.req.url.hostname
str + ip Concatena el valor de cadena de la expresión en el lado izquierdo del operador con un valor de dirección IP a la derecha. Lo que sigue es un ejemplo: Http.req.hostname + 10.00.000.00
ip + str Concatena el valor de la dirección IP de la expresión a la izquierda del operador con un valor de cadena a la derecha.Following es un ejemplo: Client.ip.dst + http.req.url.hostname
str1 ALT str2 Utiliza el valor de cadena1 o cadena2 derivado de la expresión de cada lado del operador, siempre y cuando ninguna de estas expresiones sea una expresión compuesta. Lo que sigue es un ejemplo: Http.req.hostname alt client.ip.src
Operaciones en cadenas que producen un resultado de TRUE o FALSE Descripción
str == str Evalúa si las cadenas de ambos lados del operador son iguales. A continuación se presenta un ejemplo: Http.req.header (“myheader”) == http.res.header (“myheader”)
str <= str Evalúa si la cadena del lado izquierdo del operador es la misma que la cadena de la derecha o la precede alfabéticamente.
str >= str Evalúa si la cadena del lado izquierdo del operador es la misma que la cadena de la derecha, o la sigue alfabéticamente.
str < str Evalúa si la cadena del lado izquierdo del operador precede a la cadena de la derecha alfabéticamente.
str > str Evalúa si la cadena del lado izquierdo del operador sigue la cadena de la derecha alfabéticamente.
str!! = str Evalúa si las cadenas de ambos lados del operador son diferentes.
Operaciones lógicas en cadenas Descripción
bool & bool Este operador es un AND lógico. Al evaluar los componentes de la expresión compuesta, todos los componentes unidos por Y deben evaluarse como TRUE. A continuación se presenta un ejemplo: Http.req.method.eq (GET) && http.req.url.query.contains (“ViewReport && my_pagelabel”)
bool || bool Este operador es un OR lógico. Al evaluar los componentes de la expresión compuesta, si cualquier componente de la expresión que está unido por OR se evalúa como TRUE, la expresión completa es TRUE. Lo que sigue es un ejemplo: Http.req.url.contains (“.js”) || http.res.header. (“Content-Type”).contains (“javascript”)
Bool Realiza un NO lógico en la expresión.

Operaciones compuestas para números

Puede configurar expresiones numéricas compuestas. Por ejemplo, la siguiente expresión devuelve un valor numérico que es la suma de una longitud de encabezado HTTP y una longitud de URL:

http.req.header.length + http.req.url.length

En las tablas siguientes se describen los operadores que se pueden utilizar para configurar expresiones compuestas para datos numéricos.

Operaciones aritméticas en números Descripción
núm_+ núm Agregue el valor de la expresión a la izquierda del operador al valor de la expresión a la derecha. A continuación se presenta un ejemplo: Http.req.content_length + http.req.url.length
num: Num Resta el valor de la expresión a la derecha del operador del valor de la expresión a la izquierda.
núm_* núm Multiplique el valor de la expresión a la izquierda del operador con el valor de la expresión a la derecha. A continuación se presenta un ejemplo: Client.interface.rxthroughput * 9
núm/núm Divida el valor de la expresión a la izquierda del operador por el valor de la expresión a la derecha.
número% núm Calcule el módulo, o el resto numérico en una división del valor de la expresión a la izquierda del operador por el valor de la expresión a la derecha. Por ejemplo, los valores “15 mod 4” es igual a 3, y “12 mod 4” es igual a 0.
~número Devuelve un número después de aplicar una negación lógica bit a bit del número. En el ejemplo siguiente se supone que numeric.expression devuelve 12 (binario 1100): ~numeric.expression. El resultado de aplicar el operador ~ es -11 (un binario 1110011, 32 bits totales con todos a la izquierda). Tenga en cuenta que todos los valores devueltos de menos de 32 bits antes de aplicar el operador implícitamente tienen ceros a la izquierda para hacerlos de 32 bits de ancho.
número ^ número Compara dos patrones de bits de igual longitud y realiza una operación XOR en cada par de bits correspondientes en cada argumento numérico, devolviendo 1 si los bits son diferentes, y 0 si son iguales. Devuelve un número después de aplicar un XOR bit a bit al argumento entero y el valor numérico actual. Si los valores en la comparación bit a bit son los mismos, el valor devuelto es un 0. En el ejemplo siguiente se supone que numeric.expression1 devuelve 12 (binario 1100) y numeric.expression2 devuelve 10 (binario 1010): Numeric.expression1 ^ numeric.expresión2El resultado de aplicar el operador ^ a toda la expresión es 6 (binario 0110). Tenga en cuenta que todos los valores devueltos de menos de 32 bits antes de aplicar el operador implícitamente tienen ceros a la izquierda para hacerlos de 32 bits de ancho.
número | número Devuelve un número después de aplicar un OR bit a bit a los valores numéricos. Si cualquiera de los valores de la comparación bit a bit es un 1, el valor devuelto es un 1. En el ejemplo siguiente se supone que numeric.expression1 devuelve 12 (binario 1100) y numeric.expression2 devuelve 10 (binario 1010): Numeric.expression1 | numeric.expression2 El resultado de aplicar el operador | a toda la expresión es 14 (binario 1110). Tenga en cuenta que todos los valores devueltos de menos de 32 bits antes de aplicar el operador implícitamente tienen ceros a la izquierda para hacerlos de 32 bits de ancho.
número & número Compara dos patrones de bits de igual longitud y realiza una operación AND bit a bit en cada par de bits correspondientes, devolviendo 1 si ambos bits contienen un valor de 1, y 0 si cualquiera de los bits es 0. En el ejemplo siguiente se supone que numeric.expression1 devuelve 12 (binario 1100) y numeric.expression2 devuelve 10 (binario 1010): Numeric.expression1 & numeric.expression2 La expresión completa se evalúa como 8 (binario 1000). Tenga en cuenta que todos los valores devueltos de menos de 32 bits antes de aplicar el operador implícitamente tienen ceros a la izquierda para hacerlos de 32 bits de ancho.
núm « núm Devuelve un número después de un desplazamiento a la izquierda bit a bit del valor numérico por el número de argumento de bits del lado derecho. Tenga en cuenta que el número de bits desplazados es el módulo entero 32. En el ejemplo siguiente se supone que numeric.expression1 devuelve 12 (binario 1100) y numeric.expression2 devuelve 3: Numeric.expression1 « numeric.expression2 El resultado de aplicar el operador LSHIFT es 96 (un binario 1100000).Tenga en cuenta que todos los valores devueltos de menos de 32 bits antes de aplicar el operador implícitamente tienen ceros a la izquierda para hacerlos 32 bits de ancho.
núm » núm Devuelve un número después de un desplazamiento a la derecha a bit del valor numérico por el número de argumento entero de bits. Tenga en cuenta que el número de bits desplazados es el módulo entero 32. En el ejemplo siguiente se supone que numeric.expression1 devuelve 12 (binario 1100) y numeric.expression2 devuelve 3: Numeric.expression1 » numeric.expression2 El resultado de aplicar el operador RSHIFT es 1 (un binario 0001). Tenga en cuenta que todos los valores devueltos de menos de 32 bits antes de aplicar el operador implícitamente tienen ceros a la izquierda para hacerlos de 32 bits de ancho.
Operadores numéricos que producen un resultado de TRUE o FALSE Descripción
núm == núm Determine si el valor de la expresión a la izquierda del operador es igual al valor de la expresión a la derecha.
¡No! = núm Determine si el valor de la expresión de la izquierda del operador no es igual al valor de la expresión de la derecha.
núm > núm Determine si el valor de la expresión de la izquierda del operador es mayor que el valor de la expresión de la derecha.
núm < núm Determine si el valor de la expresión de la izquierda del operador es menor que el valor de la expresión de la derecha.
núm_>= núm Determine si el valor de la expresión de la izquierda del operador es mayor o igual que el valor de la expresión de la derecha.
núm <= núm Determine si el valor de la expresión a la izquierda del operador es menor o igual que el valor de la expresión a la derecha

Funciones para tipos de datos en la infraestructura de directivas

La infraestructura de directivas Citrix ADC admite los siguientes tipos de datos numéricos:

  • Entero (32 bits)
  • Largo sin firmar (64 bits)
  • Doble (64 bits)

Las expresiones simples pueden devolver todos estos tipos de datos. Por lo tanto, puede crear expresiones compuestas que utilicen operadores aritméticos y operadores lógicos para evaluar o devolver valores de estos tipos de datos. Además, puede utilizar todos estos valores en expresiones de directiva. Constantes literales de tipo unsigned long se pueden especificar agregando la cadena ul al número. Las constantes literales de tipo double contienen un punto (.), un exponente o ambos.

Operadores aritméticos, operadores lógicos y promoción de tipos

En expresiones compuestas, se pueden utilizar los siguientes operadores aritméticos y lógicos estándar para los tipos de datos largos dobles y sin signo:

  • +, -, * y/
  • %, ~, ^, &, |, «, y » (no se aplica al doble)
  • ==,! =, >, <, >= y <=

Todos estos operadores tienen el mismo significado que en el lenguaje de programación C.

En todos los casos de operaciones mixtas entre operandos de tipo entero, largo sin signo y doble, la promoción de tipo se realiza para que la operación se pueda realizar en operandos del mismo tipo. Un tipo de prioridad inferior se promueve automáticamente al tipo del operando con la prioridad más alta involucrada en la operación. El orden de precedencia (superior a inferior) es el siguiente:

  • Doble
  • Largo sin firmar
  • Número entero

Por lo tanto, una operación que devuelve un resultado numérico devuelve un resultado del tipo más alto involucrado en la operación.

Por ejemplo, si los operandos son de tipo integer y sin signo long, el operando entero se convierte automáticamente en tipo unsigned long. Esta conversión de tipo se realiza incluso en expresiones simples en las que el tipo de datos identificado por el prefijo de expresión no coincide con el tipo de datos que se pasa como argumento a la función. Para ilustrar este ejemplo, en la operación HTTP.REQ.CONTENT_LENGTH.DIV (3ul), el entero devuelto por el prefijo HTTP.REQ.CONTENT_LENGTH se convierte automáticamente a unsigned long (el tipo de datos pasados como argumento a la función DIV ()) y se realiza una división larga sin signo. Del mismo modo, el argumento se puede promover en una expresión. Por ejemplo, HTTP.REQ.HEADER (“MyHeader”).TYPECAST_DOUBLE_AT.DIV (5) promueve el entero 5 para escribir double y realiza división de doble precisión.

Para obtener información acerca de las expresiones para convertir datos de un tipo a datos de otro tipo, consulte Datos de conversión de tipos.

Expresiones de directiva avanzadas compuestas