Expose ssl protocol config 89/11989/3
authordave.adams (da490c) <dave.adams@amdocs.com>
Tue, 12 Sep 2017 16:14:02 +0000 (12:14 -0400)
committerdave.adams (da490c) <dave.adams@amdocs.com>
Thu, 21 Sep 2017 12:58:11 +0000 (08:58 -0400)
Issue-ID: AAI-127
Change-Id: I657144887df8ec36b73d0506902ca4d324dd794a
Signed-off-by: dave.adams (da490c) <dave.adams@amdocs.com>
src/main/java/org/onap/aai/restclient/client/RestClient.java
src/main/java/org/onap/aai/restclient/rest/RestClientBuilder.java
src/test/java/org/onap/aai/restclient/client/RestfulClientTest.java
src/test/java/org/onap/aai/restclient/rest/RestClientBuilderTest.java

index 02f12b1..a98f710 100644 (file)
@@ -236,6 +236,19 @@ public class RestClient {
     clientBuilder.setReadTimeoutInMs(timeout);
     return this;
   }
+  
+  /**
+   * Configures the client for a specific SSL protocol
+   *
+   * @param sslProtocol - protocol string constant such as TLS, TLSv1, TLSv1.1, TLSv1.2
+   *
+   * @return The AAIRESTClient instance. 
+   */
+  public RestClient sslProtocol(String sslProtocol) {
+    logger.debug("Set sslProtocol = " + sslProtocol);
+    clientBuilder.setSslProtocol(sslProtocol);
+    return this;
+  }
 
   private boolean shouldRetry(OperationResult operationResult) {
 
@@ -595,7 +608,7 @@ public class RestClient {
 
     if (headers != null) {
       for (Entry<String, List<String>> header : headers.entrySet()) {
-        builder.header(header.getKey(), header.getValue());
+        builder.header(header.getKey(), String.join(";",header.getValue()));
       }
       
       if (clientBuilder.getAuthenticationMode() == RestAuthenticationMode.SSL_BASIC) {
index f446f27..0272065 100644 (file)
@@ -39,7 +39,7 @@ import com.sun.jersey.api.client.Client;
 import com.sun.jersey.api.client.config.ClientConfig;\r
 import com.sun.jersey.api.client.config.DefaultClientConfig;\r
 import com.sun.jersey.client.urlconnection.HTTPSProperties;\r
-\r
\r
 /**\r
  * This is a generic REST Client builder with flexible security validation. Sometimes it's nice to\r
  * be able to disable server chain cert validation and hostname validation to work-around lab\r
@@ -59,8 +59,8 @@ public class RestClientBuilder {
   public static final RestAuthenticationMode DEFAULT_AUTH_MODE = RestAuthenticationMode.SSL_CERT;\r
   public static final String DEFAULT_BASIC_AUTH_USERNAME = "";\r
   public static final String DEFAULT_BASIC_AUTH_PASSWORD = "";\r
+  public static final String DEFAULT_SSL_PROTOCOL = "TLS";\r
 \r
-  private static final String SSL_PROTOCOL = "TLS";\r
   private static final String KEYSTORE_ALGORITHM = "SunX509";\r
   private static final String KEYSTORE_TYPE = "PKCS12";\r
   private static final String TRUST_STORE_PROPERTY = "javax.net.ssl.trustStore";\r
@@ -75,6 +75,7 @@ public class RestClientBuilder {
   private RestAuthenticationMode authenticationMode;\r
   private String basicAuthUsername;\r
   private String basicAuthPassword;\r
+  private String sslProtocol;\r
 \r
   /**\r
    * Rest Client Builder.\r
@@ -90,6 +91,7 @@ public class RestClientBuilder {
     authenticationMode = DEFAULT_AUTH_MODE;\r
     basicAuthUsername = DEFAULT_BASIC_AUTH_USERNAME;\r
     basicAuthPassword = DEFAULT_BASIC_AUTH_PASSWORD;\r
+    sslProtocol = DEFAULT_SSL_PROTOCOL;\r
   }\r
 \r
   public boolean isValidateServerHostname() {\r
@@ -148,8 +150,6 @@ public class RestClientBuilder {
     this.readTimeoutInMs = readTimeoutInMs;\r
   }\r
 \r
-\r
-\r
   public RestAuthenticationMode getAuthenticationMode() {\r
     return authenticationMode;\r
   }\r
@@ -174,6 +174,14 @@ public class RestClientBuilder {
     this.basicAuthPassword = basicAuthPassword;\r
   }\r
 \r
+  public String getSslProtocol() {\r
+    return sslProtocol;\r
+  }\r
+\r
+  public void setSslProtocol(String sslProtocol) {\r
+    this.sslProtocol = sslProtocol;\r
+  }\r
+\r
   /**\r
    * Returns Client configured for SSL\r
    */\r
@@ -219,7 +227,7 @@ public class RestClientBuilder {
 \r
     // Set up the SSL context, keystore, etc. to use for our connection\r
     // to the AAI.\r
-    SSLContext ctx = SSLContext.getInstance(SSL_PROTOCOL);\r
+    SSLContext ctx = SSLContext.getInstance(sslProtocol);\r
     KeyManagerFactory kmf = KeyManagerFactory.getInstance(KEYSTORE_ALGORITHM);\r
     KeyStore ks = KeyStore.getInstance(KEYSTORE_TYPE);\r
 \r
index 0e5c84e..1f528ae 100644 (file)
@@ -28,6 +28,7 @@ import javax.ws.rs.core.Response.Status;
 
 import org.junit.Before;
 import org.junit.Test;
+import org.mockito.ArgumentCaptor;
 import org.mockito.Mockito;
 import org.onap.aai.restclient.client.OperationResult;
 import org.onap.aai.restclient.client.RestClient;
@@ -167,6 +168,31 @@ public class RestfulClientTest {
         assertNull(result.getResult());
         assertNull(result.getFailureCause());
     }
+    
+    @Test
+    public void validateSuccessfulPost_withMultivaluedHeader() throws Exception {
+        RestClient restClient = buildClient();
+
+        MultivaluedMapImpl headerMap = new MultivaluedMapImpl();
+        
+        headerMap.add("txnId", "123");
+        headerMap.add("txnId", "456");
+        headerMap.add("txnId", "789");
+
+        OperationResult result = restClient.post(TEST_URL, "", headerMap, MediaType.APPLICATION_JSON_TYPE,
+            MediaType.APPLICATION_JSON_TYPE);
+
+        // capture the txnId header from the outgoing request  
+        ArgumentCaptor<String> txnIdHeaderName = ArgumentCaptor.forClass(String.class);
+        ArgumentCaptor<String> txnIdHeaderValue = ArgumentCaptor.forClass(String.class);
+        
+        Mockito.verify(mockedBuilder, Mockito.atLeast(1)).header(txnIdHeaderName.capture(), txnIdHeaderValue.capture());
+        assertEquals("123;456;789", txnIdHeaderValue.getValue());
+
+        assertEquals(Response.Status.OK.getStatusCode(), result.getResultCode());
+        assertNotNull(result.getResult());
+        assertNull(result.getFailureCause());
+    }
 
     @Test
     public void validateSuccessfulGet() throws Exception {
index 013f817..5e7d8c1 100644 (file)
@@ -269,5 +269,15 @@ public class RestClientBuilderTest {
    \r
   }\r
   \r
+  @Test\r
+  public void validateSslProtocolConfiguration() throws Exception {\r
+    \r
+    RestClientBuilder restClientBuilder = new RestClientBuilder();\r
+    assertEquals(RestClientBuilder.DEFAULT_SSL_PROTOCOL, restClientBuilder.getSslProtocol());\r
+    \r
+    restClientBuilder.setSslProtocol("TLSv1.2");\r
+    assertEquals("TLSv1.2", restClientBuilder.getSslProtocol());\r
+    \r
+  }\r
     \r
 }\r