ADC

Expresiones de directiva avanzadas compuestas

Puede configurar una expresión de directiva avanzada con operadores booleanos o aritméticos y operaciones atómicas. La siguiente expresión compuesta tiene 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 tener cualquier número de operadores lógicos y aritméticos.

La siguiente expresión evalúa la duración de una solicitud HTTP. Esta expresión se basa en la URL y la cookie. Esta expresión evalúa el texto del encabezado. Además, hace 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 deben evaluarse como TRUE.

    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 se evalúa como TRUE, toda la expresión es TRUE.

  • !.

    P No es lógico en la expresión.

A veces, la utilidad de configuración Citrix ADC ofrece operadores AND, NOT y OR en el cuadro de diálogo Agregar expresión . Sin embargo, estas expresiones compuestas 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. 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. 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. 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. Ejemplo: http.req.hostname + 10.00.000.00
IP + str Concatena el valor de la dirección IP de la expresión de la izquierda del operador con un valor de cadena a la derecha. Ejemplo: client.ip.dst + http://req.url.hostname
str1 ALT str2 Utiliza cadena2 si la evaluación de cadena1 da como resultado una excepción undef o el resultado es una cadena nula. De lo contrario, usa cadena1 y nunca evalúa cadena2. 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 algún componente de la expresión perteneciente a OR se evalúa como TRUE, toda la expresión es TRUE. A continuación se muestra un ejemplo: http.req.url.contains (“.js”) || http.res.header. (“Tipo de contenido”). Contiene (“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 expresión izquierda del operador al valor de expresión derecho. Ejemplo: http://req.content_length + http://req.url.length      
num: Num Reste el valor de expresión derecha del operador del valor de expresión izquierda.      
num x num Multiplique el valor de expresión izquierda del operador por el valor de expresión derecho. Ejemplo: client.interface.rxthroughput * 9      
núm/núm Divida el valor de expresión izquierda del operador por el valor de expresión 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” equivalen 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). 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ú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). 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ú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). 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ú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). 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 izquierda bit a bit del valor numérico por el número de argumento de bits del lado derecho. El número de bits desplazados es el módulo entero 32. En el ejemplo siguiente se supone que numeric.expresión1 devuelve 12 (1100 binario) y numérica.expresión2 devuelve 3: numeric.expresión1 « numérica.expresión2 El resultado de aplicar el operador LSHIFT es 96 (un binario 1100000). 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. 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). 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.      
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.  
num! = num Determina si el valor de la expresión de la izquierda del operador no es igual al valor de la expresión de la derecha.  
num > num Determina si el valor de la expresión de la izquierda del operador es mayor que el valor de la expresión de la derecha.  
num < num Determina si el valor de la expresión de la izquierda del operador es inferior al valor de la expresión de la derecha.  
num >= num Determina 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.  
num <= num Determina si el valor de la expresión de la izquierda del operador es menor o igual que el valor de la expresión de 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. Además, puede crear expresiones compuestas que utilicen operadores aritméticos y operadores lógicos para evaluar o devolver los 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 realizar la operación en los operandos del mismo tipo. La operación promueve un tipo de prioridad inferior al operando con el tipo de prioridad más alta. 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 en expresiones simples. El tipo de datos identificado por el prefijo de expresión no coincide con el tipo de datos que se transfieren como argumento a la función. En la operación HTTP.REQ.CONTENT_LENGTH.DIV (3ul), el prefijo HTTP.REQ.CONTENT_LENGTH devuelve un entero que se convierte en un largo sin firmar. Long sin signo: el tipo de datos que se pasa como argumento a la función DIV (), se realiza una división larga sin firmar. 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 doble y realiza una división de doble precisión.

Para obtener información sobre las expresiones para convertir datos de un tipo en datos de otro tipo, consulte Datos de fundición por tipografía.

Expresiones de directiva avanzadas compuestas