diff --git a/knife4j/knife4j-aggregation-spring-boot-starter/pom.xml b/knife4j/knife4j-aggregation-spring-boot-starter/pom.xml index 31160dcde6d0d70750c2161d8f879ba00fb24dd9..eb912fe07450a47961e59dfb3685138943270db9 100644 --- a/knife4j/knife4j-aggregation-spring-boot-starter/pom.xml +++ b/knife4j/knife4j-aggregation-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ knife4j com.github.xiaoymin - 2.0.8 + 2.0.9 4.0.0 knife4j-aggregation-spring-boot-starter diff --git a/knife4j/knife4j-aggregation-spring-boot-starter/src/main/java/com/github/xiaoymin/knife4j/aggre/core/RouteDispatcher.java b/knife4j/knife4j-aggregation-spring-boot-starter/src/main/java/com/github/xiaoymin/knife4j/aggre/core/RouteDispatcher.java index 3940a845841e066bbdefda64a26b5609cb44daf6..19765b9dc5876ed50dd09c27a3b83a649ef3dbea 100644 --- a/knife4j/knife4j-aggregation-spring-boot-starter/src/main/java/com/github/xiaoymin/knife4j/aggre/core/RouteDispatcher.java +++ b/knife4j/knife4j-aggregation-spring-boot-starter/src/main/java/com/github/xiaoymin/knife4j/aggre/core/RouteDispatcher.java @@ -40,13 +40,13 @@ public class RouteDispatcher { /** * 请求头 */ - public static final String ROUTE_PROXY_HEADER_NAME="knfie4j-gateway-request"; - public static final String ROUTE_PROXY_HEADER_BASIC_NAME="knife4j-gateway-basic-request"; - public static final String OPENAPI_GROUP_ENDPOINT="/swagger-resources"; - public static final String OPENAPI_GROUP_INSTANCE_ENDPOINT="/swagger-instance"; - public static final String ROUTE_BASE_PATH="/"; + public static final String ROUTE_PROXY_HEADER_NAME = "knfie4j-gateway-request"; + public static final String ROUTE_PROXY_HEADER_BASIC_NAME = "knife4j-gateway-basic-request"; + public static final String OPENAPI_GROUP_ENDPOINT = "/swagger-resources"; + public static final String OPENAPI_GROUP_INSTANCE_ENDPOINT = "/swagger-instance"; + public static final String ROUTE_BASE_PATH = "/"; - Logger logger= LoggerFactory.getLogger(RouteDispatcher.class); + Logger logger = LoggerFactory.getLogger(RouteDispatcher.class); /** * 当前项目的contextPath */ @@ -58,73 +58,75 @@ public class RouteDispatcher { private RouteCache routeCache; - private Set ignoreHeaders=new HashSet<>(); + private Set ignoreHeaders = new HashSet<>(); - public RouteDispatcher(RouteRepository routeRepository, RouteCache routeRouteCache, ExecutorEnum executorEnum,String rootPath){ - this.routeRepository=routeRepository; - this.routeCache=routeRouteCache; - this.rootPath=rootPath; + public RouteDispatcher(RouteRepository routeRepository, RouteCache routeRouteCache, + ExecutorEnum executorEnum, String rootPath) { + this.routeRepository = routeRepository; + this.routeCache = routeRouteCache; + this.rootPath = rootPath; initExecutor(executorEnum); ignoreHeaders.addAll(Arrays.asList(new String[]{ - "host","content-length",ROUTE_PROXY_HEADER_NAME,ROUTE_PROXY_HEADER_BASIC_NAME,"Request-Origion" + "host", "content-length", ROUTE_PROXY_HEADER_NAME, ROUTE_PROXY_HEADER_BASIC_NAME, "Request-Origion" })); } - private void initExecutor(ExecutorEnum executorEnum){ - if (executorEnum==null){ + private void initExecutor(ExecutorEnum executorEnum) { + if (executorEnum == null) { throw new IllegalArgumentException("ExecutorEnum can not be empty"); } - switch (executorEnum){ + switch (executorEnum) { case APACHE: - this.routeExecutor=new ApacheClientExecutor(); + this.routeExecutor = new ApacheClientExecutor(); break; case OKHTTP: - this.routeExecutor=new OkHttpClientExecutor(); + this.routeExecutor = new OkHttpClientExecutor(); break; default: - throw new UnsupportedOperationException("UnSupported ExecutorType:"+executorEnum.name()); + throw new UnsupportedOperationException("UnSupported ExecutorType:" + executorEnum.name()); } } - public boolean checkRoute(String header){ - if (StrUtil.isNotBlank(header)){ - SwaggerRoute swaggerRoute=routeCache.get(header); - if (swaggerRoute!=null){ + public boolean checkRoute(String header) { + if (StrUtil.isNotBlank(header)) { + SwaggerRoute swaggerRoute = routeCache.get(header); + if (swaggerRoute != null) { return StrUtil.isNotBlank(swaggerRoute.getUri()); } - swaggerRoute=routeRepository.getRoute(header); - if (swaggerRoute!=null){ - routeCache.put(header,swaggerRoute); + swaggerRoute = routeRepository.getRoute(header); + if (swaggerRoute != null) { + routeCache.put(header, swaggerRoute); return StrUtil.isNotBlank(swaggerRoute.getUri()); } } return false; } - public void execute(HttpServletRequest request, HttpServletResponse response){ - try{ - RouteRequestContext routeContext=new RouteRequestContext(); - this.buildContext(routeContext,request); - RouteResponse routeResponse=routeExecutor.executor(routeContext); - writeResponseHeader(routeResponse,response); - writeBody(routeResponse,response); - }catch (Exception e){ - logger.error("has Error:{}",e.getMessage()); - logger.error(e.getMessage(),e); - //write Default - writeDefault(request,response,e.getMessage()); + public void execute(HttpServletRequest request, HttpServletResponse response) { + try { + RouteRequestContext routeContext = new RouteRequestContext(); + this.buildContext(routeContext, request); + RouteResponse routeResponse = routeExecutor.executor(routeContext); + writeResponseStatus(routeResponse, response); + writeResponseHeader(routeResponse, response); + writeBody(routeResponse, response); + } catch (Exception e) { + logger.error("has Error:{}", e.getMessage()); + logger.error(e.getMessage(), e); + //write Default + writeDefault(request, response, e.getMessage()); } } - protected void writeDefault(HttpServletRequest request,HttpServletResponse response,String errMsg){ + protected void writeDefault(HttpServletRequest request, HttpServletResponse response, String errMsg) { response.setContentType("application/json"); response.setCharacterEncoding("UTF-8"); try { - PrintWriter printWriter=response.getWriter(); - Map map= new HashMap<>(); - map.put("message",errMsg); - map.put("code","500"); - map.put("path",request.getRequestURI()); + PrintWriter printWriter = response.getWriter(); + Map map = new HashMap<>(); + map.put("message", errMsg); + map.put("code", "500"); + map.put("path", request.getRequestURI()); new JSONObject(map).write(printWriter); printWriter.close(); } catch (IOException e) { @@ -132,25 +134,38 @@ public class RouteDispatcher { } } + /** + * Write 响应状态码 + * + * @param routeResponse routeResponse + * @param response response + */ + protected void writeResponseStatus(RouteResponse routeResponse, HttpServletResponse response) { + if (routeResponse != null) { + response.setStatus(routeResponse.getStatusCode()); + } + } + /** * Write响应头 + * * @param routeResponse * @param response */ - protected void writeResponseHeader(RouteResponse routeResponse,HttpServletResponse response){ - if (routeResponse!=null){ - if (CollectionUtil.isNotEmpty(routeResponse.getHeaders())){ - for (HeaderWrapper header:routeResponse.getHeaders()){ - if (!StrUtil.equalsIgnoreCase(header.getName(),"Transfer-Encoding")){ - response.addHeader(header.getName(),header.getValue()); + protected void writeResponseHeader(RouteResponse routeResponse, HttpServletResponse response) { + if (routeResponse != null) { + if (CollectionUtil.isNotEmpty(routeResponse.getHeaders())) { + for (HeaderWrapper header : routeResponse.getHeaders()) { + if (!StrUtil.equalsIgnoreCase(header.getName(), "Transfer-Encoding")) { + response.addHeader(header.getName(), header.getValue()); } } } - if (logger.isDebugEnabled()){ - logger.debug("响应类型:{},响应编码:{}",routeResponse.getContentType(),routeResponse.getCharsetEncoding()); + if (logger.isDebugEnabled()) { + logger.debug("响应类型:{},响应编码:{}", routeResponse.getContentType(), routeResponse.getCharsetEncoding()); } response.setContentType(routeResponse.getContentType()); - if (routeResponse.getContentLength()>0){ + if (routeResponse.getContentLength() > 0) { response.setContentLengthLong(routeResponse.getContentLength()); } response.setCharacterEncoding(routeResponse.getCharsetEncoding().displayName()); @@ -159,27 +174,28 @@ public class RouteDispatcher { /** * 响应内容 + * * @param routeResponse * @param response */ - protected void writeBody(RouteResponse routeResponse,HttpServletResponse response) throws IOException { - if (routeResponse!=null){ - if (routeResponse.success()){ - InputStream inputStream=routeResponse.getBody(); - if (inputStream!=null){ - int read=-1; - byte[] bytes=new byte[1024*1024]; - ServletOutputStream outputStream=response.getOutputStream(); - while ((read=inputStream.read(bytes))!=-1){ - outputStream.write(bytes,0,read); + protected void writeBody(RouteResponse routeResponse, HttpServletResponse response) throws IOException { + if (routeResponse != null) { + if (routeResponse.success()) { + InputStream inputStream = routeResponse.getBody(); + if (inputStream != null) { + int read = -1; + byte[] bytes = new byte[1024 * 1024]; + ServletOutputStream outputStream = response.getOutputStream(); + while ((read = inputStream.read(bytes)) != -1) { + outputStream.write(bytes, 0, read); } IoUtil.close(inputStream); IoUtil.close(outputStream); } - }else{ - String text=routeResponse.text(); - if (StrUtil.isNotBlank(text)){ - PrintWriter printWriter=response.getWriter(); + } else { + String text = routeResponse.text(); + if (StrUtil.isNotBlank(text)) { + PrintWriter printWriter = response.getWriter(); printWriter.write(text); printWriter.close(); } @@ -190,80 +206,83 @@ public class RouteDispatcher { /** * 构建路由的请求上下文 + * * @param routeRequestContext * @param request */ - protected void buildContext(RouteRequestContext routeRequestContext,HttpServletRequest request) throws IOException { + protected void buildContext(RouteRequestContext routeRequestContext, HttpServletRequest request) throws IOException { //当前请求是否basic请求 - String basicHeader=request.getHeader(ROUTE_PROXY_HEADER_BASIC_NAME); - if (StrUtil.isNotBlank(basicHeader)){ - BasicAuth basicAuth=routeRepository.getAuth(basicHeader); - if (basicAuth!=null){ + String basicHeader = request.getHeader(ROUTE_PROXY_HEADER_BASIC_NAME); + if (StrUtil.isNotBlank(basicHeader)) { + BasicAuth basicAuth = routeRepository.getAuth(basicHeader); + if (basicAuth != null) { //增加Basic请求头 - routeRequestContext.addHeader("Authorization", RouteUtils.authorize(basicAuth.getUsername(),basicAuth.getPassword())); + routeRequestContext.addHeader("Authorization", RouteUtils.authorize(basicAuth.getUsername(), + basicAuth.getPassword())); } } - SwaggerRoute swaggerRoute=getRoute(request.getHeader(ROUTE_PROXY_HEADER_NAME)); + SwaggerRoute swaggerRoute = getRoute(request.getHeader(ROUTE_PROXY_HEADER_NAME)); //String uri="http://knife4j.xiaominfo.com"; - String uri=swaggerRoute.getUri(); - if (StrUtil.isBlank(uri)){ + String uri = swaggerRoute.getUri(); + if (StrUtil.isBlank(uri)) { throw new RuntimeException("Uri is Empty"); } - String host=URI.create(uri).getHost(); - String fromUri=request.getRequestURI(); - StringBuilder requestUrlBuilder=new StringBuilder(); + String host = URI.create(uri).getHost(); + String fromUri = request.getRequestURI(); + StringBuilder requestUrlBuilder = new StringBuilder(); requestUrlBuilder.append(uri); //判断当前聚合项目的contextPath - if (StrUtil.isNotBlank(this.rootPath)&&!StrUtil.equals(this.rootPath,ROUTE_BASE_PATH)){ - fromUri=fromUri.replaceFirst(this.rootPath,""); + if (StrUtil.isNotBlank(this.rootPath) && !StrUtil.equals(this.rootPath, ROUTE_BASE_PATH)) { + fromUri = fromUri.replaceFirst(this.rootPath, ""); } //判断servicePath - if (StrUtil.isNotBlank(swaggerRoute.getServicePath())&&!StrUtil.equals(swaggerRoute.getServicePath(),ROUTE_BASE_PATH)){ - if (StrUtil.startWith(fromUri,swaggerRoute.getServicePath())){ + if (StrUtil.isNotBlank(swaggerRoute.getServicePath()) && !StrUtil.equals(swaggerRoute.getServicePath(), + ROUTE_BASE_PATH)) { + if (StrUtil.startWith(fromUri, swaggerRoute.getServicePath())) { //实际在请求时,剔除servicePath,否则会造成404 - fromUri=fromUri.replaceFirst(swaggerRoute.getServicePath(),""); + fromUri = fromUri.replaceFirst(swaggerRoute.getServicePath(), ""); } } requestUrlBuilder.append(fromUri); //String requestUrl=uri+fromUri; - String requestUrl=requestUrlBuilder.toString(); - if (logger.isDebugEnabled()){ - logger.debug("目标请求Url:{},请求类型:{},Host:{}",requestUrl,request.getMethod(),host); + String requestUrl = requestUrlBuilder.toString(); + if (logger.isDebugEnabled()) { + logger.debug("目标请求Url:{},请求类型:{},Host:{}", requestUrl, request.getMethod(), host); } routeRequestContext.setOriginalUri(fromUri); routeRequestContext.setUrl(requestUrl); routeRequestContext.setMethod(request.getMethod()); - Enumeration enumeration=request.getHeaderNames(); - while (enumeration.hasMoreElements()){ - String key=enumeration.nextElement(); - String value=request.getHeader(key); - if (!ignoreHeaders.contains(key.toLowerCase())){ - routeRequestContext.addHeader(key,value); + Enumeration enumeration = request.getHeaderNames(); + while (enumeration.hasMoreElements()) { + String key = enumeration.nextElement(); + String value = request.getHeader(key); + if (!ignoreHeaders.contains(key.toLowerCase())) { + routeRequestContext.addHeader(key, value); } } - routeRequestContext.addHeader("Host",host); - Enumeration params=request.getParameterNames(); - while (params.hasMoreElements()){ - String name=params.nextElement(); - String value=request.getParameter(name); + routeRequestContext.addHeader("Host", host); + Enumeration params = request.getParameterNames(); + while (params.hasMoreElements()) { + String name = params.nextElement(); + String value = request.getParameter(name); //logger.info("param-name:{},value:{}",name,value); - routeRequestContext.addParam(name,value); + routeRequestContext.addParam(name, value); } routeRequestContext.setRequestContent(request.getInputStream()); } - public SwaggerRoute getRoute(String header){ - SwaggerRoute swaggerRoute=routeCache.get(header); - if (swaggerRoute==null){ - swaggerRoute=routeRepository.getRoute(header); - if (swaggerRoute!=null){ - routeCache.put(header,swaggerRoute); + public SwaggerRoute getRoute(String header) { + SwaggerRoute swaggerRoute = routeCache.get(header); + if (swaggerRoute == null) { + swaggerRoute = routeRepository.getRoute(header); + if (swaggerRoute != null) { + routeCache.put(header, swaggerRoute); } } return swaggerRoute; } - public List getRoutes(){ + public List getRoutes() { return routeRepository.getRoutes(); } } diff --git a/knife4j/knife4j-annotations/pom.xml b/knife4j/knife4j-annotations/pom.xml index 3d094b4a03ec3ff84c80fa3e274eb92b12270d8e..fa47920e8373e6901e037ae3289838742587fffb 100644 --- a/knife4j/knife4j-annotations/pom.xml +++ b/knife4j/knife4j-annotations/pom.xml @@ -5,7 +5,7 @@ knife4j com.github.xiaoymin - 2.0.8 + 2.0.9 4.0.0 knife4j-annotations diff --git a/knife4j/knife4j-core/pom.xml b/knife4j/knife4j-core/pom.xml index a4ac84b1f376e7bbff7b2cf6db1c57b741159bda..b5b40e3b031a33d4355b0f360271be947a3a9991 100644 --- a/knife4j/knife4j-core/pom.xml +++ b/knife4j/knife4j-core/pom.xml @@ -5,7 +5,7 @@ knife4j com.github.xiaoymin - 2.0.8 + 2.0.9 4.0.0 diff --git a/knife4j/knife4j-dependencies/pom.xml b/knife4j/knife4j-dependencies/pom.xml index d695d22df5992011f8c20537508606a4ee250968..43f6be6dbbbc3ad4544af89f65320f33a978d4d2 100644 --- a/knife4j/knife4j-dependencies/pom.xml +++ b/knife4j/knife4j-dependencies/pom.xml @@ -6,7 +6,7 @@ 4.0.0 com.github.xiaoymin knife4j-dependencies - 2.0.8 + 2.0.9 pom knife4j-dependencies Knife4j Dependencies @@ -35,7 +35,7 @@ 1.8 - 2.0.8 + 2.0.9 1.5.22 2.10.5 2.0.0.RELEASE diff --git a/knife4j/knife4j-jfinal-ui/pom.xml b/knife4j/knife4j-jfinal-ui/pom.xml index 7de1b446d4da0499f675e2993e779197f0e76708..0b3f99ecf3823d8f4246aea2aecc34894eb52397 100644 --- a/knife4j/knife4j-jfinal-ui/pom.xml +++ b/knife4j/knife4j-jfinal-ui/pom.xml @@ -5,7 +5,7 @@ knife4j com.github.xiaoymin - 2.0.8 + 2.0.9 4.0.0 diff --git a/knife4j/knife4j-jfinal/pom.xml b/knife4j/knife4j-jfinal/pom.xml index cf7fa601e561e9d63f175fbab70744d73ca2c057..1ba7d55778ffda6562b6f020d6857eccab49b70e 100644 --- a/knife4j/knife4j-jfinal/pom.xml +++ b/knife4j/knife4j-jfinal/pom.xml @@ -5,7 +5,7 @@ knife4j com.github.xiaoymin - 2.0.8 + 2.0.9 4.0.0 diff --git a/knife4j/knife4j-micro-spring-boot-starter/pom.xml b/knife4j/knife4j-micro-spring-boot-starter/pom.xml index ad9bc43a704cdb2f4d9e0667c378b2d1312277a2..d395175bcded97072d0cc0e8801759e22c3599cd 100644 --- a/knife4j/knife4j-micro-spring-boot-starter/pom.xml +++ b/knife4j/knife4j-micro-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ knife4j com.github.xiaoymin - 2.0.8 + 2.0.9 4.0.0 diff --git a/knife4j/knife4j-spring-boot-autoconfigure/pom.xml b/knife4j/knife4j-spring-boot-autoconfigure/pom.xml index 75a28de06179e3965b1f33e55d200991ea1571f0..7849b68f8d704d941f64421b79339f9c27395f3c 100644 --- a/knife4j/knife4j-spring-boot-autoconfigure/pom.xml +++ b/knife4j/knife4j-spring-boot-autoconfigure/pom.xml @@ -5,7 +5,7 @@ knife4j com.github.xiaoymin - 2.0.8 + 2.0.9 4.0.0 diff --git a/knife4j/knife4j-spring-boot-starter/pom.xml b/knife4j/knife4j-spring-boot-starter/pom.xml index f8d561603436ece103faa8c4510a98e338187ae6..fe337567fb0729f954024038e8fea54432d441a1 100644 --- a/knife4j/knife4j-spring-boot-starter/pom.xml +++ b/knife4j/knife4j-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ knife4j com.github.xiaoymin - 2.0.8 + 2.0.9 4.0.0 knife4j-spring-boot-starter diff --git a/knife4j/knife4j-spring-mvc/pom.xml b/knife4j/knife4j-spring-mvc/pom.xml index bf0a31215601525fcdce943803058ed0c9e5129b..ccb95af13d1da5769f63ca6ad890ccb8272d29da 100644 --- a/knife4j/knife4j-spring-mvc/pom.xml +++ b/knife4j/knife4j-spring-mvc/pom.xml @@ -5,7 +5,7 @@ knife4j com.github.xiaoymin - 2.0.8 + 2.0.9 4.0.0 diff --git a/knife4j/knife4j-spring-ui/pom.xml b/knife4j/knife4j-spring-ui/pom.xml index 5d073d42895e6e3e98d8f8a49340fe30b915629b..db9926b330cad853b5ced37c453c3b8a8517fc05 100644 --- a/knife4j/knife4j-spring-ui/pom.xml +++ b/knife4j/knife4j-spring-ui/pom.xml @@ -5,7 +5,7 @@ knife4j com.github.xiaoymin - 2.0.8 + 2.0.9 4.0.0 knife4j-spring-ui diff --git a/knife4j/knife4j-spring/pom.xml b/knife4j/knife4j-spring/pom.xml index f98bdbc518d7150364c6dde11f169d23229f8986..fd7e13665908b5bc89744403c1a6c3aaba347368 100644 --- a/knife4j/knife4j-spring/pom.xml +++ b/knife4j/knife4j-spring/pom.xml @@ -5,7 +5,7 @@ knife4j com.github.xiaoymin - 2.0.8 + 2.0.9 4.0.0 knife4j-spring diff --git a/knife4j/knife4j-springdoc-ui/pom.xml b/knife4j/knife4j-springdoc-ui/pom.xml index bcf9a628fd79e37b1035afc75b8e693400f14831..d931c3c674f03b3f3f2966e65e7f4101d9064c5f 100644 --- a/knife4j/knife4j-springdoc-ui/pom.xml +++ b/knife4j/knife4j-springdoc-ui/pom.xml @@ -5,7 +5,7 @@ knife4j com.github.xiaoymin - 2.0.8 + 2.0.9 4.0.0 diff --git a/knife4j/pom.xml b/knife4j/pom.xml index 82a112b4fef6ca9a935914fcec5bf0fc6aa33d09..966e5d04958a4afd9bdf7fa01c121979ce59267f 100644 --- a/knife4j/pom.xml +++ b/knife4j/pom.xml @@ -6,7 +6,7 @@ com.github.xiaoymin knife4j - 2.0.8 + 2.0.9 knife4j-annotations knife4j-spring @@ -39,7 +39,7 @@ UTF-8 - 2.0.8 + 2.0.9 1.8 5.2.2.RELEASE 2.10.5