Question

Je suis en train de charger test en utilisant une application Rails JMeter. Une partie essentielle de l'application implique une forme qui comprend les deux entrées de texte et le téléchargement de fichiers. Il fonctionne très bien dans un navigateur, mais lorsque je tente d'afficher cette page dans JMeter, Rails est de sauver toutes les parties du formulaire multipart sous forme de fichiers temporaires, ce qui provoque des choses à briser quand il est à la recherche d'une chaîne et obtient un tempfile à la place.

Il semble que la différence est que, à partir d'un navigateur, le morceau de la demande multipart qui contient une entrée de texte ressemble à ceci:

-----------------------------7d93b4186074c
Content-Disposition: form-data; name="field_name"

test
-----------------------------7d93b4186074c

alors de JMeter il ressemble à ceci:

-----------------------------7d159c1302d0y0
Content-Disposition: form-data; name="field_name"
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit

test
-----------------------------7d159c1302d0y0

Alors apparemment Rails voit l'ancien et il interprète comme une valeur de texte brut et traite comme une chaîne, mais voit ce dernier et les enregistre dans un fichier temporaire.

Je n'ai pas été en mesure de trouver un cadre pour convaincre JMeter de ne pas envoyer les en-têtes supplémentaires sous la forme multipart pour les champs non-fichier.

Y at-il un moyen de convaincre Rails d'ignorer les en-têtes et traiter le texte / texte brut sous forme de chaînes au lieu de fichiers texte? Ou un moyen rapide de mettre un filtre devant mon contrôleur qui dépouillera les en-têtes supplémentaires?

Sinon, est-il un meilleur outil pour charger test une application Rails qui comprend upload de fichiers?

Était-ce utile?

La solution 3

Il peut y avoir une meilleure façon, mais je fini par l'ajout d'un filtre rapide pour tourner le texte / tempfiles ordinaire dans des chaînes dans le hachage de paramètre:

  def change_text_files_to_strings
    params.each_pair do |key, value|
      params[key] = value.read if (value.class.to_s=='Tempfile' && value.content_type.start_with?('text/plain') )
    end
  end

Par ailleurs, il se avère que jmeter ici est correct et rails incorrect: selon RFC 2388, chaque élément dans une requête multipart doit avoir un type de contenu (non seulement des fichiers), donc Rails ne devrait vraiment pas utiliser la présence d'un en-tête de type de contenu pour déterminer si elle est un fichier. Eh bien.

Autres conseils

Transforme ces jours, vous pouvez simplement cocher « en-têtes compatibles utilisation du navigateur » dans JMeter. Aurait pu sauver moi-même un enfer de beaucoup de temps: -)

Alors, je l'ai personnalisé partie d'affichage de la demande de multipart JMeter dans le code source pour mettre la demande que des rails comprendre. Le changement est facile, comme indiqué ci-dessous, mais pour créer la compilation environnement Java / JMeter a pris du temps. : (

Quoi qu'il en soit, maintenant je peux télécharger un fichier avec succès par la poste via multipart JMeter.


dans src / protocole / http / org / apache / jmeter / protocole / http / échantillonneur / PostWriter.java

writeStartFileMultipart()
//writeln(out, "Content-Transfer-Encoding: binary"); // $NON-NLS-1$

writeFormMultipart()
/*****
writeln(out, "Content-Type: text/plain; charset=" + charSet); // $NON-NLS-1$
writeln(out, "Content-Transfer-Encoding: 8bit"); // $NON-NLS-1$
*****/

P.S.

Une pointe d'extrémité pour créer l'environnement de construction de 2,4 est

  1. pour commenter les bibliothèques 3ème partie dans le fichier vérifier build.xml.

  2. copie lib / Xstream-1.3.1.jar de l'archive binaire dans lib /

I également utilisé la solution ci-dessus comme ColdFusion envoyait des en-têtes similaires (moins le Content-Transfer-Encoding) avec chaque élément de données de formulaire. Je me demande s'il y a une meilleure façon.

EDIT: Quelqu'un sait si cela a été corrigé dans Rails 3

Quel genre d'erreur que vous obtenez? Quelque chose comme

NoMethodError (undefined method `rewind' for "1":String):

Il y a un problème avec rack qui pourrait expliquer votre problème. Voir https://github.com/rack/rack/issuesearch? état = ouvert & q = retour rapide # numéro / 116

Nous avons aussi avoir un problème similaire, en plus des réponses ci-dessus nous sont aussi en corrélation l'X-CSRF-Token de tête HTTP Manager dans cette demande et nous avons été en mesure de télécharger les médias requis autant que fois que nous voulions avec succès.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top