Мы получаем некоторые данные 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?