随着最近在 Chrome 上推出 Chromium 124,请求标头中引入了新的“优先级”HTTP 标头,默认情况下支持 HTTP/2 和 HTTP/3 协议。有关新标头的更多信息可以在以下链接中找到:
https://developer.chrome.com/release-notes/124#priority_http_request_header
然而,Spring Integration 库似乎没有跟上这一变化,仍然期望 NUMBER 格式的 Priority 标头,而实际标头值的格式为“u=5, i”。有关格式定义的更多信息,请参见此处:
https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-priority#name-the-priority-http-header-fi
此标头验证发生在 spring-integration-core 工件的 IntegrationMessageHeaderAccessor 中:
以下是进行验证的方法的摘录,其中优先级验证逻辑以粗体显示:
@Override
protected void verifyType(String headerName, Object headerValue) {
if (headerName != null && headerValue != null) {
super.verifyType(headerName, headerValue);
if (IntegrationMessageHeaderAccessor.EXPIRATION_DATE.equals(headerName)) {
Assert.isTrue(headerValue instanceof Date || headerValue instanceof Long,
TYPE_VERIFY_MESSAGE_FUNCTION.apply(headerName, "' header value must be a Date or Long."));
}
else if (IntegrationMessageHeaderAccessor.SEQUENCE_NUMBER.equals(headerName)
|| IntegrationMessageHeaderAccessor.SEQUENCE_SIZE.equals(headerName)
|| IntegrationMessageHeaderAccessor.PRIORITY.equals(headerName)) {
Assert.isTrue( Number.class.isAssignableFrom(headerValue.getClass()),
TYPE_VERIFY_MESSAGE_FUNCTION.apply(headerName, "' header value must be a Number."));
}
else if (IntegrationMessageHeaderAccessor.ROUTING_SLIP.equals(headerName)) {
Assert.isTrue( Map.class.isAssignableFrom(headerValue.getClass()),
TYPE_VERIFY_MESSAGE_FUNCTION.apply(headerName, "' header value must be a Map."));
}
else if (IntegrationMessageHeaderAccessor.DUPLICATE_MESSAGE.equals(headerName)) {
Assert.isTrue( Boolean.class.isAssignableFrom(headerValue.getClass()),
TYPE_VERIFY_MESSAGE_FUNCTION.apply(headerName, "' header value must be an Boolean."));
}
}
}
有人知道 Spring Integration 代码库与此更改有关的任何补丁吗?请指教。
谢谢!
作为当前的解决方法,我们拦截请求并在请求到达验证点之前过滤掉标头,从而解决了问题。但感觉这个问题应该在 Spring 库级别修复更合适,因为浏览器的更改已经是官方的了。
Spring Integration 中的
priority
与该 HTTP 标头无关。 Spring Integration 中的优先级是关于内部消息处理或映射到目标消息系统的相应属性。
不幸的是,HTTP 标头的命名方式相同,但带有字符串值。
尚不清楚您如何接收 HTTP 请求,但我们绝对可以研究
DefaultHttpHeaderMapper
添加一些逻辑,将此 HTTP Priority
标头映射到 http_priority
之类的内容并返回,以避免与消息传递 priority
标头发生冲突。
否则,您就必须自己手动进行映射(或过滤)。换句话说,消息传递
priority
标头不会被修复以满足这个新的 HTTP 功能,因为消息传递的优先级始终是数字。