1
1
package dev .openfeature .contrib .providers .flagd .resolver .common ;
2
2
3
3
import dev .openfeature .contrib .providers .flagd .FlagdOptions ;
4
+ import dev .openfeature .contrib .providers .flagd .resolver .common .nameresolvers .EnvoyResolverProvider ;
4
5
import edu .umd .cs .findbugs .annotations .SuppressFBWarnings ;
5
6
import io .grpc .ManagedChannel ;
7
+ import io .grpc .NameResolverRegistry ;
6
8
import io .grpc .netty .GrpcSslContexts ;
7
9
import io .grpc .netty .NettyChannelBuilder ;
8
10
import io .netty .channel .epoll .Epoll ;
13
15
14
16
import javax .net .ssl .SSLException ;
15
17
import java .io .File ;
18
+ import java .net .URI ;
19
+ import java .net .URISyntaxException ;
16
20
import java .util .concurrent .TimeUnit ;
17
21
18
22
/**
@@ -50,9 +54,21 @@ public static ManagedChannel nettyChannel(final FlagdOptions options) {
50
54
51
55
// build a TCP socket
52
56
try {
57
+ // Register custom resolver
58
+ if (isEnvoyTarget (options .getTargetUri ())) {
59
+ NameResolverRegistry .getDefaultRegistry ().register (new EnvoyResolverProvider ());
60
+ }
61
+
62
+ // default to current `dns` resolution i.e. <host>:<port>, if valid / supported
63
+ // target string use the user provided target uri.
64
+ final String defaultTarget = String .format ("%s:%s" , options .getHost (), options .getPort ());
65
+ final String targetUri = isValidTargetUri (options .getTargetUri ()) ? options .getTargetUri () :
66
+ defaultTarget ;
67
+
53
68
final NettyChannelBuilder builder = NettyChannelBuilder
54
- .forAddress ( options . getHost (), options . getPort () )
69
+ .forTarget ( targetUri )
55
70
.keepAliveTime (keepAliveMs , TimeUnit .MILLISECONDS );
71
+
56
72
if (options .isTls ()) {
57
73
SslContextBuilder sslContext = GrpcSslContexts .forClient ();
58
74
@@ -78,6 +94,48 @@ public static ManagedChannel nettyChannel(final FlagdOptions options) {
78
94
SslConfigException sslConfigException = new SslConfigException ("Error with SSL configuration." );
79
95
sslConfigException .initCause (ssle );
80
96
throw sslConfigException ;
97
+ } catch (IllegalArgumentException argumentException ) {
98
+ GenericConfigException genericConfigException = new GenericConfigException (
99
+ "Error with gRPC target string configuration" );
100
+ genericConfigException .initCause (argumentException );
101
+ throw genericConfigException ;
102
+ }
103
+ }
104
+
105
+ private static boolean isValidTargetUri (String targetUri ) {
106
+ if (targetUri == null ) {
107
+ return false ;
108
+ }
109
+
110
+ try {
111
+ final String scheme = new URI (targetUri ).getScheme ();
112
+ if (scheme .equals (SupportedScheme .ENVOY .getScheme ()) || scheme .equals (SupportedScheme .DNS .getScheme ())
113
+ || scheme .equals (SupportedScheme .XDS .getScheme ())
114
+ || scheme .equals (SupportedScheme .UDS .getScheme ())) {
115
+ return true ;
116
+ }
117
+ } catch (URISyntaxException e ) {
118
+ throw new IllegalArgumentException ("Invalid target string" , e );
81
119
}
120
+
121
+ return false ;
122
+ }
123
+
124
+ private static boolean isEnvoyTarget (String targetUri ) {
125
+ if (targetUri == null ) {
126
+ return false ;
127
+ }
128
+
129
+ try {
130
+ final String scheme = new URI (targetUri ).getScheme ();
131
+ if (scheme .equals (SupportedScheme .ENVOY .getScheme ())) {
132
+ return true ;
133
+ }
134
+ } catch (URISyntaxException e ) {
135
+ throw new IllegalArgumentException ("Invalid target string" , e );
136
+ }
137
+
138
+ return false ;
139
+
82
140
}
83
141
}
0 commit comments