【问题标题】:Is a URI containing a comma valid in a HTTP Link header?包含逗号的 URI 在 HTTP 链接标头中是否有效?
【发布时间】:2018-04-24 10:46:36
【问题描述】:

以下包含逗号的 HTTP Link 标头是否有效?

Link: <http://www.example.com/foo,bar.html>; rel="canonical"

RFC5988 说:

请注意,扩展关系类型必须是绝对 URI 链接头,如果它们包含分号 (";") 或 逗号 (",")(因为这些字符在标题中用作分隔符 本身)。

然而,这不包括#link-value。这必须是根据 RFC 3987 的 URI-Reference,这似乎允许这样做。链接头本身也可以有多个值,来自RFC5988 5.5 节:

Link: </TheBook/chapter2>;
      rel="previous"; title*=UTF-8'de'letztes%20Kapitel,
      </TheBook/chapter4>;
      rel="next"; title*=UTF-8'de'n%c3%a4chstes%20Kapitel 

我正在使用 Apache HttpCore 4.4.9 中的 BasicHeaderValueParser 使用以下代码在 Java 中解析此链接标头:

final String linkHeader = "<http://www.example.com/foo,bar.html>; rel=\"canonical\"";
final HeaderElement[] parsedHeaders = BasicHeaderValueParser.parseElements(linkHeader, null);
        
for (HeaderElement headerElement : parsedHeaders)
{
    System.out.println(headerElement);
}

在逗号上标记并打印以下内容:

<http://www.example.com/foo
bar.html>; rel=canonical

这是有效的行为吗?

【问题讨论】:

  • BWTW,RFC 5988 已被 RFC 8288 淘汰。

标签: java http rfc5988


【解决方案1】:

逗号当然是有效的。

您缺少的是 BasicHeaderValueParser 是 not 通用的。它只支持某些 HTTP 标头字段,“Link”不是其中之一(请参阅https://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/message/HeaderValueParser.html 中的语法描述。

【讨论】:

    【解决方案2】:

    RFC 3986, section 3.3 明确提到,URI 可能包含子分隔符,这些子分隔符在section 2.2 中定义,并且可能包含逗号,

    RFC 5988 明确指出,关系类型如果包含逗号而不是 URI,则必须用引号引起来。

    我认为解释的余地​​很小,恕我直言,这是 HttpCore 方面的不完整实现。

    BasicHeaderValueParser 使用 ',' 作为元素分隔符,忽略了该字符是标题字段的有效字符这一事实 - 这在大多数情况下可能是可以的,尽管不是 100% 兼容。

    但是,您可以提供自己的自定义解析器作为第二个参数(而不是 null

    【讨论】:

      猜你喜欢
      • 2018-10-06
      • 1970-01-01
      • 2012-12-08
      • 2011-08-05
      • 1970-01-01
      • 2015-09-23
      • 2018-06-20
      • 2011-12-13
      • 2011-11-16
      相关资源
      最近更新 更多