Release 2.3.2-beta1
This commit is contained in:
@@ -12,13 +12,13 @@
|
|||||||
|
|
||||||
<groupId>com.fizzgate</groupId>
|
<groupId>com.fizzgate</groupId>
|
||||||
<artifactId>fizz-bootstrap</artifactId>
|
<artifactId>fizz-bootstrap</artifactId>
|
||||||
<version>2.3.1</version>
|
<version>2.3.2-beta1</version>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<java.version>1.8</java.version>
|
<java.version>1.8</java.version>
|
||||||
<spring-framework.version>5.2.13.RELEASE</spring-framework.version>
|
<spring-framework.version>5.2.13.RELEASE</spring-framework.version>
|
||||||
<spring-session-bom.version>Dragonfruit-SR3</spring-session-bom.version>
|
<spring-session-bom.version>Dragonfruit-SR3</spring-session-bom.version>
|
||||||
<reactor-bom.version>Dysprosium-SR22</reactor-bom.version>
|
<reactor-bom.version>Dysprosium-SR23</reactor-bom.version>
|
||||||
<lettuce.version>5.3.7.RELEASE</lettuce.version>
|
<lettuce.version>5.3.7.RELEASE</lettuce.version>
|
||||||
<netty.version>4.1.68.Final</netty.version>
|
<netty.version>4.1.68.Final</netty.version>
|
||||||
<httpcore.version>4.4.14</httpcore.version>
|
<httpcore.version>4.4.14</httpcore.version>
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>fizz-gateway-community</artifactId>
|
<artifactId>fizz-gateway-community</artifactId>
|
||||||
<groupId>com.fizzgate</groupId>
|
<groupId>com.fizzgate</groupId>
|
||||||
<version>2.3.1</version>
|
<version>2.3.2-beta1</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -0,0 +1,103 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 the original author or authors.
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package we.spring.web.server.ext;
|
||||||
|
|
||||||
|
import org.springframework.http.MediaType;
|
||||||
|
import org.springframework.http.server.reactive.ServerHttpRequest;
|
||||||
|
import org.springframework.lang.Nullable;
|
||||||
|
import org.springframework.util.CollectionUtils;
|
||||||
|
import org.springframework.util.LinkedMultiValueMap;
|
||||||
|
import org.springframework.util.MultiValueMap;
|
||||||
|
import org.springframework.util.StringUtils;
|
||||||
|
import org.springframework.web.server.ServerWebExchange;
|
||||||
|
import org.springframework.web.server.ServerWebExchangeDecorator;
|
||||||
|
import reactor.core.publisher.Mono;
|
||||||
|
import we.util.NettyDataBufferUtils;
|
||||||
|
|
||||||
|
import java.io.UnsupportedEncodingException;
|
||||||
|
import java.net.URLDecoder;
|
||||||
|
import java.nio.CharBuffer;
|
||||||
|
import java.nio.charset.Charset;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author hongqiaowei
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class FizzServerWebExchangeDecorator extends ServerWebExchangeDecorator {
|
||||||
|
|
||||||
|
private static final MultiValueMap<String, String> EMPTY_FORM_DATA = CollectionUtils.unmodifiableMultiValueMap(new LinkedMultiValueMap<String, String>(0));
|
||||||
|
|
||||||
|
private static final Mono<MultiValueMap<String, String>> EMPTY_FORM_DATA_MONO = Mono.just(EMPTY_FORM_DATA).cache();
|
||||||
|
|
||||||
|
public FizzServerWebExchangeDecorator(ServerWebExchange delegate) {
|
||||||
|
super(delegate);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Charset getMediaTypeCharset(@Nullable MediaType mediaType) {
|
||||||
|
if (mediaType != null && mediaType.getCharset() != null) {
|
||||||
|
return mediaType.getCharset();
|
||||||
|
} else {
|
||||||
|
return StandardCharsets.UTF_8;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private MultiValueMap<String, String> parseFormData(Charset charset, String source) {
|
||||||
|
String[] pairs = StringUtils.tokenizeToStringArray(source, "&");
|
||||||
|
MultiValueMap<String, String> result = new LinkedMultiValueMap<>(pairs.length);
|
||||||
|
try {
|
||||||
|
for (String pair : pairs) {
|
||||||
|
int idx = pair.indexOf('=');
|
||||||
|
if (idx == -1) {
|
||||||
|
result.add(URLDecoder.decode(pair, charset.name()), null);
|
||||||
|
} else {
|
||||||
|
String name = URLDecoder.decode(pair.substring(0, idx), charset.name());
|
||||||
|
String value = URLDecoder.decode(pair.substring(idx + 1), charset.name());
|
||||||
|
result.add(name, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (UnsupportedEncodingException ex) {
|
||||||
|
throw new IllegalStateException(ex);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Mono<MultiValueMap<String, String>> getFormData() {
|
||||||
|
ServerHttpRequest req = getDelegate().getRequest();
|
||||||
|
MediaType ct = req.getHeaders().getContentType();
|
||||||
|
if (MediaType.APPLICATION_FORM_URLENCODED.isCompatibleWith(ct)) {
|
||||||
|
Charset charset = getMediaTypeCharset(ct);
|
||||||
|
return
|
||||||
|
req.getBody().defaultIfEmpty(NettyDataBufferUtils.EMPTY_DATA_BUFFER)
|
||||||
|
.single()
|
||||||
|
.map(
|
||||||
|
body -> {
|
||||||
|
if (body == NettyDataBufferUtils.EMPTY_DATA_BUFFER) {
|
||||||
|
return EMPTY_FORM_DATA;
|
||||||
|
} else {
|
||||||
|
CharBuffer charBuffer = charset.decode(body.asByteBuffer());
|
||||||
|
return parseFormData(charset, charBuffer.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
return EMPTY_FORM_DATA_MONO;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>fizz-gateway-community</artifactId>
|
<artifactId>fizz-gateway-community</artifactId>
|
||||||
<groupId>com.fizzgate</groupId>
|
<groupId>com.fizzgate</groupId>
|
||||||
<version>2.3.1</version>
|
<version>2.3.2-beta1</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ package we.plugin.requestbody;
|
|||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.http.HttpHeaders;
|
import org.springframework.http.HttpHeaders;
|
||||||
|
import org.springframework.http.MediaType;
|
||||||
import org.springframework.http.server.reactive.ServerHttpRequest;
|
import org.springframework.http.server.reactive.ServerHttpRequest;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import org.springframework.web.server.ServerWebExchange;
|
import org.springframework.web.server.ServerWebExchange;
|
||||||
@@ -28,6 +29,7 @@ import we.flume.clients.log4j2appender.LogService;
|
|||||||
import we.plugin.FizzPluginFilter;
|
import we.plugin.FizzPluginFilter;
|
||||||
import we.plugin.FizzPluginFilterChain;
|
import we.plugin.FizzPluginFilterChain;
|
||||||
import we.spring.http.server.reactive.ext.FizzServerHttpRequestDecorator;
|
import we.spring.http.server.reactive.ext.FizzServerHttpRequestDecorator;
|
||||||
|
import we.spring.web.server.ext.FizzServerWebExchangeDecorator;
|
||||||
import we.util.NettyDataBufferUtils;
|
import we.util.NettyDataBufferUtils;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@@ -51,19 +53,23 @@ public class RequestBodyPlugin implements FizzPluginFilter {
|
|||||||
NettyDataBufferUtils.join(req.getBody()).defaultIfEmpty(NettyDataBufferUtils.EMPTY_DATA_BUFFER)
|
NettyDataBufferUtils.join(req.getBody()).defaultIfEmpty(NettyDataBufferUtils.EMPTY_DATA_BUFFER)
|
||||||
.flatMap(
|
.flatMap(
|
||||||
body -> {
|
body -> {
|
||||||
ServerWebExchange newExchange = exchange;
|
FizzServerHttpRequestDecorator requestDecorator = new FizzServerHttpRequestDecorator(req);
|
||||||
if (body != NettyDataBufferUtils.EMPTY_DATA_BUFFER) {
|
if (body != NettyDataBufferUtils.EMPTY_DATA_BUFFER) {
|
||||||
FizzServerHttpRequestDecorator requestDecorator = new FizzServerHttpRequestDecorator(req);
|
|
||||||
try {
|
try {
|
||||||
requestDecorator.setBody(body);
|
requestDecorator.setBody(body);
|
||||||
} finally {
|
} finally {
|
||||||
NettyDataBufferUtils.release(body);
|
NettyDataBufferUtils.release(body);
|
||||||
}
|
}
|
||||||
requestDecorator.getHeaders().remove(HttpHeaders.CONTENT_LENGTH);
|
requestDecorator.getHeaders().remove(HttpHeaders.CONTENT_LENGTH);
|
||||||
newExchange = exchange.mutate().request(requestDecorator).build();
|
}
|
||||||
if (log.isDebugEnabled()) {
|
ServerWebExchange mutatedExchange = exchange.mutate().request(requestDecorator).build();
|
||||||
log.debug("retain body", LogService.BIZ_ID, req.getId());
|
ServerWebExchange newExchange = mutatedExchange;
|
||||||
}
|
MediaType contentType = req.getHeaders().getContentType();
|
||||||
|
if (MediaType.APPLICATION_FORM_URLENCODED.isCompatibleWith(contentType)) {
|
||||||
|
newExchange = new FizzServerWebExchangeDecorator(mutatedExchange);
|
||||||
|
}
|
||||||
|
if (log.isDebugEnabled()) {
|
||||||
|
log.debug(req.getId() + " request is decorated", LogService.BIZ_ID, req.getId());
|
||||||
}
|
}
|
||||||
return FizzPluginFilterChain.next(newExchange);
|
return FizzPluginFilterChain.next(newExchange);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>fizz-gateway-community</artifactId>
|
<artifactId>fizz-gateway-community</artifactId>
|
||||||
<groupId>com.fizzgate</groupId>
|
<groupId>com.fizzgate</groupId>
|
||||||
<version>2.3.1</version>
|
<version>2.3.2-beta1</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>fizz-gateway-community</artifactId>
|
<artifactId>fizz-gateway-community</artifactId>
|
||||||
<groupId>com.fizzgate</groupId>
|
<groupId>com.fizzgate</groupId>
|
||||||
<version>2.3.1</version>
|
<version>2.3.2-beta1</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
4
pom.xml
4
pom.xml
@@ -7,7 +7,7 @@
|
|||||||
<!--<java.version>1.8</java.version>-->
|
<!--<java.version>1.8</java.version>-->
|
||||||
<spring-boot.version>2.2.13.RELEASE</spring-boot.version>
|
<spring-boot.version>2.2.13.RELEASE</spring-boot.version>
|
||||||
<spring-framework.version>5.2.13.RELEASE</spring-framework.version>
|
<spring-framework.version>5.2.13.RELEASE</spring-framework.version>
|
||||||
<reactor-bom.version>Dysprosium-SR22</reactor-bom.version>
|
<reactor-bom.version>Dysprosium-SR23</reactor-bom.version>
|
||||||
<lettuce.version>5.3.7.RELEASE</lettuce.version>
|
<lettuce.version>5.3.7.RELEASE</lettuce.version>
|
||||||
<nacos.cloud.version>2.2.5.RELEASE</nacos.cloud.version>
|
<nacos.cloud.version>2.2.5.RELEASE</nacos.cloud.version>
|
||||||
<netty.version>4.1.68.Final</netty.version>
|
<netty.version>4.1.68.Final</netty.version>
|
||||||
@@ -34,7 +34,7 @@
|
|||||||
<artifactId>fizz-gateway-community</artifactId>
|
<artifactId>fizz-gateway-community</artifactId>
|
||||||
<name>${project.artifactId}</name>
|
<name>${project.artifactId}</name>
|
||||||
<description>fizz gateway community</description>
|
<description>fizz gateway community</description>
|
||||||
<version>2.3.1</version>
|
<version>2.3.2-beta1</version>
|
||||||
<packaging>pom</packaging>
|
<packaging>pom</packaging>
|
||||||
<modules>
|
<modules>
|
||||||
<module>fizz-common</module>
|
<module>fizz-common</module>
|
||||||
|
|||||||
Reference in New Issue
Block a user