从TIdMultiPartFormDataStream中去掉“content-type”

时间:2015-05-17 22:02:07

标签: delphi indy indy10 delphi-xe8

这与this帖子有关。我正在尝试使用TIdHTTPTIdMultiPartFormDataStream发布一些表单数据,但在使用 Wireshark 监控通信时,每个表单字段都会获得{{ 1}}附加到它,由于某种原因,我发送这些东西的服务器不喜欢它。有没有办法可以确保只发送名称和值? Content-Transfer也被添加,我可以使用以下内容删除它:

content-Type: text/plain

但我找不到任何摆脱内容类型的方法。 此时正在发送的数据如下所示(在Wireshark中)

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

我希望它看起来像:

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

谢谢 萨姆

1 个答案:

答案 0 :(得分:3)

HTML5 Section 4.10.22.7改变了RFC 2388如何应用于网络表单提交:

  

生成的multipart / form-data资源中与非文件字段对应的部分不得指定Content-Type标头。它们的名称和值必须使用上面选择的字符编码进行编码(特别是字段名称不会转换为RFC 2388中建议的7位安全编码)。

这与RFC 2388不同:

  

与所有多部分MIME类型一样,每个部分都有一个可选的" Content-Type",默认为text / plain。

您的服务器显然期待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进行了一些更改,以解释HTML5中网络表单提交的这一变化,但我还没有最终确定并发布它。