包含逗号的 URI 在 HTTP Link header 中有效吗?
Is a URI containing a comma valid in a HTTP Link header?
以下包含逗号的 HTTP Link header 有效吗?
Link: <http://www.example.com/foo,bar.html>; rel="canonical"
RFC5988 说:
Note that extension relation types are REQUIRED to be absolute URIs in
Link headers, and MUST be quoted if they contain a semicolon (";") or
comma (",") (as these characters are used as delimiters in the header
itself).
然而,这不包括#link-value。根据 RFC 3987,这必须是 URI-Reference,这似乎允许这样做。 link header 本身也可以有多个值,来自 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 中解析此 link header,使用以下代码:
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
这是有效的行为吗?
RFC 3986, section 3.3 clearly mentions, that a URI may contain sub-delimiters, which are defined in section 2.2 并且可以包含逗号 ,
.
RFC 5988 明确规定,如果 关系类型 包含逗号而不是 URI,则必须引用它们。
我认为解释的空间很小,恕我直言,HttpCore 方面的实现不完整。
BasicHeaderValueParser 使用 ',' 作为元素分隔符,忽略了这个字符是 header 字段的有效字符这一事实 - 这在大多数情况下可能没问题,尽管不是 100 % 合规。
但是您可以提供自己的自定义解析器作为第二个参数(而不是 null
)
逗号当然有效。
您缺少的是 BasicHeaderValueParser 不是 通用的。它仅支持某些 HTTP header 字段,而 "Link" 不是其中之一(请参阅 https://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/message/HeaderValueParser.html.
中的语法描述
以下包含逗号的 HTTP Link header 有效吗?
Link: <http://www.example.com/foo,bar.html>; rel="canonical"
RFC5988 说:
Note that extension relation types are REQUIRED to be absolute URIs in Link headers, and MUST be quoted if they contain a semicolon (";") or comma (",") (as these characters are used as delimiters in the header itself).
然而,这不包括#link-value。根据 RFC 3987,这必须是 URI-Reference,这似乎允许这样做。 link header 本身也可以有多个值,来自 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 中解析此 link header,使用以下代码:
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
这是有效的行为吗?
RFC 3986, section 3.3 clearly mentions, that a URI may contain sub-delimiters, which are defined in section 2.2 并且可以包含逗号 ,
.
RFC 5988 明确规定,如果 关系类型 包含逗号而不是 URI,则必须引用它们。
我认为解释的空间很小,恕我直言,HttpCore 方面的实现不完整。
BasicHeaderValueParser 使用 ',' 作为元素分隔符,忽略了这个字符是 header 字段的有效字符这一事实 - 这在大多数情况下可能没问题,尽管不是 100 % 合规。
但是您可以提供自己的自定义解析器作为第二个参数(而不是 null
)
逗号当然有效。
您缺少的是 BasicHeaderValueParser 不是 通用的。它仅支持某些 HTTP header 字段,而 "Link" 不是其中之一(请参阅 https://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/message/HeaderValueParser.html.
中的语法描述