diff --git a/xds/src/main/java/io/grpc/xds/ClusterResolverLoadBalancer.java b/xds/src/main/java/io/grpc/xds/ClusterResolverLoadBalancer.java index dcddb99e004..caeaab4014f 100644 --- a/xds/src/main/java/io/grpc/xds/ClusterResolverLoadBalancer.java +++ b/xds/src/main/java/io/grpc/xds/ClusterResolverLoadBalancer.java @@ -24,6 +24,7 @@ import com.google.common.base.Splitter; import com.google.common.collect.ImmutableMap; import com.google.common.net.InetAddresses; +import com.google.protobuf.Any; import com.google.protobuf.Struct; import io.grpc.Attributes; import io.grpc.EquivalentAddressGroup; @@ -488,21 +489,12 @@ private SocketAddress rewriteAddress(SocketAddress addr, ImmutableMap parseMetadata(Metadata metadata) - throws InvalidProtocolBufferException { + throws ResourceInvalidException, InvalidProtocolBufferException { ImmutableMap.Builder parsedMetadata = ImmutableMap.builder(); MetadataRegistry registry = MetadataRegistry.getInstance(); @@ -115,6 +116,6 @@ interface MetadataValueParser { * @return the parsed metadata value. * @throws InvalidProtocolBufferException if the parsing fails. */ - Object parse(Any any) throws InvalidProtocolBufferException; + Object parse(Any any) throws ResourceInvalidException; } } diff --git a/xds/src/main/java/io/grpc/xds/XdsEndpointResource.java b/xds/src/main/java/io/grpc/xds/XdsEndpointResource.java index 415ab4a05aa..58e28962182 100644 --- a/xds/src/main/java/io/grpc/xds/XdsEndpointResource.java +++ b/xds/src/main/java/io/grpc/xds/XdsEndpointResource.java @@ -295,7 +295,7 @@ public String toString() { } } - static class AddressMetadataParser implements MetadataValueParser { + public static class AddressMetadataParser implements MetadataValueParser { @Override public String getTypeUrl() { @@ -303,10 +303,13 @@ public String getTypeUrl() { } @Override - public java.net.SocketAddress parse(Any any) throws InvalidProtocolBufferException { - Address addressProto = any.unpack(Address.class); - SocketAddress socketAddress = addressProto.getSocketAddress(); - + public java.net.SocketAddress parse(Any any) throws ResourceInvalidException { + SocketAddress socketAddress; + try { + socketAddress = any.unpack(Address.class).getSocketAddress(); + } catch (InvalidProtocolBufferException ex) { + throw new ResourceInvalidException("Invalid Resource in address proto", ex); + } validateAddress(socketAddress); String ip = socketAddress.getAddress(); @@ -319,18 +322,18 @@ public java.net.SocketAddress parse(Any any) throws InvalidProtocolBufferExcepti } } - private void validateAddress(SocketAddress socketAddress) throws InvalidProtocolBufferException { + private void validateAddress(SocketAddress socketAddress) throws ResourceInvalidException { if (socketAddress.getAddress().isEmpty()) { throw createException("Address field is empty or invalid."); } long port = Integer.toUnsignedLong(socketAddress.getPortValue()); - if (port == 0 || port > 65535) { + if (port > 65535) { throw createException(String.format("Port value %d out of range 1-65535.", port)); } } - private InvalidProtocolBufferException createException(String message) { - return new InvalidProtocolBufferException("Failed to parse envoy.config.core.v3.Address: " + message); + private ResourceInvalidException createException(String message) { + return new ResourceInvalidException("Failed to parse envoy.config.core.v3.Address: " + message); } } } diff --git a/xds/src/test/java/io/grpc/xds/GrpcXdsClientImplDataTest.java b/xds/src/test/java/io/grpc/xds/GrpcXdsClientImplDataTest.java index 654e85143b8..d1dcc64974e 100644 --- a/xds/src/test/java/io/grpc/xds/GrpcXdsClientImplDataTest.java +++ b/xds/src/test/java/io/grpc/xds/GrpcXdsClientImplDataTest.java @@ -1198,7 +1198,7 @@ public void parseLocalityLbEndpoints_withDualStackEndpoints() { } @Test - public void parseLocalityLbEndpoints_invalidPriority() { + public void parseLocalityLbEndpoints_invalidPriority() throws ResourceInvalidException { io.envoyproxy.envoy.config.endpoint.v3.LocalityLbEndpoints proto = io.envoyproxy.envoy.config.endpoint.v3.LocalityLbEndpoints.newBuilder() .setLocality(Locality.newBuilder()