代码之家  ›  专栏  ›  技术社区  ›  CodeBuddy

包含逗号的URI在HTTP链接头中有效吗?

  •  1
  • CodeBuddy  · 技术社区  · 6 年前

    以下包含逗号的HTTP链接头是否有效?

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

    RFC5988 表示:

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

    但是,这不包括#链接值。根据RFC,必须是URI引用 3987 这似乎是允许的。链接标头本身也可以有多个值,从 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 
    

    我正在用Java解析这个链接头 BasicHeaderValueParser 来自Apache HttpCore 4.4.9,使用以下代码:

    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 回复  |  直到 3 年前
        1
  •  1
  •   Julian Reschke    6 年前

    逗号当然有效。

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

        2
  •  1
  •   Community CDub    3 年前

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

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

    我认为解释的空间很小,而且它在HttpCore方面的实现是不完整的。

    这个 BasicHeaderValueParser 使用“,”作为元素分隔符,忽略了此字符是标头字段的有效字符这一事实-这可能在大多数情况下都是可以的,但不是100%兼容的。

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