From: Simon Brandhof Date: Wed, 18 Apr 2018 07:56:28 +0000 (+0200) Subject: SONAR-10601 add header "Sonar-Version" to WS responses X-Git-Tag: 7.5~1228 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=d71425fe1accb072fbaeed32af4db504bdfdc6f1;p=sonarqube.git SONAR-10601 add header "Sonar-Version" to WS responses --- diff --git a/server/sonar-server/src/main/java/org/sonar/server/ws/WebServiceFilter.java b/server/sonar-server/src/main/java/org/sonar/server/ws/WebServiceFilter.java index 1efd88c1065..631be28f12c 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/ws/WebServiceFilter.java +++ b/server/sonar-server/src/main/java/org/sonar/server/ws/WebServiceFilter.java @@ -26,6 +26,7 @@ import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.sonar.api.SonarRuntime; import org.sonar.api.server.ws.WebService; import org.sonar.api.web.ServletFilter; import org.sonar.core.util.stream.MoreCollectors; @@ -48,8 +49,9 @@ public class WebServiceFilter extends ServletFilter { private final WebServiceEngine webServiceEngine; private final Set includeUrls; private final Set excludeUrls; + private final SonarRuntime runtime; - public WebServiceFilter(WebServiceEngine webServiceEngine) { + public WebServiceFilter(WebServiceEngine webServiceEngine, SonarRuntime runtime) { this.webServiceEngine = webServiceEngine; this.includeUrls = concat( Stream.of("/api/*"), @@ -65,6 +67,7 @@ public class WebServiceFilter extends ServletFilter { .filter(action -> action.handler() instanceof ServletFilterHandler) .map(toPath())) .collect(MoreCollectors.toSet()); + this.runtime = runtime; } @Override @@ -81,6 +84,7 @@ public class WebServiceFilter extends ServletFilter { HttpServletResponse response = (HttpServletResponse) servletResponse; ServletRequest wsRequest = new ServletRequest(request); ServletResponse wsResponse = new ServletResponse(response); + wsResponse.setHeader("Sonar-Version", runtime.getApiVersion().toString()); webServiceEngine.execute(wsRequest, wsResponse); } diff --git a/server/sonar-server/src/test/java/org/sonar/server/ws/WebServiceFilterTest.java b/server/sonar-server/src/test/java/org/sonar/server/ws/WebServiceFilterTest.java index b2c7c21c359..47911d3f877 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/ws/WebServiceFilterTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/ws/WebServiceFilterTest.java @@ -29,10 +29,14 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; +import org.sonar.api.SonarQubeSide; +import org.sonar.api.SonarRuntime; +import org.sonar.api.internal.SonarRuntimeImpl; import org.sonar.api.server.ws.Request; import org.sonar.api.server.ws.RequestHandler; import org.sonar.api.server.ws.Response; import org.sonar.api.server.ws.WebService; +import org.sonar.api.utils.Version; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; @@ -43,6 +47,8 @@ import static org.sonar.server.ws.WebServiceFilterTest.WsUrl.newWsUrl; public class WebServiceFilterTest { + private static final String RUNTIME_VERSION = "7.1.0.1234"; + @Rule public ExpectedException expectedException = ExpectedException.none(); @@ -52,7 +58,7 @@ public class WebServiceFilterTest { private HttpServletResponse response = mock(HttpServletResponse.class); private FilterChain chain = mock(FilterChain.class); private ServletOutputStream responseOutput = mock(ServletOutputStream.class); - + private SonarRuntime runtime = SonarRuntimeImpl.forSonarQube(Version.parse(RUNTIME_VERSION), SonarQubeSide.SERVER); private WebServiceFilter underTest; @Before @@ -93,8 +99,8 @@ public class WebServiceFilterTest { @Test public void does_not_match_servlet_filter_that_prefix_a_ws() { initWebServiceEngine( - newWsUrl("api/foo", "action").setHandler(ServletFilterHandler.INSTANCE), - newWsUrl("api/foo", "action_2")); + newWsUrl("api/foo", "action").setHandler(ServletFilterHandler.INSTANCE), + newWsUrl("api/foo", "action_2")); assertThat(underTest.doGetPattern().matches("/api/foo/action")).isFalse(); assertThat(underTest.doGetPattern().matches("/api/foo/action_2")).isTrue(); @@ -109,12 +115,21 @@ public class WebServiceFilterTest { } @Test - public void execute_ws() throws Exception { - underTest = new WebServiceFilter(webServiceEngine); + public void execute_ws() { + underTest = new WebServiceFilter(webServiceEngine, runtime); + + underTest.doFilter(request, response, chain); + + verify(webServiceEngine).execute(any(), any()); + } + + @Test + public void add_version_to_response_headers() { + underTest = new WebServiceFilter(webServiceEngine, runtime); underTest.doFilter(request, response, chain); - verify(webServiceEngine).execute(any(ServletRequest.class), any(org.sonar.server.ws.ServletResponse.class)); + verify(response).setHeader("Sonar-Version", RUNTIME_VERSION); } private void initWebServiceEngine(WsUrl... wsUrls) { @@ -137,7 +152,7 @@ public class WebServiceFilterTest { controllers.add(wsController); } when(webServiceEngine.controllers()).thenReturn(controllers); - underTest = new WebServiceFilter(webServiceEngine); + underTest = new WebServiceFilter(webServiceEngine, runtime); } static final class WsUrl {