Créer et analyser multipart des requêtes HTTP en Python

Je suis en train d'écrire du code python qui peut créer multipart mime requêtes http dans le client, puis de façon appropriée interpréter ensuite sur le serveur. J'ai, je pense, partiellement réussi sur le client:

from email.mime.multipart import MIMEMultipart, MIMEBase
import httplib
h1 = httplib.HTTPConnection('localhost:8080')
msg = MIMEMultipart()
fp = open('myfile.zip', 'rb')
base = MIMEBase("application", "octet-stream")
base.set_payload(fp.read())
msg.attach(base)
h1.request("POST", "http://localhost:8080/server", msg.as_string())

Le seul problème avec ceci est que l'e-mail de la bibliothèque comprend également le Type de Contenu et le MIME-Version les en-têtes, et je ne suis pas sûr de savoir comment ils vont être liées à des en-têtes HTTP inclus par httplib:

Content-Type: multipart/mixed; boundary="===============2050792481=="
MIME-Version: 1.0

--===============2050792481==
Content-Type: application/octet-stream
MIME-Version: 1.0

Cela peut être la raison que, lorsque cette demande est reçue par mon web.py l'application, je viens d'obtenir un message d'erreur. L'web.py POSTE de gestionnaire:

class MultipartServer:
    def POST(self, collection):
        print web.input()

Met cette erreur:

Traceback (most recent call last):
  File "/usr/local/lib/python2.6/dist-packages/web.py-0.34-py2.6.egg/web/application.py", line 242, in process
    return self.handle()
  File "/usr/local/lib/python2.6/dist-packages/web.py-0.34-py2.6.egg/web/application.py", line 233, in handle
    return self._delegate(fn, self.fvars, args)
  File "/usr/local/lib/python2.6/dist-packages/web.py-0.34-py2.6.egg/web/application.py", line 415, in _delegate
    return handle_class(cls)
  File "/usr/local/lib/python2.6/dist-packages/web.py-0.34-py2.6.egg/web/application.py", line 390, in handle_class
    return tocall(*args)
  File "/home/richard/Development/server/webservice.py", line 31, in POST
    print web.input()
  File "/usr/local/lib/python2.6/dist-packages/web.py-0.34-py2.6.egg/web/webapi.py", line 279, in input
    return storify(out, *requireds, **defaults)
  File "/usr/local/lib/python2.6/dist-packages/web.py-0.34-py2.6.egg/web/utils.py", line 150, in storify
    value = getvalue(value)
  File "/usr/local/lib/python2.6/dist-packages/web.py-0.34-py2.6.egg/web/utils.py", line 139, in getvalue
    return unicodify(x)
  File "/usr/local/lib/python2.6/dist-packages/web.py-0.34-py2.6.egg/web/utils.py", line 130, in unicodify
    if _unicode and isinstance(s, str): return safeunicode(s)
  File "/usr/local/lib/python2.6/dist-packages/web.py-0.34-py2.6.egg/web/utils.py", line 326, in safeunicode
    return obj.decode(encoding)
  File "/usr/lib/python2.6/encodings/utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode bytes in position 137-138: invalid data

Ma ligne de code est représenté par la ligne d'erreur à mi-chemin vers le bas:

  File "/home/richard/Development/server/webservice.py", line 31, in POST
    print web.input()

C'est en cours, mais je ne sais pas où aller à partir d'ici. Est-ce un problème avec mon code client, ou une limitation de web.py (peut-être qu'il ne peut tout simplement pas soutenir multipart demandes)? Tous conseils ou des suggestions de code alternatif bibliothèques seront reçues avec reconnaissance.

MODIFIER

L'erreur ci-dessus a été causé par les données n'étant pas automatiquement encodées en base64. L'ajout de

encoders.encode_base64(base)

De se débarrasser de cette erreur, et maintenant, le problème est clair. Requête HTTP n'est pas interprété correctement dans le serveur, sans doute parce que l'e-mail de la bibliothèque est notamment ce que devraient être les en-têtes HTTP dans le corps au lieu:

<Storage {'Content-Type: multipart/mixed': u'', 
          ' boundary': u'"===============1342637378=="\n'
          'MIME-Version: 1.0\n\n--===============1342637378==\n'
          'Content-Type: application/octet-stream\n'
          'MIME-Version: 1.0\n' 
          'Content-Transfer-Encoding: base64\n'
          '\n0fINCs PBk1jAAAAAAAAA.... etc

Si quelque chose n'est pas là.

Grâce

Richard

ce que le diable est un multipart requête http? Cette notion est-elle réellement utilisée?
oui. oui, il est.

OriginalL'auteur Richard J | 2010-12-13