Updates for new HttpTraceRepository

parent acf42797
...@@ -23,7 +23,7 @@ import org.apache.http.impl.client.CloseableHttpClient; ...@@ -23,7 +23,7 @@ import org.apache.http.impl.client.CloseableHttpClient;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint; import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
import org.springframework.boot.actuate.health.Health; import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.trace.TraceRepository; import org.springframework.boot.actuate.web.trace.HttpTraceRepository;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
...@@ -163,7 +163,7 @@ public class ZuulProxyAutoConfiguration extends ZuulServerAutoConfiguration { ...@@ -163,7 +163,7 @@ public class ZuulProxyAutoConfiguration extends ZuulServerAutoConfiguration {
protected static class EndpointConfiguration { protected static class EndpointConfiguration {
@Autowired(required = false) @Autowired(required = false)
private TraceRepository traces; private HttpTraceRepository traces;
@Bean @Bean
@ConditionalOnEnabledEndpoint @ConditionalOnEnabledEndpoint
......
...@@ -20,26 +20,37 @@ package org.springframework.cloud.netflix.zuul.filters; ...@@ -20,26 +20,37 @@ package org.springframework.cloud.netflix.zuul.filters;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.net.URI;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Enumeration;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import org.springframework.boot.actuate.trace.TraceRepository; import org.springframework.boot.actuate.web.trace.HttpExchangeTracer;
import org.springframework.boot.actuate.web.trace.HttpTrace;
import org.springframework.boot.actuate.web.trace.HttpTraceRepository;
import org.springframework.boot.actuate.web.trace.Include;
import org.springframework.boot.actuate.web.trace.TraceableRequest;
import org.springframework.util.MultiValueMap; import org.springframework.util.MultiValueMap;
import com.netflix.zuul.context.RequestContext; import com.netflix.zuul.context.RequestContext;
import org.springframework.util.StringUtils;
import javax.servlet.http.HttpServletRequest;
/** /**
* @author Spencer Gibb * @author Spencer Gibb
*/ */
public class TraceProxyRequestHelper extends ProxyRequestHelper { public class TraceProxyRequestHelper extends ProxyRequestHelper {
private TraceRepository traces; private HttpTraceRepository traces;
private final HttpExchangeTracer tracer = new HttpExchangeTracer(Include.defaultIncludes());
public void setTraces(TraceRepository traces) { public void setTraces(HttpTraceRepository traces) {
this.traces = traces; this.traces = traces;
} }
...@@ -60,19 +71,72 @@ public class TraceProxyRequestHelper extends ProxyRequestHelper { ...@@ -60,19 +71,72 @@ public class TraceProxyRequestHelper extends ProxyRequestHelper {
trace.put("request", input); trace.put("request", input);
info.put("headers", trace); info.put("headers", trace);
debugHeaders(headers, input); debugHeaders(headers, input);
RequestContext ctx = RequestContext.getCurrentContext(); HttpServletRequest request = context.getRequest();
if (shouldDebugBody(ctx)) { if (shouldDebugBody(context)) {
// Prevent input stream from being read if it needs to go downstream // Prevent input stream from being read if it needs to go downstream
if (requestEntity != null) { if (requestEntity != null) {
debugRequestEntity(info, ctx.getRequest().getInputStream()); debugRequestEntity(info, request.getInputStream());
} }
} }
this.traces.add(info); HttpTrace httpTrace = tracer.receivedRequest(new ServletTraceableRequest(request));
this.traces.add(httpTrace);
return info; return info;
} }
return info; return info;
} }
private class ServletTraceableRequest implements TraceableRequest {
private HttpServletRequest request;
public ServletTraceableRequest(HttpServletRequest request) {
this.request = request;
}
@Override
public String getMethod() {
return request.getMethod();
}
@Override
public URI getUri() {
StringBuffer urlBuffer = request.getRequestURL();
if (StringUtils.hasText(request.getQueryString())) {
urlBuffer.append("?");
urlBuffer.append(request.getQueryString());
}
return URI.create(urlBuffer.toString());
}
@Override
public Map<String, List<String>> getHeaders() {
return extractHeaders();
}
@Override
public String getRemoteAddress() {
return request.getRemoteAddr();
}
private Map<String, List<String>> extractHeaders() {
Map<String, List<String>> headers = new LinkedHashMap<>();
Enumeration<String> names = request.getHeaderNames();
while (names.hasMoreElements()) {
String name = names.nextElement();
headers.put(name, toList(request.getHeaders(name)));
}
return headers;
}
private List<String> toList(Enumeration<String> enumeration) {
List<String> list = new ArrayList<>();
while (enumeration.hasMoreElements()) {
list.add(enumeration.nextElement());
}
return list;
}
}
void debugHeaders(MultiValueMap<String, String> headers, Map<String, Object> map) { void debugHeaders(MultiValueMap<String, String> headers, Map<String, Object> map) {
for (Entry<String, List<String>> entry : headers.entrySet()) { for (Entry<String, List<String>> entry : headers.entrySet()) {
Collection<String> collection = entry.getValue(); Collection<String> collection = entry.getValue();
......
...@@ -18,7 +18,6 @@ ...@@ -18,7 +18,6 @@
package org.springframework.cloud.netflix.zuul; package org.springframework.cloud.netflix.zuul;
import java.io.IOException; import java.io.IOException;
import java.util.Map;
import javax.inject.Inject; import javax.inject.Inject;
import javax.servlet.http.Part; import javax.servlet.http.Part;
...@@ -27,8 +26,8 @@ import org.junit.After; ...@@ -27,8 +26,8 @@ import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.boot.actuate.trace.InMemoryTraceRepository; import org.springframework.boot.actuate.web.trace.HttpTraceRepository;
import org.springframework.boot.actuate.trace.TraceRepository; import org.springframework.boot.actuate.web.trace.InMemoryHttpTraceRepository;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
...@@ -289,16 +288,8 @@ class FormZuulProxyApplication { ...@@ -289,16 +288,8 @@ class FormZuulProxyApplication {
} }
@Bean @Bean
public TraceRepository traceRepository() { public HttpTraceRepository traceRepository() {
return new InMemoryTraceRepository() { return new InMemoryHttpTraceRepository();
@Override
public void add(Map<String, Object> map) {
if (map.containsKey("body")) {
map.get("body");
}
super.add(map);
}
};
} }
public static void main(String[] args) { public static void main(String[] args) {
......
...@@ -19,7 +19,6 @@ package org.springframework.cloud.netflix.zuul; ...@@ -19,7 +19,6 @@ package org.springframework.cloud.netflix.zuul;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.Map;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
...@@ -28,8 +27,8 @@ import org.junit.Before; ...@@ -28,8 +27,8 @@ import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.trace.InMemoryTraceRepository; import org.springframework.boot.actuate.web.trace.HttpTraceRepository;
import org.springframework.boot.actuate.trace.TraceRepository; import org.springframework.boot.actuate.web.trace.InMemoryHttpTraceRepository;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.boot.test.web.client.TestRestTemplate;
...@@ -205,16 +204,8 @@ class FormZuulServletProxyApplication { ...@@ -205,16 +204,8 @@ class FormZuulServletProxyApplication {
} }
@Bean @Bean
public TraceRepository traceRepository() { public HttpTraceRepository traceRepository() {
return new InMemoryTraceRepository() { return new InMemoryHttpTraceRepository();
@Override
public void add(Map<String, Object> map) {
if (map.containsKey("body")) {
map.get("body");
}
super.add(map);
}
};
} }
} }
......
...@@ -21,14 +21,15 @@ import java.util.List; ...@@ -21,14 +21,15 @@ import java.util.List;
import com.netflix.zuul.context.RequestContext; import com.netflix.zuul.context.RequestContext;
import org.assertj.core.api.Assertions;
import org.junit.After; import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.mockito.Mock; import org.mockito.Mock;
import org.springframework.boot.actuate.trace.InMemoryTraceRepository; import org.springframework.boot.actuate.web.trace.HttpTrace;
import org.springframework.boot.actuate.trace.Trace; import org.springframework.boot.actuate.web.trace.HttpTraceRepository;
import org.springframework.boot.actuate.trace.TraceRepository; import org.springframework.boot.actuate.web.trace.InMemoryHttpTraceRepository;
import org.springframework.http.HttpHeaders; import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletRequest;
...@@ -53,7 +54,7 @@ import static org.springframework.cloud.netflix.zuul.filters.support.FilterConst ...@@ -53,7 +54,7 @@ import static org.springframework.cloud.netflix.zuul.filters.support.FilterConst
public class ProxyRequestHelperTests { public class ProxyRequestHelperTests {
@Mock @Mock
private TraceRepository traceRepository; private HttpTraceRepository traceRepository;
@Before @Before
public void init() { public void init() {
...@@ -81,16 +82,15 @@ public class ProxyRequestHelperTests { ...@@ -81,16 +82,15 @@ public class ProxyRequestHelperTests {
RequestContext.getCurrentContext().setRequest(request); RequestContext.getCurrentContext().setRequest(request);
TraceProxyRequestHelper helper = new TraceProxyRequestHelper(); TraceProxyRequestHelper helper = new TraceProxyRequestHelper();
this.traceRepository = new InMemoryTraceRepository(); this.traceRepository = new InMemoryHttpTraceRepository();
helper.setTraces(this.traceRepository); helper.setTraces(this.traceRepository);
MultiValueMap<String, String> headers = helper.buildZuulRequestHeaders(request); MultiValueMap<String, String> headers = helper.buildZuulRequestHeaders(request);
helper.debug("POST", "http://example.com", headers, helper.debug("POST", "http://example.com", headers,
new LinkedMultiValueMap<String, String>(), request.getInputStream()); new LinkedMultiValueMap<>(), request.getInputStream());
Trace actual = this.traceRepository.findAll().get(0); HttpTrace actual = this.traceRepository.findAll().get(0);
assertThat((String) actual.getInfo().get("body"), equalTo("{}")); Assertions.assertThat(actual.getRequest().getHeaders()).containsKeys("singleName", "multiName");
} }
@Test @Test
......
...@@ -24,7 +24,9 @@ import org.springframework.context.annotation.Import; ...@@ -24,7 +24,9 @@ import org.springframework.context.annotation.Import;
import org.springframework.core.Ordered; import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order; import org.springframework.core.annotation.Order;
import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.web.firewall.StrictHttpFirewall;
/** /**
* @author Spencer Gibb * @author Spencer Gibb
...@@ -43,6 +45,12 @@ public class TestAutoConfiguration { ...@@ -43,6 +45,12 @@ public class TestAutoConfiguration {
super(true); super(true);
} }
@Override
public void configure(WebSecurity web) throws Exception {
StrictHttpFirewall httpFirewall = new StrictHttpFirewall();
httpFirewall.setAllowSemicolon(true);
web.httpFirewall(httpFirewall);
}
@Override @Override
protected void configure(HttpSecurity http) throws Exception { protected void configure(HttpSecurity http) throws Exception {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment