diff --git a/flight/flight-core/src/main/java/org/apache/arrow/flight/grpc/NettyClientBuilder.java b/flight/flight-core/src/main/java/org/apache/arrow/flight/grpc/NettyClientBuilder.java index 42cdaac01..cf23e152a 100644 --- a/flight/flight-core/src/main/java/org/apache/arrow/flight/grpc/NettyClientBuilder.java +++ b/flight/flight-core/src/main/java/org/apache/arrow/flight/grpc/NettyClientBuilder.java @@ -139,7 +139,9 @@ public NettyChannelBuilder build() { case LocationSchemes.GRPC_INSECURE: case LocationSchemes.GRPC_TLS: { - builder = NettyChannelBuilder.forAddress(location.toSocketAddress()); + builder = + NettyChannelBuilder.forAddress( + location.getUri().getHost(), location.getUri().getPort()); break; } case LocationSchemes.GRPC_DOMAIN_SOCKET: diff --git a/flight/flight-sql-jdbc-core/src/test/java/org/apache/arrow/driver/jdbc/ConnectionTest.java b/flight/flight-sql-jdbc-core/src/test/java/org/apache/arrow/driver/jdbc/ConnectionTest.java index 55722f60f..d9122d101 100644 --- a/flight/flight-sql-jdbc-core/src/test/java/org/apache/arrow/driver/jdbc/ConnectionTest.java +++ b/flight/flight-sql-jdbc-core/src/test/java/org/apache/arrow/driver/jdbc/ConnectionTest.java @@ -26,6 +26,11 @@ import static org.junit.jupiter.api.Assertions.fail; import com.google.protobuf.Message; +import java.io.IOException; +import java.net.Proxy; +import java.net.ProxySelector; +import java.net.SocketAddress; +import java.net.URI; import java.net.URISyntaxException; import java.sql.Connection; import java.sql.Driver; @@ -33,8 +38,10 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; +import java.util.List; import java.util.Map; import java.util.Properties; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Consumer; import org.apache.arrow.driver.jdbc.authentication.UserPasswordAuthentication; import org.apache.arrow.driver.jdbc.client.ArrowFlightSqlClientHandler; @@ -768,4 +775,39 @@ public void testResultSetsFromDatabaseMetadataClosedOnConnectionClose() throws E assertTrue(resultSets[i].isClosed()); } } + + @Test + public void testJdbcDriverConsultsProxySelectorForTcpConnections() throws Exception { + AtomicBoolean consulted = new AtomicBoolean(false); + ProxySelector original = ProxySelector.getDefault(); + ProxySelector.setDefault( + new ProxySelector() { + @Override + public List select(URI uri) { + consulted.set(true); + return original.select(uri); + } + + @Override + public void connectFailed(URI uri, SocketAddress sa, IOException e) {} + }); + + try { + final Properties properties = new Properties(); + properties.put(ArrowFlightConnectionProperty.USER.camelName(), userTest); + properties.put(ArrowFlightConnectionProperty.PASSWORD.camelName(), passTest); + properties.put("useEncryption", false); + + DriverManager.getConnection( + "jdbc:arrow-flight-sql://localhost:" + FLIGHT_SERVER_TEST_EXTENSION.getPort(), + properties) + .close(); + + assertTrue( + consulted.get(), + "JDBC driver must consult ProxySelector so JVM proxy settings are respected"); + } finally { + ProxySelector.setDefault(original); + } + } }