Domanda

Stiamo ricevendo alcuni dati POST di xml + file binari arbitrari (come immagini e audio) da un dispositivo che ci fornisce solo codifiche multipart / miste.

Ho impostato un gestore di upload / POST cherrypy per il nostro ricevitore. Sono riuscito a consentirgli di eseguire un numero arbitrario di parametri utilizzando multipart / form-data. Tuttavia, quando proviamo a inviare i dati misti in più parti, non riceviamo alcuna elaborazione.

@cherrypy.expose
def upload(self, *args,**kwargs):
    """upload adapted from cherrypy tutorials

    We use our variation of cgi.FieldStorage to parse the MIME
    encoded HTML form data containing the file."""

    print args   
    print kwargs

    cherrypy.response.timeout = 1300

    lcHDRS = {}
    for key, val in cherrypy.request.headers.iteritems():
        lcHDRS[key.lower()] = val
    incomingBytes = int(lcHDRS['content-length'])

    print cherrypy.request.rfile 

    #etc..etc...

Quindi, quando si inviano dati multipart / form, args e kwargs sono ben definiti.
args sono i campi del modulo, kwargs = hash di var e valori. Quando invio multipart / mixed, args e kwargs sono vuoti e ho solo cherrypy.request.rfile come informazioni POST non elaborate.

La mia domanda è: cherrypy ha un gestore integrato per gestire la codifica multipart / mixed e chunked per POST? O dovrò sovrascrivere cherrypy.tools.process_request_body e girare il mio decodificatore?

Sembra che il server wsgi integrato con cherrypy gestisca questo come parte delle specifiche HTTP / 1.1, ma non riesco a trovare documentazione in cherrypy per accedere a questa funzionalità.


... per chiarire

Sto usando l'ultima versione 3.1.1 o giù di lì di Cherrypy.

La creazione di un modulo predefinito implica solo la creazione di parametri nella funzione di caricamento.

Per i dati multipart / form, ho chiamato curl -F param1=@file1.jpg -F param2 = sometext -F param3=@file3.wav http: // destinazione: porta / upload

In questo esempio, ottengo:

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

Quando ho provato a inviare il multipart / misto, ho provato a guardare il request.body, ma ho continuato a ottenere None per quello, indipendentemente dall'impostazione dell'elaborazione del corpo.

L'input che stiamo ricevendo sta arrivando come questo:

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>

Ho il sospetto furbo che il multipart / misto sia il problema che la cherrypy mi sta dando solo il file. Il nostro obiettivo è far sì che la cherrypy elabori il corpo nelle sue parti con un'elaborazione minima sul lato di ricezione (ovvero, lascia che cherrypy faccia la sua magia). Se questo ci richiede di essere più severi sul formato di invio per essere un tipo di contenuto che piace a Cherrypy, allora così sia. Quali sono i formati accettati? Sono solo dati multipart / form?

È stato utile?

Soluzione

Mio male. Ogni volta che il tipo di contenuto è di tipo "multipart / *", allora CP tenta di inserire il contenuto in request.params (se qualsiasi altro tipo di contenuto, va in request.body).

Sfortunatamente, CP ha ipotizzato che qualsiasi messaggio multipart sia form-data e non ha previsto altri sottotipi. Ho appena risolto questo problema nel bagagliaio e dovrebbe essere rilasciato in 3.1.2. Ci dispiace per l'inconvenienza. A breve termine, puoi provare ad applicare il changeset localmente; vedi http://www.cherrypy.org/ticket/890 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top