是否在HTTP链接头中包含逗号的URI?

时间:2018-04-24 10:46:37

标签: java http rfc5988

以下包含逗号的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

这是有效行为吗?

2 个答案:

答案 0 :(得分:0)

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

RFC 5988明确规定,如果关系类型包含逗号而不是URI,则必须引用它们。

我认为解释空间很小,而且恕我直言,HttpCore方面的实施不完整。

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

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

答案 1 :(得分:0)

逗号当然有效。

您缺少的是BasicHeaderValueParser 泛型。它只支持某些HTTP头字段,以及&#34; Link&#34;不是其中之一(请参阅https://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/message/HeaderValueParser.html中的语法说明。