Especificar el juego de caracteres en expresiones

La infraestructura de directivas del dispositivo Citrix® Citrix ADC® admite los conjuntos de caracteres ASCII y UTF-8. El juego de caracteres predeterminado es ASCII. Si el tráfico para el que está configurando una expresión consta solo de caracteres ASCII, no es necesario especificar el juego de caracteres en la expresión. Sin embargo, debe especificar el juego de caracteres en cada expresión simple destinada al tráfico UTF-8. Para especificar el juego de caracteres UTF-8 en una expresión simple, debe incluir la <charset> función SET_CHAR_SET (), con <charset> especificada como UTF_8, como se muestra en los ejemplos siguientes:

HTTP.REQ.BODY(10).SET_CHAR_SET(UTF_8).CONTAINS("ß")

HTTP.RES.BODY(100).SET_CHAR_SET(UTF_8).BEFORE_STR("Bücher").AFTER_STR("Wörterbuch")

En una expresión, la función SET_CHAR_SET () debe introducirse en el punto de la expresión después del cual el procesamiento de datos debe llevarse a cabo en el juego de caracteres especificado. Por ejemplo, en la expresión HTTP.REQ.BODY (1000).AFTER_REGEX (re/siguiente ejemplo/).BEFORE_REGEX (RE/en el ejemplo anterior/).CONTAINS_ANY (“alfabeto griego”), si las cadenas almacenadas en el conjunto de patrones “Greek_Alphabet” están en UTF-8, debe incluir la función SET_CHAR_SET(UTF_8) inmediatamente antes de la función CONTAINS_ANY (“<string>”), de la siguiente manera:

HTTP.REQ.BODY(1000).AFTER_REGEX(re/following example/).BEFORE_REGEX(re/In the preceding example/).SET_CHAR_SET(UTF_8).CONTAINS_ANY("Greek_ alphabet")

La función SET_CHAR_SET() establece el juego de caracteres para todo el procesamiento posterior (es decir, para todas las funciones posteriores) de la expresión, a menos que sea reemplazado posteriormente en la expresión por otra función SET_CHAR_SET() que cambia el juego de caracteres. Por lo tanto, si todas las funciones de una expresión simple determinada están destinadas a UTF-8, puede incluir la función SET_CHAR_SET(UTF_8) inmediatamente después de las funciones que identifican texto (por ejemplo, las funciones HEADER(“<name>”) o BODY(<int>) functions). En el segundo ejemplo que sigue al primer párrafo anterior, si los argumentos ASCII pasados a las funciones AFTER_REGEX () y BEFORE_REGEX() se cambian a cadenas UTF-8, puede incluir la función SET_CHAR_SET(UTF_8) inmediatamente después de la función BODY (1000), de la siguiente manera:

HTTP.REQ.BODY(1000).SET_CHAR_SET(UTF_8).AFTER_REGEX(re/Bücher/).BEFORE_REGEX(re/Wörterbuch/).CONTAINS_ANY("Greek_alphabet")

El juego de caracteres UTF-8 es un superconjunto del juego de caracteres ASCII, por lo que las expresiones configuradas para el juego de caracteres ASCII continúan funcionando como se esperaba si cambia el conjunto de caracteres a UTF-8.

Expresiones compuestas con diferentes conjuntos de caracteres

En una expresión compuesta, si un subconjunto de expresiones está configurado para trabajar con datos en el conjunto de caracteres ASCII y el resto de las expresiones están configuradas para trabajar con datos en el conjunto de caracteres UTF-8, el conjunto de caracteres especificado para cada expresión individual se considera cuando se evalúan las expresiones individualmente. Sin embargo, al procesar la expresión compuesta, justo antes de procesar los operadores, el dispositivo promueve el conjunto de caracteres de los valores ASCII devueltos a UTF-8. Por ejemplo, en la siguiente expresión compuesta, la primera expresión simple evalúa los datos del juego de caracteres ASCII mientras que la segunda expresión simple evalúa los datos del juego de caracteres UTF-8:

HTTP.REQ.HEADER("MyHeader") == HTTP.REQ.BODY(10).SET_CHAR_SET(UTF_8)

Sin embargo, al procesar la expresión compuesta, justo antes de evaluar el operador booleano “es igual a”, el dispositivo Citrix ADC promueve el conjunto de caracteres del valor devuelto por HTTP.REQ.HEADER (“MyHeader”) a UTF-8.

La primera expresión simple del siguiente ejemplo evalúa los datos del juego de caracteres ASCII. Sin embargo, cuando el dispositivo Citrix ADC procesa la expresión compuesta, justo antes de concatenar los resultados de las dos expresiones simples, el dispositivo promueve el conjunto de caracteres del valor devuelto por HTTP.REQ.BODY(10) a UTF-8.

HTTP.REQ.BODY(10) + HTTP.REQ.HEADER("MyHeader").SET_CHAR_SET(UTF_8)

En consecuencia, la expresión compuesta devuelve datos en el juego de caracteres UTF-8.

Especificar el juego de caracteres basado en el juego de caracteres del tráfico

Puede establecer el conjunto de caracteres en UTF-8 sobre la base de las funciones del tráfico. Si no está seguro de si el juego de caracteres del tráfico que se está evaluando es UTF-8, puede configurar una expresión compuesta en la que la primera expresión compruebe el tráfico UTF-8 y las expresiones posteriores establezcan el conjunto de caracteres en UTF-8. A continuación se muestra un ejemplo de una expresión compuesta que primero comprueba el valor de “charset” en el encabezado Content-Type de la solicitud para “UTF-8” antes de comprobar si los primeros 1000 bytes en la solicitud contienen la cadena UTF-8 Bücher:

HTTP.REQ.HEADER("Content-Type").SET_TEXT_MODE(IGNORECASE).TYPECAST_NVLIST_T('=', '; ', '"').VALUE("charset").EQ("UTF-8") && HTTP.REQ.BODY(1000).SET_CHAR_SET(UTF_8).CONTAINS("Bücher")

Si está seguro de que el conjunto de caracteres del tráfico que se está evaluando es UTF-8, la segunda expresión del ejemplo es suficiente.

Literales de caracteres y cadenas en expresiones

Durante la evaluación de expresiones, incluso si el conjunto de caracteres actual es ASCII, los literales de caracteres y los literales de cadena, que están entre comillas simples (‘’) y comillas (“”), respectivamente, se consideran literales en el conjunto de caracteres UTF-8. En una expresión dada, si una función está operando en literales de caracteres o cadenas en el conjunto de caracteres ASCII e incluye un carácter no ASCII en el literal, se devuelve un error.

Nota:

Los literales de cadena en expresiones de directiva avanzadas son ahora tan largos como la expresión de directiva. Se permite que la expresión tenga 1499 u 8191 bytes de longitud.

Valores en formatos hexadecimales y octales

Al configurar una expresión, puede introducir valores en formatos octal y hexadecimal. Sin embargo, cada byte hexadecimal u octal se considera un byte UTF-8. Los bytes UTF-8 no válidos generan errores independientemente de si el valor se introduce manualmente o se pega desde el portapapeles. Por ejemplo, “xcex20” es un carácter UTF-8 no válido porque “c8” no puede ir seguido de “20” (cada byte en una cadena UTF-8 multibyte debe tener el bit alto establecido). Otro ejemplo de un carácter UTF-8 no válido es “xce xa9”, ya que los caracteres hexadecimales están separados por un carácter de espacio en blanco.

Funciones que devuelven cadenas UTF-8

Solo las <text> funciones.XPATH y <text>.XPATH_JSON siempre devuelven cadenas UTF-8. Las siguientes rutinas MYSQL determinan en tiempo de ejecución qué juego de caracteres devolver, dependiendo de los datos del protocolo:

  • MYSQL_CLIENT_T.USER
  • MYSQL_CLIENT_T.DATABASE
  • MYSQL_REQ_QUERY_T.COMMAND
  • MYSQL_REQ_QUERY_T.TEXT
  • MYSQL_REQ_QUERY_T.TEXT (<unsigned int>)
  • MYSQL_RES_ERROR_T.SQLSTATE
  • MYSQL_RES_ERROR_T.MESSAGE
  • MYSQL_RES_FIELD_T.CATALOG
  • MYSQL_RES_FIELD_T.DB
  • MYSQL_RES_FIELD_T.TABLE
  • MYSQL_RES_FIELD_T.ORIGINAL_TABLE
  • MYSQL_RES_FIELD_T.NAME
  • MYSQL_RES_FIELD_T.ORIGINAL_NAME
  • MYSQL_RES_OK_T.MESSAGE
  • MYSQL_RES_ROW_T.TEXT_ELEM (<unsigned int>)

Configuración de conexión de terminal para UTF-8

Al configurar una conexión con el dispositivo Citrix ADC mediante una conexión de terminal (por ejemplo, mediante PuTTY), debe establecer el juego de caracteres para la transmisión de datos en UTF-8.

## Funciones mínimas y máximas en una expresión de directiva avanzada

Las expresiones de directiva avanzadas admiten las siguientes funciones mínimas y máximas.

  1. (<expression1>.max(<expression2>) - devuelve el máximo de los dos valores.
  2. (<expression1>.min(<expression2>) - devuelve el mínimo de los dos valores.