ADC

Comportement de l’en-tête en fonction de la longueur du contenu lors d’une action de réécriture en continu

L’en-tête Content-Length est l’un des moyens d’indiquer la longueur du message (en octets) dans une requête ou une réponse HTTP. Outre l’en-tête Content-Length, vous pouvez également spécifier la longueur du message en utilisant l’une des méthodes suivantes :

  • Codage fragmenté
  • Arrêt FIN

Dans un processus de streaming, NetScaler envoie des données en continu après le traitement de l’action de réécriture. Comme les données sont envoyées en continu et ne sont pas conservées par NetScaler, la longueur réelle du message qui serait envoyé au client est inconnue. Par conséquent, la valeur correcte de l’en-tête Content-Length ne peut pas être mentionnée dans la réponse.

Pour faciliter le processus de diffusion, la fonction de réécriture de NetScaler convertit la manière d’indiquer la longueur du message entre l’en-tête Content-Length et la fin FIN. Dans le cadre de la conversion, NetScaler corrompt l’en-tête Content-Length en réorganisant les quatre premiers caractères du nom de l’en-tête.

En HTTP, le client est censé ignorer les en-têtes qu’il ne comprend pas. Le client ne comprend donc pas le nom d’en-tête Content-Length corrompu et ignore donc l’en-tête. Pour améliorer les performances de NetScaler, l’en-tête est endommagé au lieu d’être supprimé. Corriger le nom de l’en-tête au lieu de le supprimer évite de recalculer la somme de contrôle car la somme de contrôle n’est pas modifiée si les mêmes octets se trouvent dans un ordre différent.

Par exemple, considérez la requête HTTP suivante :

GET / HTTP/1.1
Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, /
Accept-Language: en-GB
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; CMDTDF; MS-RTC LM 8)
Accept-Encoding: gzip, deflate
Host: test.example.net
Connection: Keep-Alive
<!--NeedCopy-->

Dans un scénario fonctionnel, la réponse entre NetScaler et le serveur principal pour cette requête HTTP est la suivante :

HTTP/1.1 200 OK
Content-Length: 10967
Connection: close
var SERVER_URL = 'https\x3a\x2f\x2ftest.example.net\x2f';
var WEB_SERVER_HOST = 'test.example.net';
<!--NeedCopy-->

Mais la réponse reçue par le client de NetScaler dans un scénario non fonctionnel est la suivante. L’en-tête Content-Length est renommé en ntcoent-Length.

HTTP/1.1 200 OK
ntCoent-Length: 10967
nnCoection: close
var SERVER_URL = 'https\x3a\x2f\x2ftest.example.net\x2f';
var WEB_SERVER_HOST = 'test.example.net';
<!--NeedCopy-->

En général, les applications clientes prennent en charge les trois méthodes de transaction : en-tête de longueur du contenu, codage par blocs et terminaison FIN. Ainsi, la conversion de l’en-tête Content-Length en Fin Termination ne doit pas poser de problème. Mais si l’application ne fonctionne pas à cause de cette modification, vous devez désactiver le processus de streaming.

Comment désactiver le processus de streaming dans une stratégie de réécriture

Vous pouvez désactiver le processus de diffusion dans une stratégie de réécriture de l’une des manières suivantes :

  1. Ajoutez une action non liée au streaming associée à une stratégie de réécriture associée à une priorité plus élevée. L’action doit être telle qu’elle ne modifie pas la réponse.

    Par exemple :

    add rewrite action non_stream_act replace_all HTTP.RES.BODY(1000000) HTTP.RES.FULL_HEADER -search text("pattern_which_will_not_match_in_body")

    La valeur du corps dans cette action de réécriture doit être supérieure à la valeur sur laquelle fonctionne l’action de diffusion en cours.

  2. Au lieu de la configuration de diffusion, utilisez la configuration non de diffusion.

    Remarque :

    Le passage d’un traitement en streaming à un traitement sans diffusion peut avoir un impact sur les performances de NetScaler.

    Par exemple, une configuration de diffusion peut être convertie en une configuration non de diffusion comme suit :

    Configuration du streaming :

    add rewrite action rw_act_1 replace_all HTTP.RES.BODY(1000) ""http"" -search text("http")
    
    add policy patset pat_list
    bind policy patset pat_list abcd
    bind policy patset pat_list defg
    
    add rewrite action rw_act_2 replace_all HTTP.RES.BODY(1000) ""replaced_data"" -search patset("pat_list")
    <!--NeedCopy-->
    

    Configuration sans diffusion en continu :

    add rewrite action rw_act_1 replace_all HTTP.RES.BODY(1000) ""http"" -search regex(re/http/)
    
    add rewrite action rw_act_1 replace_all HTTP.RES.BODY(1000) ""http"" -search regex(re/abcd|defg/)
    <!--NeedCopy-->
    
Comportement de l’en-tête en fonction de la longueur du contenu lors d’une action de réécriture en continu