#1203 Improve filter performance by using only one instance of AllEncompassingFormHttpMessageConverter (#1681)

This commit is contained in:
Roman Terentiev
2017-02-10 19:25:27 +02:00
committed by Spencer Gibb
parent 7237275f5d
commit c795bd16a7

View File

@@ -31,6 +31,7 @@ import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.InvalidMediaTypeException;
import org.springframework.http.MediaType;
import org.springframework.http.converter.FormHttpMessageConverter;
import org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter;
import org.springframework.util.Assert;
import org.springframework.util.MultiValueMap;
@@ -52,10 +53,16 @@ import static org.springframework.cloud.netflix.zuul.filters.support.FilterConst
*/
public class FormBodyWrapperFilter extends ZuulFilter {
private FormHttpMessageConverter formHttpMessageConverter;
private Field requestField;
private Field servletRequestField;
public FormBodyWrapperFilter() {
this(new AllEncompassingFormHttpMessageConverter());
}
public FormBodyWrapperFilter(FormHttpMessageConverter formHttpMessageConverter) {
this.formHttpMessageConverter = formHttpMessageConverter;
this.requestField = ReflectionUtils.findField(HttpServletRequestWrapper.class,
"req", HttpServletRequest.class);
this.servletRequestField = ReflectionUtils.findField(ServletRequestWrapper.class,
@@ -139,8 +146,6 @@ public class FormBodyWrapperFilter extends ZuulFilter {
private int contentLength;
private AllEncompassingFormHttpMessageConverter converter = new AllEncompassingFormHttpMessageConverter();
public FormBodyRequestWrapper(HttpServletRequest request) {
super(request);
this.request = request;
@@ -184,7 +189,7 @@ public class FormBodyWrapperFilter extends ZuulFilter {
this.contentType = MediaType.valueOf(this.request.getContentType());
data.getHeaders().setContentType(this.contentType);
this.converter.write(builder, this.contentType, data);
FormBodyWrapperFilter.this.formHttpMessageConverter.write(builder, this.contentType, data);
// copy new content type including multipart boundary
this.contentType = data.getHeaders().getContentType();
this.contentData = data.getInput();