Skip to content

Commit c8cd4cb

Browse files
authored
netty: Support SocketAddress with ChannelCredentials (grpc#8194)
This adds support for creating a Netty Channel with SocketAddress and ChannelCredentials. This aligns with NettyServerBuilder.forAddress(SocketAddress address, ServerCredentials creds).
1 parent 869b395 commit c8cd4cb

3 files changed

Lines changed: 70 additions & 2 deletions

File tree

core/src/main/java/io/grpc/internal/ManagedChannelImplBuilder.java

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -283,9 +283,25 @@ static String makeTargetStringForDirectAddress(SocketAddress address) {
283283
public ManagedChannelImplBuilder(SocketAddress directServerAddress, String authority,
284284
ClientTransportFactoryBuilder clientTransportFactoryBuilder,
285285
@Nullable ChannelBuilderDefaultPortProvider channelBuilderDefaultPortProvider) {
286+
this(directServerAddress, authority, null, null, clientTransportFactoryBuilder,
287+
channelBuilderDefaultPortProvider);
288+
}
289+
290+
/**
291+
* Creates a new managed channel builder with the given server address, authority string of the
292+
* channel. Transport implementors must provide client transport factory builder, and may set
293+
* custom channel default port provider.
294+
*
295+
* @param channelCreds The ChannelCredentials provided by the user. These may be used when
296+
* creating derivative channels.
297+
*/
298+
public ManagedChannelImplBuilder(SocketAddress directServerAddress, String authority,
299+
@Nullable ChannelCredentials channelCreds, @Nullable CallCredentials callCreds,
300+
ClientTransportFactoryBuilder clientTransportFactoryBuilder,
301+
@Nullable ChannelBuilderDefaultPortProvider channelBuilderDefaultPortProvider) {
286302
this.target = makeTargetStringForDirectAddress(directServerAddress);
287-
this.channelCredentials = null;
288-
this.callCredentials = null;
303+
this.channelCredentials = channelCreds;
304+
this.callCredentials = callCreds;
289305
this.clientTransportFactoryBuilder = Preconditions
290306
.checkNotNull(clientTransportFactoryBuilder, "clientTransportFactoryBuilder");
291307
this.directServerAddress = directServerAddress;

netty/src/main/java/io/grpc/netty/NettyChannelBuilder.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,23 @@ public static NettyChannelBuilder forAddress(SocketAddress serverAddress) {
127127
return new NettyChannelBuilder(serverAddress);
128128
}
129129

130+
/**
131+
* Creates a new builder with the given server address. This factory method is primarily intended
132+
* for using Netty Channel types other than SocketChannel.
133+
* {@link #forAddress(String, int, ChannelCredentials)} should generally be preferred over this
134+
* method, since that API permits delaying DNS lookups and noticing changes to DNS. If an
135+
* unresolved InetSocketAddress is passed in, then it will remain unresolved.
136+
*/
137+
@CheckReturnValue
138+
public static NettyChannelBuilder forAddress(SocketAddress serverAddress,
139+
ChannelCredentials creds) {
140+
FromChannelCredentialsResult result = ProtocolNegotiators.from(creds);
141+
if (result.error != null) {
142+
throw new IllegalArgumentException(result.error);
143+
}
144+
return new NettyChannelBuilder(serverAddress, creds, result.callCredentials, result.negotiator);
145+
}
146+
130147
/**
131148
* Creates a new builder with the given host and port.
132149
*/
@@ -207,6 +224,18 @@ public int getDefaultPort() {
207224
this.freezeProtocolNegotiatorFactory = false;
208225
}
209226

227+
NettyChannelBuilder(
228+
SocketAddress address, ChannelCredentials channelCreds, CallCredentials callCreds,
229+
ProtocolNegotiator.ClientFactory negotiator) {
230+
managedChannelImplBuilder = new ManagedChannelImplBuilder(address,
231+
getAuthorityFromAddress(address),
232+
channelCreds, callCreds,
233+
new NettyChannelTransportFactoryBuilder(),
234+
new NettyChannelDefaultPortProvider());
235+
this.protocolNegotiatorFactory = checkNotNull(negotiator, "negotiator");
236+
this.freezeProtocolNegotiatorFactory = true;
237+
}
238+
210239
@Internal
211240
@Override
212241
protected ManagedChannelBuilder<?> delegate() {

netty/src/test/java/io/grpc/netty/NettyChannelBuilderTest.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import static org.mockito.Mockito.mock;
2424

2525
import io.grpc.ChannelCredentials;
26+
import io.grpc.InsecureChannelCredentials;
2627
import io.grpc.ManagedChannel;
2728
import io.grpc.internal.ClientTransportFactory;
2829
import io.grpc.internal.ClientTransportFactory.SwapChannelCredentialsResult;
@@ -153,6 +154,28 @@ public void failIfSslContextIsNotClient() {
153154
builder.sslContext(sslContext);
154155
}
155156

157+
@Test
158+
public void failNegotiationTypeWithChannelCredentials_target() {
159+
NettyChannelBuilder builder = NettyChannelBuilder.forTarget(
160+
"fakeTarget", InsecureChannelCredentials.create());
161+
162+
thrown.expect(IllegalStateException.class);
163+
thrown.expectMessage("Cannot change security when using ChannelCredentials");
164+
165+
builder.negotiationType(NegotiationType.TLS);
166+
}
167+
168+
@Test
169+
public void failNegotiationTypeWithChannelCredentials_socketAddress() {
170+
NettyChannelBuilder builder = NettyChannelBuilder.forAddress(
171+
new SocketAddress(){}, InsecureChannelCredentials.create());
172+
173+
thrown.expect(IllegalStateException.class);
174+
thrown.expectMessage("Cannot change security when using ChannelCredentials");
175+
176+
builder.negotiationType(NegotiationType.TLS);
177+
}
178+
156179
@Test
157180
public void createProtocolNegotiatorByType_plaintext() {
158181
ProtocolNegotiator negotiator = NettyChannelBuilder.createProtocolNegotiatorByType(

0 commit comments

Comments
 (0)