首页 > 解决方案 > 我是否需要在 TidHttp 版本 10.5498 中显式折叠标题行?

问题描述

请有人(Remy Lebeau?)澄清TidHTTP中标题行折叠的观点吗?如果该行超过 998 个字符,我的服务器希望标题被折叠,我的一个肯定会这样做。

在讨论这个问题的许多其他帖子中,我看到了这篇文章,这是一篇或多或少确定的帖子,来自 Remy 所说的

默认情况下 TIdHeaderList.FoldLines 属性设置为 True

and

TIdHeaderList.FoldLength 属性的默认值为 78

这似乎表明在使用 TIdHTTP 时我不需要做任何特别的事情来折叠我的标题。

但是,查看 TidHTTP 的源代码时,我发现了 Remy 的评论,例如这些 (in TIdCustomHTTP.Post)

目前,在发出 POST 时,IdHTTP 会自动将协议设置为 1.0 版本,而与最初的值无关。

和(在TIdHTTPProtocol.BuildAndSendRequest

TODO:禁用 HTTP 1.0 请求的标头折叠

这似乎表明我的请求无论如何都将使用 HTTP 1.0 请求,无论我是否请求 1.1,并且无论如何都不会折叠标题行。

因此,我的问题很简单;使用 TidHttp 版本 10.5498 时我需要这些行吗

 IdHTTP1.Request.CustomHeaders.FoldLines := true;    
 IdHTTP1.Request.CustomHeaders.FoldLength := 998;  //could be less, but not more

还是我可以简单地接受默认值并确信我的标题将被正确折叠?

标签: httphttp-headersindy

解决方案


默认FoldLength值为 78 个字符,除非QuoteTypeis QuoteHTTP,否则默认值为MaxInt(即使FoldLines为 True,也有效禁用 HTTP 标头折叠)。因此,如果您希望将 HTTP 标头折叠为 998 个字符,则需要FoldLength手动设置。

请注意,虽然RFC 1945(用于 HTTP 1.0)和RFC 2616(用于 HTTP 1.1)确实允许折叠标头:

标题字段可以通过在每个额外行之前至少使用一个 SP 或 HT 来扩展多行,但不建议这样做。

<nbsp;>

通过在每个额外行之前至少使用一个 SP 或 HT,可以将标题字段扩展到多行。

RFC 7230(更新 HTTP 1.1)不赞成这种做法:

从历史上看,HTTP 标头字段值可以通过在每一额外行之前至少一个空格或水平制表符(obs-fold)来扩展多行。除了 message/http 媒体类型(第 8.3.1 节)之外,本规范不赞成这种行折叠。 发送者不得生成包含行折叠的消息(即,具有包含与 obs-fold 规则匹配的任何字段值),除非该消息旨在包装在 message/http 媒体类型中。

至于对请求TIdHTTP强制使用 HTTP 1.0 POST,您可以通过启用属性hoKeepOrigProtocol中的标志来防止这种情况。TIdHTTP.HTTPOptions


推荐阅读