diff --git a/fizz-common/src/main/java/we/spring/http/server/reactive/ext/FizzServerHttpRequestDecorator.java b/fizz-common/src/main/java/we/spring/http/server/reactive/ext/FizzServerHttpRequestDecorator.java index 3c46cdc..3ccba00 100644 --- a/fizz-common/src/main/java/we/spring/http/server/reactive/ext/FizzServerHttpRequestDecorator.java +++ b/fizz-common/src/main/java/we/spring/http/server/reactive/ext/FizzServerHttpRequestDecorator.java @@ -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()]; diff --git a/fizz-common/src/main/java/we/spring/web/server/ext/FizzServerWebExchangeDecorator.java b/fizz-common/src/main/java/we/spring/web/server/ext/FizzServerWebExchangeDecorator.java index 831cc55..ce00db5 100644 --- a/fizz-common/src/main/java/we/spring/web/server/ext/FizzServerWebExchangeDecorator.java +++ b/fizz-common/src/main/java/we/spring/web/server/ext/FizzServerWebExchangeDecorator.java @@ -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 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>> fieldValuesEntries = dataMap.entrySet(); + int fs = fieldValuesEntries.size(), cnt = 0; + try { + for (Map.Entry> fieldValuesEntry : fieldValuesEntries) { + String field = fieldValuesEntry.getKey(); + List 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()); + } }