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

L’infrastructure de stratégie de l’appliance Citrix® Citrix ADC® 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. Toutefois, vous devez spécifier le jeu de caractères dans chaque expression simple destinée au trafic UTF-8. Pour spécifier le jeu de caractères UTF-8 dans une expression simple, vous devez inclure la <charset> fonction SET_CHAR_SET (), avec <charset> spécifié comme UTF_8, comme illustré dans les exemples suivants :

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

Dans une expression, la fonction SET_CHAR_SET () doit être introduite au point de l’expression après quoi 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 motifs “Greek_Alphabet” sont en 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 tout traitement ultérieur (c’est-à-dire pour toutes les fonctions suivantes) dans l’expression, à moins qu’il ne soit remplacé plus tard 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 à UTF-8, vous pouvez inclure la fonction SET_CHAR_SET (UTF_8) immédiatement après les fonctions qui identifient le texte (par exemple, les <name> <int> fonctions HEADER ( » « ) ou BODY ()). 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 est un surensemble du jeu de caractères ASCII, de sorte que les expressions configurées pour le jeu de caractères ASCII continuent de fonctionner comme prévu si vous modifiez le jeu de caractères en 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 le reste des expressions est configuré 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 lors de l’évaluation des expressions individuellement. Toutefois, lors du traitement de l’expression composée, juste avant le traitement des opérateurs, l’appliance promeut le jeu de caractères des valeurs ASCII renvoyées en 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)

Cependant, lors du traitement de l’expression composée, juste avant d’évaluer l’opérateur booléen « est égal à », l’appliance Citrix ADC promeut 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 Citrix ADC traite l’expression composée, juste avant de concaténer les résultats des deux expressions simples, l’appliance promeut 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écifier 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 ne savez pas si 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 à 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 1000 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 sûr que le jeu de caractères du trafic évalué est UTF-8, la deuxième expression de l’exemple est suffisante.

Littéraires de caractères et de chaîne dans les expressions

Lors de l’évaluation de l’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 respectivement placés entre guillemets simples (‘’) et 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 littéraux de caractères ou de chaîne dans le 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 maintenant aussi longs que l’expression de stratégie. L’expression est autorisée à avoir une longueur de 1499 ou 8191 octets.

Valeurs en formats hexadécimaux et octaux

Lors de la configuration d’une expression, vous pouvez entrer des valeurs au format octal et hexadécimal. Cependant, chaque octet hexadécimal ou octal est considéré comme un octet UTF-8. Les octets UTF-8 non valides entraînent des erreurs, que la valeur soit saisie manuellement ou collée à partir du presse-papiers. Par exemple, « xcex20” 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 », puisque les caractères hexadécimaux sont séparés par un caractère d’espace blanc.

Fonctions qui retournent des chaînes UTF-8

Seules les <text> <text> fonctions .XPATH et .XPATH_JSON renvoient toujours des 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
  • 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>)

Paramètres de connexion du terminal pour UTF-8

Lorsque vous configurez une connexion à l’appliance Citrix ADC à l’aide d’une connexion de terminal (à l’aide de PuTY, 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.