Skip to content

Commit 549b450

Browse files
committed
Use SSL context/params in RPP for HTTPS
Signed-off-by: Rui Vieira <[email protected]>
1 parent af8c300 commit 549b450

File tree

3 files changed

+69
-14
lines changed

3 files changed

+69
-14
lines changed

src/main/java/com/ibm/watson/modelmesh/ModelMesh.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,15 +100,19 @@
100100
import org.eclipse.collections.impl.list.mutable.primitive.IntArrayList;
101101

102102
import javax.annotation.concurrent.GuardedBy;
103+
import javax.net.ssl.SSLContext;
103104
import java.io.File;
105+
import java.io.IOException;
104106
import java.io.InterruptedIOException;
107+
import java.io.UncheckedIOException;
105108
import java.lang.management.ManagementFactory;
106109
import java.lang.management.MemoryMXBean;
107110
import java.lang.management.MemoryUsage;
108111
import java.lang.reflect.InvocationTargetException;
109112
import java.lang.reflect.Method;
110113
import java.net.URI;
111114
import java.nio.channels.ClosedByInterruptException;
115+
import java.security.NoSuchAlgorithmException;
112116
import java.text.ParseException;
113117
import java.text.SimpleDateFormat;
114118
import java.util.*;
@@ -431,7 +435,7 @@ public abstract class ModelMesh extends ThriftService
431435
private PayloadProcessor initPayloadProcessor() {
432436
String payloadProcessorsDefinitions = getStringParameter(MM_PAYLOAD_PROCESSORS, null);
433437
logger.info("Parsing PayloadProcessor definition '{}'", payloadProcessorsDefinitions);
434-
if (payloadProcessorsDefinitions != null && payloadProcessorsDefinitions.length() > 0) {
438+
if (payloadProcessorsDefinitions != null && !payloadProcessorsDefinitions.isEmpty()) {
435439
List<PayloadProcessor> payloadProcessors = new ArrayList<>();
436440
for (String processorDefinition : payloadProcessorsDefinitions.split(" ")) {
437441
try {
@@ -442,6 +446,14 @@ private PayloadProcessor initPayloadProcessor() {
442446
String method = uri.getFragment();
443447
if ("http".equals(processorName)) {
444448
processor = new RemotePayloadProcessor(uri);
449+
} else if ("https".equals(processorName)) {
450+
SSLContext sslContext;
451+
try {
452+
sslContext = SSLContext.getDefault();
453+
} catch (NoSuchAlgorithmException missingAlgorithmException) {
454+
throw new UncheckedIOException(new IOException(missingAlgorithmException));
455+
}
456+
processor = new RemotePayloadProcessor(uri, sslContext, sslContext.getDefaultSSLParameters());
445457
} else if ("logger".equals(processorName)) {
446458
processor = new LoggingPayloadProcessor();
447459
}

src/main/java/com/ibm/watson/modelmesh/payload/RemotePayloadProcessor.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
import java.nio.charset.StandardCharsets;
2424
import java.util.HashMap;
2525
import java.util.Map;
26+
import javax.net.ssl.SSLContext;
27+
import javax.net.ssl.SSLParameters;
2628

2729
import com.fasterxml.jackson.databind.ObjectMapper;
2830
import io.grpc.Metadata;
@@ -42,11 +44,27 @@ public class RemotePayloadProcessor implements PayloadProcessor {
4244

4345
private final URI uri;
4446

47+
private final SSLContext sslContext;
48+
private final SSLParameters sslParameters;
49+
4550
private final HttpClient client;
4651

4752
public RemotePayloadProcessor(URI uri) {
53+
this(uri, null, null);
54+
}
55+
56+
public RemotePayloadProcessor(URI uri, SSLContext sslContext, SSLParameters sslParameters) {
4857
this.uri = uri;
49-
this.client = HttpClient.newHttpClient();
58+
this.sslContext = sslContext;
59+
this.sslParameters = sslParameters;
60+
if (sslContext != null && sslParameters != null) {
61+
this.client = HttpClient.newBuilder()
62+
.sslContext(sslContext)
63+
.sslParameters(sslParameters)
64+
.build();
65+
} else {
66+
this.client = HttpClient.newHttpClient();
67+
}
5068
}
5169

5270
@Override

src/test/java/com/ibm/watson/modelmesh/payload/RemotePayloadProcessorTest.java

Lines changed: 37 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,30 +16,55 @@
1616

1717
package com.ibm.watson.modelmesh.payload;
1818

19+
import java.io.IOException;
1920
import java.net.URI;
21+
import java.security.NoSuchAlgorithmException;
2022

2123
import io.grpc.Metadata;
2224
import io.grpc.Status;
2325
import io.netty.buffer.ByteBuf;
2426
import io.netty.buffer.Unpooled;
2527
import org.junit.jupiter.api.Test;
2628

29+
import javax.net.ssl.SSLContext;
30+
import javax.net.ssl.SSLParameters;
31+
2732
import static org.junit.jupiter.api.Assertions.assertFalse;
2833

2934
class RemotePayloadProcessorTest {
3035

36+
void testDestinationUnreachable() throws IOException {
37+
URI uri = URI.create("http://this-does-not-exist:123");
38+
try (RemotePayloadProcessor remotePayloadProcessor = new RemotePayloadProcessor(uri)) {
39+
String id = "123";
40+
String modelId = "456";
41+
String method = "predict";
42+
Status kind = Status.INVALID_ARGUMENT;
43+
Metadata metadata = new Metadata();
44+
metadata.put(Metadata.Key.of("foo", Metadata.ASCII_STRING_MARSHALLER), "bar");
45+
metadata.put(Metadata.Key.of("binary-bin", Metadata.BINARY_BYTE_MARSHALLER), "string".getBytes());
46+
ByteBuf data = Unpooled.buffer(4);
47+
Payload payload = new Payload(id, modelId, method, metadata, data, kind);
48+
assertFalse(remotePayloadProcessor.process(payload));
49+
}
50+
}
51+
3152
@Test
32-
void testDestinationUnreachable() {
33-
RemotePayloadProcessor remotePayloadProcessor = new RemotePayloadProcessor(URI.create("http://this-does-not-exist:123"));
34-
String id = "123";
35-
String modelId = "456";
36-
String method = "predict";
37-
Status kind = Status.INVALID_ARGUMENT;
38-
Metadata metadata = new Metadata();
39-
metadata.put(Metadata.Key.of("foo", Metadata.ASCII_STRING_MARSHALLER), "bar");
40-
metadata.put(Metadata.Key.of("binary-bin", Metadata.BINARY_BYTE_MARSHALLER), "string".getBytes());
41-
ByteBuf data = Unpooled.buffer(4);
42-
Payload payload = new Payload(id, modelId, method, metadata, data, kind);
43-
assertFalse(remotePayloadProcessor.process(payload));
53+
void testDestinationUnreachableHTTPS() throws IOException, NoSuchAlgorithmException {
54+
URI uri = URI.create("https://this-does-not-exist:123");
55+
SSLContext sslContext = SSLContext.getDefault();
56+
SSLParameters sslParameters = sslContext.getDefaultSSLParameters();
57+
try (RemotePayloadProcessor remotePayloadProcessor = new RemotePayloadProcessor(uri, sslContext, sslParameters)) {
58+
String id = "123";
59+
String modelId = "456";
60+
String method = "predict";
61+
Status kind = Status.INVALID_ARGUMENT;
62+
Metadata metadata = new Metadata();
63+
metadata.put(Metadata.Key.of("foo", Metadata.ASCII_STRING_MARSHALLER), "bar");
64+
metadata.put(Metadata.Key.of("binary-bin", Metadata.BINARY_BYTE_MARSHALLER), "string".getBytes());
65+
ByteBuf data = Unpooled.buffer(4);
66+
Payload payload = new Payload(id, modelId, method, metadata, data, kind);
67+
assertFalse(remotePayloadProcessor.process(payload));
68+
}
4469
}
4570
}

0 commit comments

Comments
 (0)