может ли Crypypy получать составные / смешанные POST из коробки?

StackOverflow https://stackoverflow.com/questions/415019

  •  03-07-2019
  •  | 
  •  

Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top