Add setFormData to FizzServerWebExchangeDecorator

This commit is contained in:
hongqiaowei
2021-09-17 21:32:46 +08:00
parent 10601a8463
commit 6be2d088df
2 changed files with 52 additions and 1 deletions

View File

@@ -48,6 +48,10 @@ public class FizzServerHttpRequestDecorator extends ServerHttpRequestDecorator {
return headers;
}
public void setEmptyBody() {
this.body = Flux.empty();
}
public void setBody(DataBuffer body) {
if (body instanceof PooledDataBuffer) {
byte[] bytes = new byte[body.readableByteCount()];

View File

@@ -27,13 +27,20 @@ import org.springframework.util.StringUtils;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.ServerWebExchangeDecorator;
import reactor.core.publisher.Mono;
import we.spring.http.server.reactive.ext.FizzServerHttpRequestDecorator;
import we.util.Constants;
import we.util.NettyDataBufferUtils;
import we.util.ThreadContext;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.nio.CharBuffer;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* @author hongqiaowei
@@ -66,7 +73,7 @@ public class FizzServerWebExchangeDecorator extends ServerWebExchangeDecorator {
if (idx == -1) {
result.add(URLDecoder.decode(pair, charset.name()), null);
} else {
String name = URLDecoder.decode(pair.substring(0, idx), charset.name());
String name = URLDecoder.decode(pair.substring(0, idx), charset.name());
String value = URLDecoder.decode(pair.substring(idx + 1), charset.name());
result.add(name, value);
}
@@ -100,4 +107,44 @@ public class FizzServerWebExchangeDecorator extends ServerWebExchangeDecorator {
return EMPTY_FORM_DATA_MONO;
}
}
/**
* @param dataMap can be {@link org.springframework.util.LinkedMultiValueMap}
*/
public void setFormData(MultiValueMap<String, String> dataMap) {
FizzServerHttpRequestDecorator req = (FizzServerHttpRequestDecorator) getDelegate().getRequest();
req.getHeaders().setContentType(MediaType.APPLICATION_FORM_URLENCODED);
if (CollectionUtils.isEmpty(dataMap)) {
req.setEmptyBody();
return;
}
StringBuilder b = ThreadContext.getStringBuilder();
Set<Map.Entry<String, List<String>>> fieldValuesEntries = dataMap.entrySet();
int fs = fieldValuesEntries.size(), cnt = 0;
try {
for (Map.Entry<String, List<String>> fieldValuesEntry : fieldValuesEntries) {
String field = fieldValuesEntry.getKey();
List<String> values = fieldValuesEntry.getValue();
if (CollectionUtils.isEmpty(values)) {
b.append(URLEncoder.encode(field, Constants.Charset.UTF8));
} else {
int vs = values.size();
for (int i = 0; i < vs; ) {
b.append(URLEncoder.encode(field, Constants.Charset.UTF8))
.append('=')
.append(URLEncoder.encode(values.get(i), Constants.Charset.UTF8));
if ((++i) != vs) {
b.append('&');
}
}
}
if ((++cnt) != fs) {
b.append('&');
}
}
} catch (UnsupportedEncodingException ex) {
throw new IllegalStateException(ex);
}
req.setBody(b.toString());
}
}