ADC

Spécifier le jeu de caractères dans les expressions

L’infrastructure de stratégies de l’appliance prend en charge les jeux de caractères ASCII et UTF-8. Le jeu de caractères par défaut est ASCII. Si le trafic pour lequel vous configurez une expression se compose uniquement de caractères ASCII, vous n’avez pas besoin de spécifier le jeu de caractères dans l’expression. L’appliance autorise toutes les chaînes et tous les caractères littéraux, y compris les caractères binaires. Cependant, les jeux de caractères UTF-8 nécessitent toujours que la chaîne et les littéraux de caractères soient un UTF-8 valide.

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

Dans une expression, la fonction SET_CHAR_SET() doit être introduite au point de l’expression après lequel le traitement des données doit être effectué dans le jeu de caractères spécifié. Par exemple, dans l’expression HTTP.REQ.BODY(1000).AFTER_REGEX(re/following example/).BEFORE_REGEX(re/In the preceding example/).CONTAINS_ANY(“Greek_ alphabet”), si les chaînes stockées dans le jeu de modèles “Greek_alphabet” sont au format UTF-8, vous devez inclure la fonction SET_CHAR_SET(UTF_8) immédiatement avant la fonction CONTAINS_ANY(“<string>”), comme suit :

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 fonction SET_CHAR_SET() définit le jeu de caractères pour tous les traitements ultérieurs (c’est-à-dire pour toutes les fonctions suivantes) dans l’expression, à moins qu’il ne soit remplacé ultérieurement dans l’expression par une autre fonction SET_CHAR_SET() qui modifie le jeu de caractères. Par conséquent, si toutes les fonctions d’une expression simple donnée sont destinées à l’UTF-8, vous pouvez inclure la fonction SET_CHAR_SET(UTF_8) immédiatement après les fonctions qui identifient du texte (par exemple, les fonctions HEADER(“<name>”) ou BODY(<int>)). Dans le deuxième exemple qui suit le premier paragraphe ci-dessus, si les arguments ASCII transmis aux fonctions AFTER_REGEX () et BEFORE_REGEX () sont remplacés par des chaînes UTF-8, vous pouvez inclure la fonction SET_CHAR_SET(UTF_8) immédiatement après la fonction BODY (1000), comme suit :

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

Le jeu de caractères UTF-8 étant un sur-ensemble du jeu de caractères ASCII, les expressions configurées pour le jeu de caractères ASCII continuent de fonctionner comme prévu si vous remplacez le jeu de caractères par UTF-8.

Expressions composées avec différents jeux de caractères

Dans une expression composée, si un sous-ensemble d’expressions est configuré pour fonctionner avec des données du jeu de caractères ASCII et que les autres expressions sont configurées pour fonctionner avec des données du jeu de caractères UTF-8, le jeu de caractères spécifié pour chaque expression individuelle est pris en compte lorsque les expressions sont évaluées individuellement. Toutefois, lors du traitement de l’expression composée, juste avant de traiter les opérateurs, l’appliance fait passer le jeu de caractères des valeurs ASCII renvoyées au format UTF-8. Par exemple, dans l’expression composée suivante, la première expression simple évalue les données du jeu de caractères ASCII tandis que la seconde expression simple évalue les données du jeu de caractères UTF-8 :

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

Toutefois, lors du traitement de l’expression composée, juste avant d’évaluer l’opérateur booléen « est égal à », l’appliance NetScaler transforme le jeu de caractères de la valeur renvoyée par HTTP.REQ.HEADER (« MyHeader ») en UTF-8.

La première expression simple de l’exemple suivant évalue les données du jeu de caractères ASCII. Toutefois, lorsque l’appliance NetScaler traite l’expression composée, juste avant de concaténer les résultats des deux expressions simples, elle transforme le jeu de caractères de la valeur renvoyée par HTTP.REQ.BODY (10) en UTF-8.

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

Par conséquent, l’expression composée renvoie des données dans le jeu de caractères UTF-8.

Spécifiez le jeu de caractères en fonction du jeu de caractères du trafic

Vous pouvez définir le jeu de caractères sur UTF-8 en fonction des caractéristiques du trafic. Si vous n’êtes pas sûr que le jeu de caractères du trafic évalué est UTF-8, vous pouvez configurer une expression composée dans laquelle la première expression vérifie le trafic UTF-8 et les expressions suivantes définissent le jeu de caractères en UTF-8. Voici un exemple d’expression composée qui vérifie d’abord la valeur de « charset » dans l’en-tête Content-Type de la requête pour « UTF-8 » avant de vérifier si les 1 000 premiers octets de la requête contiennent la chaîne 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 vous êtes certain que le jeu de caractères du trafic évalué est UTF-8, la deuxième expression de l’exemple est suffisante.

Littéraux de caractères et de chaînes dans les expressions

Lors de l’évaluation d’une expression, même si le jeu de caractères actuel est ASCII, les littéraux de caractères et les littéraux de chaîne, qui sont placés respectivement entre guillemets simples (« ») et entre guillemets (« »), sont considérés comme des littéraux dans le jeu de caractères UTF-8. Dans une expression donnée, si une fonction fonctionne sur des caractères ou des chaînes littéraux du jeu de caractères ASCII et que vous incluez un caractère non ASCII dans le littéral, une erreur est renvoyée.

Remarque :

Les littéraux de chaîne dans les expressions de stratégie avancées sont désormais aussi longs que l’expression de stratégie. La longueur de l’expression est autorisée à 1499 octets ou 8191 octets.

Valeurs aux formats hexadécimal et octal

Lorsque vous configurez une expression, vous pouvez entrer des valeurs aux formats octal et hexadécimal. Toutefois, chaque octet hexadécimal ou octal est considéré comme un octet UTF-8. Les octets UTF-8 non valides génèrent des erreurs, que la valeur soit saisie manuellement ou collée depuis le presse-papiers. Par exemple, “\xce\x20” est un caractère UTF-8 non valide car “c8” ne peut pas être suivi de “20” (chaque octet d’une chaîne UTF-8 multi-octets doit avoir le bit élevé). Un autre exemple de caractère UTF-8 non valide est « \ xce \ xa9 », car les caractères hexadécimaux sont séparés par un espace blanc.

Fonctions renvoyant des chaînes UTF-8

Seules les fonctions text>.XPATH et <text>.XPATH_JSON et renvoient toujours les chaînes UTF-8. Les routines MYSQL suivantes déterminent au moment de l’exécution le jeu de caractères à renvoyer, en fonction des données du protocole :

  • 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>)

Paramètres de connexion du terminal pour UTF-8

Lorsque vous établissez une connexion à l’appliance NetScaler à l’aide d’une connexion terminal (à l’aide de PuTTY, par exemple), vous devez définir le jeu de caractères pour la transmission des données en UTF-8.

Fonctions minimales et maximales dans une expression de stratégie avancée

Les expressions de stratégie avancées prennent en charge les fonctions minimales et maximales ci-dessous.

  1. (<expression1>.max(<expression2>) - renvoie le maximum des deux valeurs.
  2. (<expression1>.min(<expression2>) - renvoie le minimum des deux valeurs.