diff --git a/sf-vertx/src/main/java/com/sf/vertx/handle/AppConfigHandle.java b/sf-vertx/src/main/java/com/sf/vertx/handle/AppConfigHandle.java index 9416f81..64b1f51 100644 --- a/sf-vertx/src/main/java/com/sf/vertx/handle/AppConfigHandle.java +++ b/sf-vertx/src/main/java/com/sf/vertx/handle/AppConfigHandle.java @@ -31,6 +31,7 @@ import io.vertx.circuitbreaker.CircuitBreaker; import io.vertx.circuitbreaker.CircuitBreakerOptions; import io.vertx.core.Vertx; import io.vertx.core.VertxOptions; +import io.vertx.core.http.HttpHeaders; import lombok.extern.slf4j.Slf4j; /*** @@ -93,6 +94,17 @@ public class AppConfigHandle { return APICODE_CONFIG_CIRCUIT_BREAKER_MAP.get(key); } + /*** + * 是否解析, 走独立请求 + * @return + */ + public static boolean isAnalysisBody(String appCode, String apiCode, String contentType) { + String keyCircuitBreaker = appCode + ":" + apiCode + ":" + "CIRCUIT_BREAKER"; + CircuitBreaker circuitBreaker = AppConfigHandle.getApiCodeCircuitBreaker(keyCircuitBreaker); + boolean isDataSecurity = AppConfigHandle.isDataSecurity(appCode); + // 文件上传不走加解密 + return (isDataSecurity || circuitBreaker != null) && StringUtils.startsWith(contentType, "multipart") == false; + } /*** * 优先apicode配置限流、无法找到匹配全局限流 * diff --git a/sf-vertx/src/main/java/com/sf/vertx/handle/BodyHandlerImpl.java b/sf-vertx/src/main/java/com/sf/vertx/handle/BodyHandlerImpl.java index f3b69bc..2e4fcc6 100644 --- a/sf-vertx/src/main/java/com/sf/vertx/handle/BodyHandlerImpl.java +++ b/sf-vertx/src/main/java/com/sf/vertx/handle/BodyHandlerImpl.java @@ -80,15 +80,11 @@ public class BodyHandlerImpl implements BodyHandler { final HttpServerResponse response = context.response(); String appCode = context.request().headers().get(AppConfigHandle.getAppCodeHeaderKey()); String apiCode = context.request().headers().get(AppConfigHandle.getApiCodeHeaderKey()); - // 判断
- // 1、是否配置全局加解密.
- // 2、apiCode 配置熔断 - String keyCircuitBreaker = appCode + ":" + apiCode + ":" + "CIRCUIT_BREAKER"; + String contentType = context.request().headers().get(HttpHeaders.CONTENT_TYPE); boolean isLoadBody = false; try { // TODO 测试异常 - isLoadBody = AppConfigHandle.isDataSecurity(appCode) - || AppConfigHandle.isApiCodeCircuitBreaker(keyCircuitBreaker); + isLoadBody = AppConfigHandle.isAnalysisBody(appCode, apiCode, contentType); } catch (Exception e) { e.printStackTrace(); context.fail(new HttpException(SacErrorCode.DEFAULT_ERROR_CODE)); diff --git a/sf-vertx/src/main/java/io/vertx/httpproxy/impl/ReverseProxy.java b/sf-vertx/src/main/java/io/vertx/httpproxy/impl/ReverseProxy.java index 81d7043..5584e2b 100644 --- a/sf-vertx/src/main/java/io/vertx/httpproxy/impl/ReverseProxy.java +++ b/sf-vertx/src/main/java/io/vertx/httpproxy/impl/ReverseProxy.java @@ -387,24 +387,14 @@ public class ReverseProxy implements HttpProxy { // 2、apiCode 配置熔断 String appCode = proxyRequest.headers().get(AppConfigHandle.getAppCodeHeaderKey()); String apiCode = proxyRequest.headers().get(AppConfigHandle.getApiCodeHeaderKey()); + String contentType = proxyRequest.headers().get(HttpHeaders.CONTENT_TYPE); String keyCircuitBreaker = appCode + ":" + apiCode + ":" + "CIRCUIT_BREAKER"; CircuitBreaker circuitBreaker = AppConfigHandle.getApiCodeCircuitBreaker(keyCircuitBreaker); - boolean isDataSecurity = AppConfigHandle.isDataSecurity(appCode); - if (isDataSecurity || circuitBreaker != null) { + if (AppConfigHandle.isAnalysisBody(appCode, apiCode, contentType)) { try { - if (isDataSecurity && circuitBreaker != null) { - // 加解密,只支持application/json - String contentType = proxyRequest.headers().get(HttpHeaders.CONTENT_TYPE); - if(StringUtils.equals(contentType, "application/json") == false) { - throw new HttpException(10019); - } + if (AppConfigHandle.isDataSecurity(appCode) && circuitBreaker != null) { return breakerAndSecurity(circuitBreaker, proxyRequest); - } else if (isDataSecurity) { - // 加解密,只支持application/json - String contentType = proxyRequest.headers().get(HttpHeaders.CONTENT_TYPE); - if(StringUtils.equals(contentType, "application/json") == false) { - throw new HttpException(10019); - } + } else if (AppConfigHandle.isDataSecurity(appCode)) { return security(circuitBreaker, proxyRequest); } else if (circuitBreaker != null) { return breaker(circuitBreaker, proxyRequest);