You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2023/01/09 13:25:09 UTC

[commons-net] branch master updated: NET-650 Delegated host resolution to Socket.connect()

This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-net.git


The following commit(s) were added to refs/heads/master by this push:
     new c479c05a NET-650 Delegated host resolution to Socket.connect()
     new 69ca4295 Merge pull request #138 from exceptionfactory/NET-650
c479c05a is described below

commit c479c05ac3f3e5ca7ce9ffd15f23b8c3f034b5bb
Author: exceptionfactory <ex...@apache.org>
AuthorDate: Fri Jan 6 22:49:19 2023 -0600

    NET-650 Delegated host resolution to Socket.connect()
    
    - Replaced InetAddress.getByName() with InetSocketAddress for private SocketClient._connect()
---
 .../java/org/apache/commons/net/SocketClient.java  | 17 ++++++----
 .../org/apache/commons/net/SocketClientTest.java   | 38 ++++++++++++++++++++--
 2 files changed, 46 insertions(+), 9 deletions(-)

diff --git a/src/main/java/org/apache/commons/net/SocketClient.java b/src/main/java/org/apache/commons/net/SocketClient.java
index a1291baa..9ca80f48 100644
--- a/src/main/java/org/apache/commons/net/SocketClient.java
+++ b/src/main/java/org/apache/commons/net/SocketClient.java
@@ -71,6 +71,9 @@ public abstract class SocketClient {
     /** The hostname used for the connection (null = no hostname supplied). */
     protected String _hostname_;
 
+    /** The remote socket address used for the connection */
+    protected InetSocketAddress _remoteAddress_;
+
     /** The default port the client should connect to. */
     protected int _defaultPort_;
 
@@ -118,7 +121,8 @@ public abstract class SocketClient {
     }
 
     // helper method to allow code to be shared with connect(String,...) methods
-    private void _connect(final InetAddress host, final int port, final InetAddress localAddr, final int localPort) throws SocketException, IOException {
+    private void _connect(final InetSocketAddress remoteAddress, final InetAddress localAddr, final int localPort) throws IOException {
+        _remoteAddress_ = remoteAddress;
         _socket_ = _socketFactory_.createSocket();
         if (receiveBufferSize != -1) {
             _socket_.setReceiveBufferSize(receiveBufferSize);
@@ -129,7 +133,7 @@ public abstract class SocketClient {
         if (localAddr != null) {
             _socket_.bind(new InetSocketAddress(localAddr, localPort));
         }
-        _socket_.connect(new InetSocketAddress(host, port), connectTimeout);
+        _socket_.connect(remoteAddress, connectTimeout);
         _connectAction_();
     }
 
@@ -218,7 +222,7 @@ public abstract class SocketClient {
      */
     public void connect(final InetAddress host, final int port) throws SocketException, IOException {
         _hostname_ = null;
-        _connect(host, port, null, -1);
+        _connect(new InetSocketAddress(host, port), null, -1);
     }
 
     /**
@@ -235,7 +239,7 @@ public abstract class SocketClient {
      */
     public void connect(final InetAddress host, final int port, final InetAddress localAddr, final int localPort) throws SocketException, IOException {
         _hostname_ = null;
-        _connect(host, port, localAddr, localPort);
+        _connect(new InetSocketAddress(host, port), localAddr, localPort);
     }
 
     /**
@@ -264,8 +268,7 @@ public abstract class SocketClient {
      * @throws java.net.UnknownHostException If the hostname cannot be resolved.
      */
     public void connect(final String hostname, final int port) throws SocketException, IOException {
-        _hostname_ = hostname;
-        _connect(InetAddress.getByName(hostname), port, null, -1);
+        connect(hostname, port, null, -1);
     }
 
     /**
@@ -283,7 +286,7 @@ public abstract class SocketClient {
      */
     public void connect(final String hostname, final int port, final InetAddress localAddr, final int localPort) throws SocketException, IOException {
         _hostname_ = hostname;
-        _connect(InetAddress.getByName(hostname), port, localAddr, localPort);
+        _connect(new InetSocketAddress(hostname, port), localAddr, localPort);
     }
 
     /**
diff --git a/src/test/java/org/apache/commons/net/SocketClientTest.java b/src/test/java/org/apache/commons/net/SocketClientTest.java
index 0f3f9253..b6ba96b4 100644
--- a/src/test/java/org/apache/commons/net/SocketClientTest.java
+++ b/src/test/java/org/apache/commons/net/SocketClientTest.java
@@ -16,25 +16,37 @@
  */
 package org.apache.commons.net;
 
+import java.io.IOException;
 import java.net.InetSocketAddress;
 import java.net.Proxy;
+import java.net.UnknownHostException;
 
 import org.apache.commons.net.ftp.FTPClient;
+import org.junit.jupiter.api.Test;
 
-import junit.framework.TestCase;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 /**
  * A simple test class for SocketClient settings.
  *
  * @since 3.2
  */
-public class SocketClientTest extends TestCase {
+public class SocketClientTest {
     private static final String PROXY_HOST = "127.0.0.1";
     private static final int PROXY_PORT = 1080;
 
+    private static final String LOCALHOST_ADDRESS = "127.0.0.1";
+    private static final String UNRESOLVED_HOST = "unresolved";
+    private static final int REMOTE_PORT = 21;
+
     /**
      * A simple test to verify that the Proxy is being set.
      */
+    @Test
     public void testProxySettings() {
         final SocketClient socketClient = new FTPClient();
         assertNull(socketClient.getProxy());
@@ -43,4 +55,26 @@ public class SocketClientTest extends TestCase {
         assertEquals(proxy, socketClient.getProxy());
         assertFalse(socketClient.isConnected());
     }
+
+    @Test
+    public void testConnectResolved() {
+        final SocketClient socketClient = new FTPClient();
+
+        assertThrows(IOException.class, () -> socketClient.connect(LOCALHOST_ADDRESS, REMOTE_PORT));
+        final InetSocketAddress remoteAddress = socketClient._remoteAddress_;
+        assertFalse(remoteAddress.isUnresolved());
+        assertEquals(LOCALHOST_ADDRESS, remoteAddress.getHostString());
+        assertEquals(REMOTE_PORT, remoteAddress.getPort());
+    }
+
+    @Test
+    public void testConnectUnresolved() {
+        final SocketClient socketClient = new FTPClient();
+
+        assertThrows(UnknownHostException.class, () -> socketClient.connect(UNRESOLVED_HOST, REMOTE_PORT, null, -1));
+        final InetSocketAddress remoteAddress = socketClient._remoteAddress_;
+        assertTrue(remoteAddress.isUnresolved());
+        assertEquals(UNRESOLVED_HOST, remoteAddress.getHostString());
+        assertEquals(REMOTE_PORT, remoteAddress.getPort());
+    }
 }