From 315fafdaf2e4caa94fae1aa5314ad1c336caf9fe Mon Sep 17 00:00:00 2001 From: Artem Bilan Date: Wed, 30 Oct 2019 14:44:50 -0400 Subject: [PATCH] GH-3090: Add `logout() to `FtpSession.close()` Fixes https://github.com/spring-projects/spring-integration/issues/3090 Without `logout()` the FTP session is not closed at all, but just the connection is closed. Some FTP servers close those sessions eventually anyway, but some just leak with resources. **Cherry-pick to 5.1.x & 4.3.x** --- .../integration/ftp/session/FtpSession.java | 2 +- .../integration/ftp/session/SessionFactoryTests.java | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/session/FtpSession.java b/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/session/FtpSession.java index b862d217d0..6f09a6fda7 100644 --- a/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/session/FtpSession.java +++ b/spring-integration-ftp/src/main/java/org/springframework/integration/ftp/session/FtpSession.java @@ -153,6 +153,7 @@ public class FtpSession implements Session { } } } + this.client.logout(); this.client.disconnect(); } catch (Exception e) { @@ -196,7 +197,6 @@ public class FtpSession implements Session { return this.client.removeDirectory(directory); } - @Override public boolean exists(String path) throws IOException { Assert.hasText(path, "'path' must not be empty"); diff --git a/spring-integration-ftp/src/test/java/org/springframework/integration/ftp/session/SessionFactoryTests.java b/spring-integration-ftp/src/test/java/org/springframework/integration/ftp/session/SessionFactoryTests.java index a1016d55f7..e1912e4b03 100644 --- a/spring-integration-ftp/src/test/java/org/springframework/integration/ftp/session/SessionFactoryTests.java +++ b/spring-integration-ftp/src/test/java/org/springframework/integration/ftp/session/SessionFactoryTests.java @@ -45,6 +45,7 @@ import org.springframework.integration.util.PoolItemNotAvailableException; * @author Oleg Zhurakousky * @author Gunnar Hillert * @author Gary Russell + * @author Artem Bilan * */ @SuppressWarnings({"rawtypes", "unchecked"}) @@ -52,7 +53,7 @@ public class SessionFactoryTests { @Test - public void testTimeouts() throws Exception { + public void testFtpClientInteraction() throws Exception { final FTPClient client = mock(FTPClient.class); DefaultFtpSessionFactory sessionFactory = new DefaultFtpSessionFactory() { @@ -67,10 +68,15 @@ public class SessionFactoryTests { sessionFactory.setDataTimeout(789); doReturn(200).when(client).getReplyCode(); doReturn(true).when(client).login("foo", null); - sessionFactory.getSession(); + FtpSession session = sessionFactory.getSession(); verify(client).setConnectTimeout(123); verify(client).setDefaultTimeout(456); verify(client).setDataTimeout(789); + + session.close(); + + verify(client).logout(); + verify(client).disconnect(); } @Test