2009-01-06 12 views
5

Nous recevons des données POST de fichiers binaires xml + arbitraires (comme des images et de l'audio) à partir d'un périphérique qui ne nous donne qu'un codage multipart/mixte.peut cherrypy recevoir des POST multipart/mixed out of the box?

J'ai configuré un gestionnaire cherrypy upload/POST pour notre récepteur. J'ai réussi à lui permettre de faire un nombre arbitraire de paramètres en utilisant multipart/form-data. Cependant, lorsque nous essayons d'envoyer les données mixtes, nous n'obtenons aucun traitement. Ainsi, lors de la soumission de données multipart/form, args et kwarg sont bien définis.
Les arguments sont les champs de formulaire, kwargs = hash de vars et les valeurs. Lorsque je soumets multipart/mixed, args et kwargs sont vides, et j'ai juste cherrypy.request.rfile comme information POST brute.

Ma question est, est-ce que cherrypy a un gestionnaire intégré pour gérer l'encodage multipart/mixed et chunked pour POST? Ou aurai-je besoin de surcharger le cherrypy.tools.process_request_body et de lancer mon propre décodeur?

Il semble que le serveur wsgi intégré avec cherrypy gère cela dans le cadre de la spécification HTTP/1.1, mais je n'ai pas pu trouver de documentation dans cherrypy pour accéder à cette fonctionnalité.


... à clarifient

J'utilise dernière version 3.1.1 ou ainsi de CherryPy.

La création d'un formulaire par défaut implique simplement de définir des paramètres dans la fonction de téléchargement.

Pour la multipart/form-data, j'ai appelé boucle -F [email protected] -F param2 = someText -F [email protected] http://destination:port/upload

Dans cet exemple, je reçois :

args = ['param1','param2','param3] 
kwargs = {'param1':CString<>, 'param2': 'sometext', 'param3':CString<>} 

Lorsque vous essayez de soumettre le multipart/mixed, j'essayé de regarder le request.body, mais continué à obtenir aucun pour cela, quel que soit le réglage de la transformation du corps.

Les commentaires que nous recevons vient en ce que:

user-agent:UNTRUSTED/1.0 Profile/MIDP-2.0 Configuration/CLDC-1.1 
content-language:en-US 
content-length:565719 
mime-version:1.0 
content-type:multipart/mixed; boundary='newdivider' 
host:192.168.1.1:8180 
transfer-encoding:chunked 



--newdivider 
Content-type: text/xml 

<?xml version='1.0' ?><data><Stuff>.... 
etc...etc... 

--newdivider 
Content-type: image/jpeg 
Content-ID: file://localhost/root1/photos/Garden.jpg 
Content-transfer-encoding: binary 

<binary data> 

J'ai un soupçon furtif que le multipart/mixed est le problème qui est cherrypy me donne juste le rfile. Notre objectif est de faire en sorte que Cherrypy traite le corps dans ses parties avec un traitement minimal du côté de la réception (c.-à-d., Laissez Cherrypy faire sa magie). Si cela nous oblige à être plus dur sur le format d'envoi pour être un type de contenu que Cherrypy aime, alors qu'il en soit ainsi. Quels sont les formats acceptés? Est-ce seulement multipart/form-data?

+0

quelle version de cherrypy, et pouvez-vous faire un exemple de formulaire HTML? – llimllib

+0

Au lieu de rfile, regardez cherrypy.request.body lorsque le Content-Type n'est pas form-data. – fumanchu

Répondre

5

Mon mauvais. Chaque fois que le Content-Type est de type "multipart/*", alors CP essaye de coller le contenu dans request.params (si n'importe quel autre Content-Type, il va dans request.body).

Malheureusement, le CP a supposé que tout message en plusieurs parties était form-data, et ne prévoyait pas d'autres sous-types. Je viens de corriger cela dans le coffre, et il devrait être publié en 3.1.2. Désolé pour le dérangement. À court terme, vous pouvez essayer d'appliquer le changeset localement; voir http://www.cherrypy.org/ticket/890.

+0

Hé, merci, ça a marché comme un charme. Peut tirer toutes les parties du cherrypy.request.params ['parties'] avec facilité maintenant. Merci! – dmyung

+0

Je cherche la même réponse, et j'ai trouvé ceci: http://svn.cherrypy.org/trunk/cherrypy/_cpreqbody.py. Il explique comment cherrypy gère les données de publication multi-parties avec des octets bruts, mais je n'ai pas encore compris comment résoudre le problème moi-même. –

+1

Alors, comment puis-je enregistrer cette substance entrante: [, ], sur le disque en tant que fichier local? –