может ли Crypypy получать составные / смешанные POST из коробки?
Вопрос
Мы получаем некоторые 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 аргументы и 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: // назначение: порт / загрузка
В этом примере я получаю:
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 просто дает мне только файл. Наша цель состоит в том, чтобы вишневое дерево обрабатывало тело на части с минимальной обработкой на приемной стороне (т. Е. Пусть вишневое дерево делает свое волшебство). Если для этого требуется, чтобы мы были более жесткими, чтобы формат отправки был типом контента, который нравится cherrypy, то пусть будет так. Какие форматы принимаются? Это только multipart / form-data?
Решение
Мой плохой. Если тип контента имеет тип «multipart / *», то СР пытается вставить содержимое в request.params (если есть какой-либо другой тип контента, он входит в request.body).
К сожалению, CP предположил, что любое составное сообщение является form-data, и не предусмотрел другие подтипы. Я только что исправил это в транке, и он должен быть выпущен в 3.1.2. Приносим извинения за неудобства. В краткосрочной перспективе вы можете попробовать применить набор изменений локально; см. http://www.cherrypy.org/ticket/890 .