Pourquoi IIS ne prend-il pas en charge l’encodage de transfert par blocs?

Je fais une connexion HTTP à un serveur Web IIS et envoie une requête POST avec les données encodées en utilisant Transfer-Encoding: chunked. Lorsque je fais cela, IIS ferme simplement la connexion, sans message d’erreur ni code d’état. Selon la spécification HTTP 1.1 ,

Toutes les applications HTTP / 1.1 DOIVENT être en mesure de recevoir et de décoder le codage de transfert “fragmenté”

donc je ne comprends pas pourquoi (a) il ne gère pas ce codage et (b) il ne renvoie pas un code de statut. Si je change la demande pour envoyer le contenu plutôt que le transfert-codage, la requête réussit, mais ce n’est pas toujours possible.

Quand j’essaie la même chose contre Apache, j’obtiens le statut “411 Length required” et un message disant “Chunked Transfer-Encoding interdit”.

Pourquoi ces serveurs ne prennent-ils pas en charge cet encodage?

D’après ce que je comprends, le codage par blocs ne peut être utilisé que dans une réponse HTTP. Un corps de requête fragmenté aurait la propriété d’être incompatible avec un serveur 1.0 et, dans tous les cas, un agent utilisateur n’aurait aucun moyen de savoir que le serveur était un serveur 1.0 tant qu’il n’avait pas déjà envoyé la demande.

Mais je suis d’accord que ce n’est pas clair de la documentation.

Jetez un oeil à votre client.

IIS et Apache prennent tous deux en charge les requêtes POST en utilisant l’encodage de transfert par blocs. Vous pouvez vérifier cela en utilisant l’ utilitaire curl :

curl  --form "upfile=@" --header "Transfer-Encoding: chunked" 

Vérifiez que le transfert est fragmenté à l’aide de Wireshark

Cela va dans les deux sens. essayez de télécharger une image 2MB ++ sur photobucket et de l’enregistrer. leur téléchargeur télécharge des blocs vers leurs serveurs Apache.

Ma seule supposition est qu’ils ne l’ont pas mis en œuvre pour des raisons de sécurité. Dans une solution naïve, il serait facile de configurer une attaque DOS en démarrant plusieurs transferts fragmentés qui ne se terminent jamais. Et une solution complexe qui pourrait expliquer l’attaque DOS ne vaut probablement pas la peine.

Bien sûr, je ne peux pas parler pour Apache ou IIS, mais vous pouvez contacter directement l’équipe Apache: http://httpd.apache.org/bug_report.html

Je suis d’accord avec MarkR que j’ai toujours pensé que le codage par blocs ne pouvait être utilisé que comme une réponse, mais la documentation donne l’impression qu’elle peut être utilisée dans une requête ou une réponse.

Cette commande est venue me sauver!

C: \ Windows \ System32 \ Inetsrv \ Appcmd.exe définir la section de configuration: httpCompression
– [name = ‘gzip’]. staticCompressionLevel: 9 – [name = ‘gzip’]. dynamicCompressionLevel: 4

sauvé ma journée … j’espère que ça aide quelqu’un comme moi!