Add setFormData to FizzServerWebExchangeDecorator

This commit is contained in:
hongqiaowei
2021-09-17 21:16:36 +08:00
parent 0b546bc0e4
commit 017d5360d5
2 changed files with 51 additions and 0 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
@@ -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());
}
}