ADC

Especifique el conjunto de caracteres en las expresiones

La infraestructura de directivas del dispositivo NetScaler admite los conjuntos de caracteres ASCII y UTF-8. El conjunto de caracteres predeterminado es ASCII. Si el tráfico para el que está configurando una expresión se compone únicamente de caracteres ASCII, no necesita especificar el conjunto de caracteres de la expresión. El dispositivo permite todos los literales de cadenas y caracteres que incluyan caracteres binarios. Sin embargo, los conjuntos de caracteres UTF-8 siguen requiriendo que la cadena y los literales de caracteres sean un UTF-8 válido.

CLIENT.TCP.PAYLOAD(100).CONTAINS("\xff\x02")

En una expresión, la función SET_CHAR_SET () debe introducirse en el punto de la expresión después del cual se debe procesar los datos en el conjunto de caracteres especificado. Por ejemplo: En la expresión HTTP.REQ.BODY(1000).AFTER_REGEX(re/ejemplo siguiente/).BEFORE_REGEX(re/En el ejemplo anterior/).CONTAINS_ANY(“Greek_ alphabet”), 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) justo antes de la función CONTAINS_ANY(“<string>”) de esta 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 conjunto de caracteres para todo el procesamiento posterior (es decir, para todas las funciones posteriores) de la expresión, a menos que otra función SET_CHAR_SET () lo anule más adelante en la expresión que cambie 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) justo después de las funciones que identifican texto (por ejemplo, las funciones HEADER(“<name>”) o BODY(<int>)). 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 conjunto de caracteres ASCII, por lo que las expresiones configuradas para el conjunto de caracteres ASCII seguirán funcionando como se esperaba si cambias el juego 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 funcionar con los datos del conjunto de caracteres ASCII y el resto de las expresiones están configuradas para funcionar con los datos del conjunto de caracteres UTF-8, el conjunto de caracteres especificado para cada expresión individual se tiene en cuenta al evaluar las expresiones de forma individual. 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 conjunto de caracteres ASCII, mientras que la segunda expresión simple evalúa los datos del conjunto 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 NetScaler 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 NetScaler 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)

Por lo tanto, la expresión compuesta devuelve datos en el conjunto de caracteres UTF-8.

Especifique el conjunto de caracteres en función del conjunto de caracteres del tráfico

Puede configurar el conjunto de caracteres en UTF-8 en función de las características del tráfico. Si no está seguro de si el conjunto 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 comprueba primero el valor de “conjunto de caracteres” en el encabezado Content-Type de la solicitud para “UTF-8” antes de comprobar si los primeros 1000 bytes de 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 aparecen entre comillas simples (“’) y entre comillas (“”), respectivamente, se consideran literales en el juego de caracteres UTF-8. En una expresión determinada, si una función funciona con literales de caracteres o cadenas del conjunto de caracteres ASCII e incluye un carácter que no es ASCII en el literal, se devuelve un error.

Nota:

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

Valores en formato hexadecimal y octal

Al configurar una expresión, puede introducir valores en formato octal y hexadecimal. Sin embargo, cada byte hexadecimal u octal se considera un byte UTF-8. Los bytes UTF-8 no válidos producen errores independientemente de si el valor se introduce manualmente o se pega desde el portapapeles. Por ejemplo, “\xce\x20” es un carácter UTF-8 no válido porque “c8” no puede ir seguido de “20” (cada byte de una cadena UTF-8 de varios bytes 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 espacio en blanco.

Funciones que devuelven cadenas UTF-8

Solo las <text>.XPATH_JSON funciones text>.XPATH y devuelven siempre cadenas UTF-8. Las siguientes rutinas de MYSQL determinan en tiempo de ejecución qué conjunto de caracteres se debe devolver, según 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
  • MSQL_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>)

Ajustes de conexión de terminales para UTF-8

Al configurar una conexión al dispositivo NetScaler mediante una conexión de terminal (mediante PuTTY, por ejemplo), debe configurar el conjunto de caracteres para la transmisión de datos a UTF-8.

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

Las expresiones de directiva avanzadas admiten las funciones mínima y máxima que se indican a continuación.

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