From 22cd25e7b80e2f7f6acd5388ca9580afbf603c2b Mon Sep 17 00:00:00 2001 From: Jan Stamer Date: Sat, 15 Feb 2014 22:30:31 +0100 Subject: [PATCH] SONAR-4742 Add support of AJP 1.3 protocol --- .../src/main/assembly/conf/sonar.properties | 4 ++++ .../org/sonar/application/Connectors.java | 17 +++++++++++++-- .../org/sonar/application/ConnectorsTest.java | 21 +++++++++++++++++-- 3 files changed, 38 insertions(+), 4 deletions(-) diff --git a/sonar-application/src/main/assembly/conf/sonar.properties b/sonar-application/src/main/assembly/conf/sonar.properties index b97e9e3da21..372ad04c7d5 100644 --- a/sonar-application/src/main/assembly/conf/sonar.properties +++ b/sonar-application/src/main/assembly/conf/sonar.properties @@ -140,6 +140,10 @@ sonar.jdbc.timeBetweenEvictionRunsMillis=30000 # Access logs are enabled by default. #sonar.web.accessLogs.enable=true +# TCP port for incoming AJP connections. Disabled when value is -1. +# sonar.ajp.port=9009 + + #-------------------------------------------------------------------------------------------------- # UPDATE CENTER diff --git a/sonar-application/src/main/java/org/sonar/application/Connectors.java b/sonar-application/src/main/java/org/sonar/application/Connectors.java index 2fdb9c8ebe7..65b3d8291a4 100644 --- a/sonar-application/src/main/java/org/sonar/application/Connectors.java +++ b/sonar-application/src/main/java/org/sonar/application/Connectors.java @@ -30,6 +30,7 @@ class Connectors { private static final int DISABLED_PORT = -1; static final String HTTP_PROTOCOL = "HTTP/1.1"; + static final String AJP_PROTOCOL = "AJP/1.3"; static void configure(Tomcat tomcat, Props props) { configureShutdown(tomcat, props); @@ -38,7 +39,7 @@ class Connectors { private static void configureConnectors(Tomcat tomcat, Props props) { List connectors = new ArrayList(); - connectors.addAll(Arrays.asList(newHttpConnector(props), newHttpsConnector(props))); + connectors.addAll(Arrays.asList(newHttpConnector(props), newAjpConnector(props), newHttpsConnector(props))); connectors.removeAll(Collections.singleton(null)); verify(connectors); @@ -57,7 +58,7 @@ class Connectors { for (Connector connector : connectors) { int port = connector.getPort(); if (ports.contains(port)) { - throw new IllegalStateException(String.format("HTTP and HTTPS must not use the same port %d", port)); + throw new IllegalStateException(String.format("HTTP, AJP and HTTPS must not use the same port %d", port)); } ports.add(port); } @@ -86,6 +87,18 @@ class Connectors { return connector; } + @Nullable + private static Connector newAjpConnector(Props props) { + Connector connector = null; + int port = props.intOf("sonar.ajp.port", DISABLED_PORT); + if (port > DISABLED_PORT) { + connector = newConnector(props, AJP_PROTOCOL, "http"); + connector.setPort(port); + info("AJP connector is enabled on port " + port); + } + return connector; + } + @Nullable private static Connector newHttpsConnector(Props props) { Connector connector = null; diff --git a/sonar-application/src/test/java/org/sonar/application/ConnectorsTest.java b/sonar-application/src/test/java/org/sonar/application/ConnectorsTest.java index 4d8e9b4773c..6478937967c 100644 --- a/sonar-application/src/test/java/org/sonar/application/ConnectorsTest.java +++ b/sonar-application/src/test/java/org/sonar/application/ConnectorsTest.java @@ -133,6 +133,7 @@ public class ConnectorsTest { public void all_connectors_are_enabled() { Properties p = new Properties(); p.setProperty("sonar.web.port", "9000"); + p.setProperty("sonar.ajp.port", "9009"); p.setProperty("sonar.web.https.port", "9443"); Props props = new Props(p); @@ -145,6 +146,13 @@ public class ConnectorsTest { return c.getScheme().equals("http") && c.getPort() == 9000 && c.getProtocol().equals(Connectors.HTTP_PROTOCOL); } })); + verify(tomcat.getService()).addConnector(argThat(new ArgumentMatcher() { + @Override + public boolean matches(Object o) { + Connector c = (Connector) o; + return c.getScheme().equals("http") && c.getPort() == 9009 && c.getProtocol().equals(Connectors.AJP_PROTOCOL); + } + })); verify(tomcat.getService()).addConnector(argThat(new ArgumentMatcher() { @Override public boolean matches(Object o) { @@ -155,16 +163,17 @@ public class ConnectorsTest { } @Test - public void http_and_https_ports_should_be_different() throws Exception { + public void http_and_ajp_and_https_ports_should_be_different() throws Exception { Properties p = new Properties(); p.setProperty("sonar.web.port", "9000"); + p.setProperty("sonar.ajp.port", "9000"); p.setProperty("sonar.web.https.port", "9000"); try { Connectors.configure(tomcat, new Props(p)); fail(); } catch (IllegalStateException e) { - assertThat(e).hasMessage("HTTP and HTTPS must not use the same port 9000"); + assertThat(e).hasMessage("HTTP, AJP and HTTPS must not use the same port 9000"); } } @@ -172,6 +181,7 @@ public class ConnectorsTest { public void bind_to_all_addresses_by_default() throws Exception { Properties p = new Properties(); p.setProperty("sonar.web.port", "9000"); + p.setProperty("sonar.ajp.port", "9009"); p.setProperty("sonar.web.https.port", "9443"); Connectors.configure(tomcat, new Props(p)); @@ -183,6 +193,13 @@ public class ConnectorsTest { return c.getScheme().equals("http") && c.getPort() == 9000 && ((InetAddress)c.getProperty("address")).getHostAddress().equals("0.0.0.0"); } })); + verify(tomcat.getService()).addConnector(argThat(new ArgumentMatcher() { + @Override + public boolean matches(Object o) { + Connector c = (Connector) o; + return c.getScheme().equals("http") && c.getPort() == 9009 && ((InetAddress)c.getProperty("address")).getHostAddress().equals("0.0.0.0"); + } + })); verify(tomcat.getService()).addConnector(argThat(new ArgumentMatcher() { @Override public boolean matches(Object o) { -- 2.39.5