может ли Crypypy получать составные / смешанные POST из коробки? - PullRequest
5 голосов
/ 06 января 2009

Мы получаем некоторые данные POST для xml + произвольных двоичных файлов (например, изображений и аудио) с устройства, которое обеспечивает только многочастное / смешанное кодирование.

Я установил обработчик загрузки / отправки POST для нашего приемника. Мне удалось позволить ему сделать произвольное количество параметров, используя multipart / form-data. Однако когда мы пытаемся отправить смешанные данные, мы не получаем никакой обработки.

@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...

Итак, при отправке multipart / form-data, args и kwargs четко определены.
args - поля формы, kwargs = хэш переменных и значений. Когда я отправляю multipart / mixed, args и kwargs пусты, и я просто использую cherrypy.request.rfile в качестве необработанной информации POST.

У меня вопрос: есть ли у cherrypy встроенный обработчик для обработки многочастного / смешанного и чанкового кодирования для POST? Или мне нужно переопределить cherrypy.tools.process_request_body и свернуть мой собственный декодер?

Похоже, что встроенный сервер wsgi с cherrypy обрабатывает это как часть спецификации HTTP / 1.1, но я не могу найти документацию на cherrypy для доступа к этой функции.


... уточнить

Я использую последнюю версию 3.1.1 или около того Cherrypy.

Создание формы по умолчанию включает в себя создание параметров в функции загрузки.

Для multipart / form-data я звонил curl -F param1=@file1.jpg -F param2 = sometext -F param3=@file3.wav http://destination:port/upload

В этом примере я получаю:

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

При попытке отправить составное / смешанное, я пытался посмотреть на request.body, но продолжал получать None для этого, независимо от настройки обработки тела.

Вводимые данные поступают так:

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>

У меня есть подлое подозрение, что проблема multipart / mixed заключается в том, что cherrypy просто дает мне только rfile. Наша цель состоит в том, чтобы вишневое дерево обрабатывало тело на части с минимальной обработкой на приемной стороне (т. Е. Пусть вишневое дерево делает свое волшебство). Если для этого требуется, чтобы мы были более жесткими, чтобы формат отправки был типом контента, который нравится cherrypy, то пусть будет так. Какие форматы принимаются? Это только multipart / form-data?

1 Ответ

4 голосов
/ 08 января 2009

Мой плохой. Всякий раз, когда Content-Type имеет тип "multipart / *", CP пытается вставить содержимое в request.params (если есть какой-либо другой Content-Type, он входит в request.body).

К сожалению, CP предположил, что любое составное сообщение является данными формы, и не предусмотрел другие подтипы. Я только что исправил это в транке, и он должен быть выпущен в 3.1.2. Приносим извинения за неудобства. В краткосрочной перспективе вы можете попробовать применить набор изменений локально; см http://www.cherrypy.org/ticket/890.

...