2015-05-17 7 views
0

Это относится к сообщению this. Я пытаюсь отправить некоторые данные формы с использованием TIdHTTP и TIdMultiPartFormDataStream, но при мониторинге связи с использованием Wireshark, каждое поле формы получает content-Type: text/plain прилагается к нему и по какой-то причине сервера, что я представляемая эти вещи, чтобы не нравится Это. Есть ли способ, которым я могу убедиться, что отправлено только имя и значение? был также добавлен Content-Transfer, и я был в состоянии удалить, что с помощью:, изгоняя «контент-тип» из TIdMultiPartFormDataStream

aFieldItem := PostStream.AddFormField(fName, fValue); 
aFieldItem.ContentTransfer := ''; 

, но я не могу найти способ, чтобы избавиться от типа контента. На данный момент данных, отправляемое lõoke как это (в Wireshark)

Boundary: \r\n----------051715151353026\r\n 
Encapsulated multipart part: (text/plain) 
    Content-Disposition: form-data; name="description"\r\n 
    Content-Type: text/plain\r\n 
    Line-based text data: text/plain 
     \r\n 
     Testing new AW Mobile 

и я хочу, чтобы это выглядело как:

Boundary: \r\n------WebKitFormBoundary32hCBG8zkGMBpxqL\r\n 
Encapsulated multipart part: 
    Content-Disposition: form-data; name="description"\r\n 
    Data (21 bytes) 
     Data: 0d0a5465737420616e6420747261636520636f6d6d 
     Length: 21 

Спасибо Сэм

ответ

3

HTML5 Section 4.10.22.7 изменяет хау RFC 2388 относится к обработке веб-форм:

. Части генерируемого ресурса multipart/form-data, соответствующие , нефайловые поля не должны содержать заголовок Content-Type. Их имена и значения должны быть закодированы с использованием кодировки символов, выбранной выше (имена полей, в частности, не преобразуются в 7-разрядную безопасную кодировку, как предложено в RFC 2388).

Это отличается от RFC 2388:

Как и со всеми многочастными типами MIME, каждая часть имеет дополнительный "Content-Type", который по умолчанию текста/равнине.

Ваш сервер явно ожидает поведения HTML5.

Content-Type заголовка на каждую части MIME добавлен в TIdMultipartFormDataStream жестко закодировано и не может быть удален без изменения TIdMultipartFormDataStream «ы исходного кода может быть опущен путем установки TIdFormDataField.ContentType свойства символа пробела (не пустая строки, как ContentTransfer свойство позволяет):

aFieldItem := PostStream.AddFormField(fName, fValue); 
aFieldItem.ContentTransfer := ''; 
aFieldItem.ContentType := ' '; // <-- here 

Если установить свойство ContentType в пустую строку, он установит заголовок Content-Type к application/octet-stream, но назначая пробел вместо этого имеет побочный эффект опуская заголовок, когда свойство setter анализирует новое значение.

Это, как говорится, я уже внес некоторые изменения в TIdMultipartFormDataStream, чтобы учесть это изменение в представлении webform в HTML5, но я еще не финализировал и не выпустил его.

+0

Спасибо. Любое предложение относительно того, как я могу справиться с этим в то же время? – Sam

+0

Как я уже сказал, вам придется изменить исходный код TIdMultipartFormDataStream, а затем перекомпилировать Indy. Кроме того, скопируйте исходный код в новый модуль/класс в своем проекте, который затем можно изменить по мере необходимости.Или просто напишите свои собственные данные MIME в стандартный TStream, такой как TMemoryStream. У меня нет ETA, когда новый TIdMultipartFormDataStream будет готов к выпуску. –

+0

Третий вариант (MIME-данные в стандартный TStream, такие как TMemoryStream) звучит лучше всего. У вас есть пример этого? Мне нужно опубликовать кучу пар имя-значение и файл и конец. Спасибо – Sam