Spring Integration 在 HTTP/2 的“优先级”HTTP 标头验证中失败

问题描述 投票:0回答:1

随着最近在 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 中:

https://github.com/spring-projects/spring-integration/blob/6.2.x/spring-integration-core/src/main/java/org/springframework/integration/IntegrationMessageHeaderAccessor.java

以下是进行验证的方法的摘录,其中优先级验证逻辑以粗体显示:

@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 库级别修复更合适,因为浏览器的更改已经是官方的了。

google-chrome http-headers spring-integration
1个回答
0
投票

Spring Integration 中的

priority
与该 HTTP 标头无关。 Spring Integration 中的优先级是关于内部消息处理或映射到目标消息系统的相应属性。

不幸的是,HTTP 标头的命名方式相同,但带有字符串值。

尚不清楚您如何接收 HTTP 请求,但我们绝对可以研究

DefaultHttpHeaderMapper
添加一些逻辑,将此 HTTP
Priority
标头映射到
http_priority
之类的内容并返回,以避免与消息传递
priority
标头发生冲突。

否则,您就必须自己手动进行映射(或过滤)。换句话说,消息传递

priority
标头不会被修复以满足这个新的 HTTP 功能,因为消息传递的优先级始终是数字。

© www.soinside.com 2019 - 2024. All rights reserved.