3333/** gRPC channel builder helper. */
3434@ SuppressFBWarnings (value = "SE_BAD_FIELD" , justification = "we don't care to serialize this" )
3535public class ChannelBuilder {
36+
37+ private static final Metadata .Key <String > FLAGD_SELECTOR_KEY =
38+ Metadata .Key .of ("flagd-selector" , Metadata .ASCII_STRING_MARSHALLER );
39+
3640 /**
3741 * Controls retry (not-reconnection) policy for failed RPCs.
3842 */
@@ -128,14 +132,14 @@ public static ManagedChannel nettyChannel(final FlagdOptions options) {
128132 final String defaultTarget = String .format ("%s:%s" , options .getHost (), options .getPort ());
129133 final String targetUri = isValidTargetUri (options .getTargetUri ()) ? options .getTargetUri () : defaultTarget ;
130134
131- final NettyChannelBuilder builder =
135+ final NettyChannelBuilder channelBuilder =
132136 NettyChannelBuilder .forTarget (targetUri ).keepAliveTime (keepAliveMs , TimeUnit .MILLISECONDS );
133137
134138 if (options .getDefaultAuthority () != null ) {
135- builder .overrideAuthority (options .getDefaultAuthority ());
139+ channelBuilder .overrideAuthority (options .getDefaultAuthority ());
136140 }
137141 if (options .getClientInterceptors () != null ) {
138- builder .intercept (options .getClientInterceptors ());
142+ channelBuilder .intercept (options .getClientInterceptors ());
139143 }
140144 if (options .isTls ()) {
141145 SslContextBuilder sslContext = GrpcSslContexts .forClient ();
@@ -147,17 +151,21 @@ public static ManagedChannel nettyChannel(final FlagdOptions options) {
147151 }
148152 }
149153
150- builder .sslContext (sslContext .build ());
154+ channelBuilder .sslContext (sslContext .build ());
151155 } else {
152- builder .usePlaintext ();
156+ channelBuilder .usePlaintext ();
153157 }
154158
155159 // telemetry interceptor if option is provided
156160 if (options .getOpenTelemetry () != null ) {
157- builder .intercept (new FlagdGrpcInterceptor (options .getOpenTelemetry ()));
161+ channelBuilder .intercept (new FlagdGrpcInterceptor (options .getOpenTelemetry ()));
162+ }
163+ // add header-based selector interceptor if selector is provided
164+ if (options .getSelector () != null ) {
165+ channelBuilder .intercept (createSelectorInterceptor (options .getSelector ()));
158166 }
159167
160- return builder .defaultServiceConfig (buildRetryPolicy (options ))
168+ return channelBuilder .defaultServiceConfig (buildRetryPolicy (options ))
161169 .enableRetry ()
162170 .build ();
163171 } catch (SSLException ssle ) {
@@ -188,7 +196,7 @@ public <ReqT, RespT> ClientCall<ReqT, RespT> interceptCall(
188196 next .newCall (method , callOptions )) {
189197 @ Override
190198 public void start (Listener <RespT > responseListener , Metadata headers ) {
191- headers .put (Metadata . Key . of ( "flagd-selector" , Metadata . ASCII_STRING_MARSHALLER ) , selector );
199+ headers .put (FLAGD_SELECTOR_KEY , selector );
192200 super .start (responseListener , headers );
193201 }
194202 };
0 commit comments