web-dev-qa-db-fra.com

Quel est le paramètre de limite dans une demande HTTP en plusieurs parties (POST)?

J'essaie de développer un gadget de barre latérale qui automatise le processus de vérification d'une page Web pour l'évolution de mon quota de transfert. J'y suis presque mais il y a une dernière étape dont j'ai besoin pour le faire fonctionner: envoyer une requête HttpRequest avec les bonnes données POST à une page php. En utilisant un plugin firefox, voici ce que le " Content-Type "de l'en-tête ressemble à:

Content-Type=multipart/form-data; boundary=---------------------------99614912995

avec le paramètre "limite" semblant être aléatoire, et le POSTDATA est le suivant:

POSTDATA =-----------------------------99614912995
Content-Disposition: form-data; name="SOMENAME"

Formulaire de Quota
-----------------------------99614912995
Content-Disposition: form-data; name="OTHERNAME"

SOMEDATA
-----------------------------99614912995--

Je ne comprends pas comment émuler correctement le POSTDATA avec le mystérieux paramètre "limite" qui revient.

Quelqu'un pourrait-il savoir comment résoudre ce problème?

60
m6a-uds

Le paramètre de limite est défini sur un certain nombre de tirets plus une chaîne aléatoire à la fin, mais vous pouvez le définir sur n'importe quoi. Le problème est que si la chaîne de limite apparaît dans les données de demande, elle sera traitée comme une limite.

Pour quelques conseils et un exemple de fonction d'envoi de données en plusieurs parties/formulaires, voir ma réponse à cette question . Il ne serait pas trop difficile de modifier cette fonction pour utiliser une boucle pour chaque partie que vous souhaitez envoyer.

40
Andy E

Pour citer le RFC 1341, section 7.2.1 , ce que je considère être les bits pertinents sur le paramètre boundary du Content-Type en-tête (pour MIME):

Tous les sous-types de "multipart" partagent une syntaxe commune ...

Le champ Content-Type pour les entités à plusieurs parties nécessite un paramètre, "limite", qui est utilisé pour spécifier la limite d'encapsulation. La limite d'encapsulation est définie comme une ligne composée entièrement de deux caractères de trait d'union ("-", code décimal 45) suivi de la valeur du paramètre de limite du champ d'en-tête Content-Type.

puis clarifie:

Ainsi, un champ d'en-tête Content-Type type en plusieurs parties peut ressembler à ceci:

 Content-Type: multipart/mixed; boundary=gc0p4Jq0M2Yt08jU534c0p

Cela indique que l'entité se compose de plusieurs parties, chacune d'elle-même avec une structure qui est syntaxiquement identique à un message RFC 822, sauf que la zone d'en-tête peut être complètement vide et que les parties sont chacune précédées de la ligne --gc0p4Jq0M2Yt08jU534c0p

À noter:

  1. La limite d'encapsulation doit se produire au début d'une ligne, c'est-à-dire à la suite d'un CRLF (retour chariot retour de ligne)
  2. La limite doit être suivie immédiatement soit par un autre CRLF et les champs d'en-tête pour la partie suivante, soit par deux CRLF, auquel cas il n'y a pas de champs d'en-tête pour la partie suivante (et il est donc supposé être de type Content-Type/plaine).
  3. Les limites d'encapsulation ne doivent pas apparaître dans les encapsulations et ne doivent pas dépasser 70 caractères, sans compter les deux traits d'union principaux.

Enfin et surtout:

La limite d'encapsulation suivant la dernière partie du corps est un délimiteur distinct qui indique qu'aucune autre partie du corps ne suivra. Un tel délimiteur est identique aux délimiteurs précédents, avec l'ajout de deux tirets supplémentaires à la fin de la ligne:

 --gc0p4Jq0M2Yt08jU534c0p-- 

J'espère que cela aidera quelqu'un d'autre à l'avenir, car j'ai dû errer pendant un certain temps avant d'obtenir l'image complète (veuillez vous assurer de lire les RFC nécessaires pour obtenir la compréhension la plus profonde).

77
nemesisfixx

La spécification réelle pour les données en plusieurs parties/formulaire se trouve dans RFC 7578 . La limite est définie dans Section 4.1 .

6
Julian Reschke