我是否需要在 TidHttp 版本 10.5498 中显式折叠 header 行?

Do I need to explicitly fold header lines in TidHttp ver 10.5498?

有人(Remy Lebeau?)可以澄清 TidHTTP 中 header 行折叠的要点吗? 如果该行超过 998 个字符,我的服务器期望 headers 被折叠,我的一个肯定会。

在讨论这个问题的许多其他 post 中,我看到 this one 这或多或少是确定性的 post 不久前 Remy 说

by default the TIdHeaderList.FoldLines property is set to True

and

the default value of the TIdHeaderList.FoldLength property is 78

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

但是,查看 TidHTTP 的源代码,我发现 Remy 的评论如下 (在 TIdCustomHTTP.Post

Currently when issuing a POST, IdHTTP will automatically set the protocol to version 1.0 independently of the value it had initially.

和 (在 TIdHTTPProtocol.BuildAndSendRequest

TODO: disable header folding for HTTP 1.0 requests

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

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

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

或者我可以简单地接受默认值并确信我的 header 将被正确折叠吗?

默认的FoldLength是78个字符除非QuoteTypeQuoteHTTP,那么默认的是MaxInt(有效地禁用 HTTP headers 的折叠,即使 FoldLines 为真)。因此,如果您希望 HTTP headers 折叠为 998 个字符,则需要手动设置 FoldLength

请注意,虽然 RFC 1945 (for HTTP 1.0) and RFC 2616(对于 HTTP 1.1)确实允许折叠 headers:

Header fields can be extended over multiple lines by preceding each extra line with at least one SP or HT, though this is not recommended.

Header fields can be extended over multiple lines by preceding each extra line with at least one SP or HT.

RFC 7230(更新 HTTP 1.1)反对这种做法:

Historically, HTTP header field values could be extended over multiple lines by preceding each extra line with at least one space or horizontal tab (obs-fold). This specification deprecates such line folding except within the message/http media type (Section 8.3.1). A sender MUST NOT generate a message that includes line folding (i.e., that has any field-value that contains a match to the obs-fold rule) unless the message is intended for packaging within the message/http media type.

至于 TIdHTTPPOST 请求强制使用 HTTP 1.0,您可以通过在 TIdHTTP.HTTPOptions 属性 中启用 hoKeepOrigProtocol 标志来防止这种情况发生。 =25=]