Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

annonce du codage via POST multipart/from-data

15 réponses
Avatar
Paul Gaborit
Bonjour,

J'ai un problème de décodage des données soumises via des formulaires.

Plusieurs formulaires (sur des serveurs différents et utilisant des
codages différents) doivent soummettre de données à une même
application. Mon souci est de détecter dans cette application, le
codage des données soumises.

Pour l'illustrer, voici deux formulaires identiques sauf que l'un
soumet ses données codées en utf8 et l'autre en iso-8859-1 :

<form action="" method="post" enctype="multipart/form-data"
accept-charset="utf8">
<p>
Soummission en utf8&nbsp;:<br />
<textarea name="texte" rows="3" cols="50"></textarea>
<br />
<input type="submit" value="Envoyer" />
</p>
</form>

<form action="" method="post" enctype="multipart/form-data"
accept-charset="iso-8859-1">
<p>
Soummission en iso-8859-1&nbsp;:<br />
<textarea name="texte" rows="3" cols="50">Essai</textarea>
<br />
<input type="submit" value="Envoyer" />
</p>
</form>

Si je saisie le caractère "é" dans mon champ texte avec le premier
formulaire, voici un extrait de la requête HTTP qui est transmise (par
firefox) :

++++++++++++++++++++++++++++++++++++++++
Content-Length: 174
Content-Type: multipart/form-data; boundary=---------------------------74604530118940943891270616348
Keep-Alive: 300
Proxy-Connection: keep-alive

-----------------------------74604530118940943891270616348
Content-Disposition: form-data; name="texte"

é
-----------------------------74604530118940943891270616348--

++++++++++++++++++++++++++++++++++++++++

Si je saisie le même caractère "é" dans le champ texte mais cette fois
avec le second formulaire, voici un extrait de la requête HTTP qui est
transmise (par firefox) :

++++++++++++++++++++++++++++++++++++++++
Content-Length: 173
Content-Type: multipart/form-data; boundary=---------------------------12732967551707535069857896562
Keep-Alive: 300
Proxy-Connection: keep-alive

-----------------------------12732967551707535069857896562
Content-Disposition: form-data; name="texte"

é
-----------------------------12732967551707535069857896562--

++++++++++++++++++++++++++++++++++++++++

Les autres en-têtes des deux requêtes sont similaires. Firefox a bien
respecté le codage demandé (utf8 dans un cas et iso-8859-1 dans
l'autre) par chacun des deux formulaires.

Mais dans les requêtes rien n'indique le codage utilisé pour le
contenu du champ 'texte'. Donc, du côté du serveur qui ne peut pas
savoir quel formualire a été utilisé, on ne peut pas distinguer par
exemple l'envoi d'un "é" via le formulaire codé en utf8 de l'envoi de
"é" via le formulaire codé en iso-8859-1 !

De plus, MIME permet de spécifier le codage de chacun des différents
éléments d'un message multipart/form-data. Pourquoi Firefox ne
l'indique pas dans sa requête ?

Merci.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>

5 réponses

1 2
Avatar
Pierre Goiffon
Paul Gaborit wrote:
Ou n'utiliser des form multipart/form-data que pour envoyer des fichiers ?



En utilisant application/x-www-form-urlencoded ? C'est encore pire
puisqu'on ne peut utiliser que de l'ASCII !


(...)
Donc, a priori, dès qu'on envoie autre chose que de l'ASCII, on
devrait utiliser multipart/form-data....



Je pensais à un form en POST avec les données à saisir, et un form dédié
à l'envoi de fichier et uniquement à ça.
Mais j'ai le sentiment de manquer d'éléments solides, il faut que je me
replonge dans ce sujet et ce ne sera pas avant ce WE.
Avatar
Gerard Menvussa
Paul Gaborit wrote:
[...]
Les autres en-têtes des deux requêtes sont similaires. Firefox a bien
respecté le codage demandé (utf8 dans un cas et iso-8859-1 dans
l'autre) par chacun des deux formulaires.

Mais dans les requêtes rien n'indique le codage utilisé pour le
contenu du champ 'texte'. Donc, du côté du serveur qui ne peut pas
savoir quel formualire a été utilisé, on ne peut pas distinguer par
exemple l'envoi d'un "é" via le formulaire codé en utf8 de l'envoi de
"é" via le formulaire codé en iso-8859-1 !

De plus, MIME permet de spécifier le codage de chacun des différents
éléments d'un message multipart/form-data. Pourquoi Firefox ne
l'indique pas dans sa requête ?



Je crois que manifestement c'est un oublie des développeurs de Firefox.
Normalement d'après de RFC 2388 chapitre 4.5 : "Each part of a
multipart/form-data is supposed to have a content-type. In the case
where a field element is text, the charset parameter for the text
indicates the character encoding used."

C'est agaçant. Par curiosité j'aimerais savoir si les autres navigateurs
ajoutent cette donnée, vous avez essayé ?
Avatar
Paul Gaborit
À (at) Thu, 20 Dec 2007 16:27:23 +0100,
Gerard Menvussa écrivait (wrote):
Paul Gaborit wrote:
De plus, MIME permet de spécifier le codage de chacun des différents
éléments d'un message multipart/form-data. Pourquoi Firefox ne
l'indique pas dans sa requête ?



Je crois que manifestement c'est un oublie des développeurs de
Firefox. Normalement d'après de RFC 2388 chapitre 4.5 : "Each part of
a multipart/form-data is supposed to have a content-type. In the case
where a field element is text, the charset parameter for the text
indicates the character encoding used."



C'est du conditionnel (donc pas complètement obligatoire) mais je suis
d'accord pour dire que c'est un oubli.

C'est agaçant. Par curiosité j'aimerais savoir si les autres
navigateurs ajoutent cette donnée, vous avez essayé ?



Non, je n'ai pas encore essayé. Si j'ai le temps, je testerai IE (6 et
7 mais je n'ai pas beaucoup d'espoir pour aucun des deux) et peut-être
konqueror et safari...

Mais d'autres l'ont fait en 2006 et, à l'époque, *aucun* n'envoyait
cette information !

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Avatar
Jean-Marc Desperrier
Gerard Menvussa wrote:
Je crois que manifestement c'est un oublie des développeurs de Firefox.
Normalement d'après de RFC 2388 chapitre 4.5 : "Each part of a
multipart/form-data is supposed to have a content-type. In the case
where a field element is text, the charset parameter for the text
indicates the character encoding used."



C'est pris en compte dans le bug 116346.
https://bugzilla.mozilla.org/show_bug.cgi?id6346

Mais voici ce qui arrive quand on l'active :
"Cannot add attachment in yahoo mail"
https://bugzilla.mozilla.org/show_bug.cgi?id92982

"it almost looks like the server code blindly assumes that the
Content-Disposition header will always be the last (or only?) header and
that after it there will be two bytes to skip (the blank line CRLF) and
then you start reading data."

Pour l'instant, le correctif est désactivé en attendant de voir si le
nombre de serveurs qui se mettent à déconner quand on l'ajoute est
suffisament faible, et si il est possible de trouver un contournement
pour les plus importants.
Avatar
Paul Gaborit
À (at) Fri, 21 Dec 2007 19:17:30 +0100,
Jean-Marc Desperrier écrivait (wrote):
Gerard Menvussa wrote:
Je crois que manifestement c'est un oublie des développeurs de
Firefox. Normalement d'après de RFC 2388 chapitre 4.5 : "Each part
of a multipart/form-data is supposed to have a content-type. In the
case where a field element is text, the charset parameter for the
text indicates the character encoding used."



C'est pris en compte dans le bug 116346.
https://bugzilla.mozilla.org/show_bug.cgi?id6346



Une discussion très intéressante... et longue ! 6 ans !

Je vais essayer de modifier ma config de Firefox (en utilisant 'false'
pour browser.forms.submit.backwards_compatible)...

Mais voici ce qui arrive quand on l'active :
"Cannot add attachment in yahoo mail"
https://bugzilla.mozilla.org/show_bug.cgi?id92982

"it almost looks like the server code blindly assumes that the
Content-Disposition header will always be the last (or only?) header
and that after it there will be two bytes to skip (the blank line
CRLF) and then you start reading data."

Pour l'instant, le correctif est désactivé en attendant de voir si le
nombre de serveurs qui se mettent à déconner quand on l'ajoute est
suffisament faible, et si il est possible de trouver un contournement
pour les plus importants.



Parmi les commentaires, on trouve quelqu'un qui demande comment font
les autres navigateurs et comment font les serveurs pour décoder le
contenu des formulaires ? Mais il n'y a pas de réponse...

Je vais donc tester cela sur différents navigateurs et essayer
d'écrire un petit résumé qui pourra peut-être servir.

Merci pour le pointeur sur le bug. Je ne l'avais pas trouvé.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
1 2