Иногда, моя служба шлюза сбивается со следующей ошибкой: < /p>
Java.lang.illegalargumentException: неверный формат версии: bd
at io.netty.handler.codec.http.httpversion. (Htttpvers. /> Полный журнал трасса:
14:26:52.667 [Reactor-http-nio-1] Warn R.N.H.C.HttpclientConnect-[id: 0xdfa1348b, l: /10.175.2.2.22: 60106-r: /10.175.2.22: 13010]. /> java.lang.illegalargumentException: неверная формата версии: BD
14:26:52.668 [Reactor-http-nio-1] Ошибка O.S.B.A.W.R.E.AbstracterRebexceptionHandler-500 Серверная ошибка для HTTP GET "/BRAIN/API/getledgeretrive/getquequestion? />java.lang.IllegalArgumentException: invalid version format: BD
at io.netty.handler.codec.http.HttpVersion.(HttpVersion.java:120)
It appears that Netty is encountering an invalid HTTP version string (like HTTP/BD) in Линия запроса, которая заставляет шлюз добавлять исключение, прежде чем мои фильтры смогут обрабатывать запрос. Nginx/f5/slb) используется между клиентом и шлюзом.
Проблема заключается в том, чтобы Intermittent , поэтому трудно последовательно воспроизвести. Повторите и запасной логика: < /p>
@Override
public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();
String path = request.getURI().getPath();
// Allowlisted paths
if (path.contains("login") || path.contains("getToken")) {
return chain.filter(exchange);
}
// Token check
String token = request.getHeaders().getFirst("token");
if (StringUtils.isEmpty(token) || !RedisUtil.hasKey("login:ai:" + token)) {
Result result = Result.unLogin(iamProperties.getLoginUrl());
try {
byte[] data = objectMapper.writeValueAsBytes(result);
DataBuffer buffer = response.bufferFactory().wrap(data);
response.getHeaders().setContentType(MediaType.APPLICATION_JSON);
return response.writeWith(Mono.just(buffer))
.doFinally(signal -> DataBufferUtils.release(buffer));
} catch (JsonProcessingException e) {
logger.error("Serialization failed: {}", e.toString());
return response.setComplete();
}
}
return chain.filter(exchange)
.doOnError(e -> logger.error("Error occurred: {}", e.getMessage(), e))
.retryWhen(Retry.backoff(3, Duration.ofMillis(100))
.filter(err -> err instanceof IllegalArgumentException &&
err.getMessage().contains("invalid version format"))
.onRetryExhaustedThrow((spec, signal) ->
new RuntimeException("Invalid HTTP version format after retries")))
.onErrorResume(e -> handleInvalidVersionFormat(response, e));
}
private Mono handleInvalidVersionFormat(ServerHttpResponse response, Throwable e) {
if (e.getMessage().contains("Invalid HTTP version format")) {
Result result = Result.ok("Invalid HTTP version format after retries");
try {
byte[] data = objectMapper.writeValueAsBytes(result);
DataBuffer buffer = response.bufferFactory().wrap(data);
response.getHeaders().setContentType(MediaType.APPLICATION_JSON);
return response.writeWith(Mono.just(buffer))
.doFinally(signal -> DataBufferUtils.release(buffer));
} catch (JsonProcessingException ex) {
logger.error("Serialization failed: {}", ex.getMessage(), ex);
return response.setComplete();
}
}
return Mono.error(e);
}
However, the error happens before this filter is triggered, most likely during the Netty decoding phase.
###
- How can I intercept or prevent malformed requests from crashing Spring Cloud Gateway?
- Is there any way to validate or filter requests before Netty parses them?
- Would upgrading to Spring Boot 2.6+ or Spring Cloud Gateway 3.x solve this?
- Would putting Nginx in front of the gateway help block invalid HTTP/BD requests?
- Any known workaround in Spring Cloud Gateway to gracefully handle this Netty exception?
###
I’m not looking to return a 400 response — I want to **eliminate the root cause** of this Netty `IllegalArgumentException` caused by `invalid version format`.
Is there any reliable way to **protect Spring Cloud Gateway** (2.2.9) from such malformed requests — possibly by:
- filtering invalid requests at the **Netty level** before decoding happens?
- hardening the **load balancer (Nginx/F5)** to validate or reject malformed request lines?
- upgrading to newer **Spring Boot + Gateway** that offer better handling?
My ultimate goal: make sure this Netty exception **never happens**, rather than simply handling it after the fact.
Подробнее здесь: https://stackoverflow.com/questions/796 ... -bd-how-to