]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-4742 Add support of AJP 1.3 protocol 36/head
authorJan Stamer <jan.stamer@freenet.de>
Sat, 15 Feb 2014 21:30:31 +0000 (22:30 +0100)
committerJan Stamer <jan.stamer@freenet.de>
Sat, 15 Feb 2014 21:30:31 +0000 (22:30 +0100)
sonar-application/src/main/assembly/conf/sonar.properties
sonar-application/src/main/java/org/sonar/application/Connectors.java
sonar-application/src/test/java/org/sonar/application/ConnectorsTest.java

index b97e9e3da217ff23b4c5df4aecdf3180e8c6a902..372ad04c7d522a0dd3f3fc8543302f94cb85fcad 100644 (file)
@@ -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
index 2fdb9c8ebe73bed7ed0254b8294552e883564f4b..65b3d8291a4556b8f31883dc9bb3caf78de3c66d 100644 (file)
@@ -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<Connector> connectors = new ArrayList<Connector>();
-    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;
index 4d8e9b4773c5c2c7cfc52141cd94820de061e685..6478937967cfa3c4d7c073e0ca6fa3b47faa389d 100644 (file)
@@ -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<Connector>() {
+       @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<Connector>() {
       @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<Connector>() {
+       @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<Connector>() {
       @Override
       public boolean matches(Object o) {