diff --git a/build.gradle b/build.gradle index 9df94319..a5365f89 100644 --- a/build.gradle +++ b/build.gradle @@ -98,7 +98,6 @@ testing { implementation "org.apache.sshd:sshd-sftp:$sshdVersion" implementation "org.apache.sshd:sshd-scp:$sshdVersion" implementation "ch.qos.logback:logback-classic:1.5.18" - implementation 'org.glassfish.grizzly:grizzly-http-server:3.0.1' } targets { diff --git a/src/test/java/com/hierynomus/sshj/connection/channel/forwarded/LocalPortForwarderTest.java b/src/test/java/com/hierynomus/sshj/connection/channel/forwarded/LocalPortForwarderTest.java index b001a98c..db2df51a 100644 --- a/src/test/java/com/hierynomus/sshj/connection/channel/forwarded/LocalPortForwarderTest.java +++ b/src/test/java/com/hierynomus/sshj/connection/channel/forwarded/LocalPortForwarderTest.java @@ -17,7 +17,6 @@ package com.hierynomus.sshj.connection.channel.forwarded; import com.hierynomus.sshj.test.HttpServer; import com.hierynomus.sshj.test.SshServerExtension; -import com.hierynomus.sshj.test.util.FileUtil; import net.schmizz.sshj.SSHClient; import net.schmizz.sshj.connection.channel.direct.LocalPortForwarder; import net.schmizz.sshj.connection.channel.direct.Parameters; @@ -29,13 +28,10 @@ import org.junit.jupiter.api.extension.RegisterExtension; import java.io.*; import java.net.*; -import java.nio.file.Files; import static org.junit.jupiter.api.Assertions.assertEquals; public class LocalPortForwarderTest { - private static final String LOCALHOST_URL = "http://127.0.0.1:8080"; - @RegisterExtension public SshServerExtension fixture = new SshServerExtension(); @@ -43,21 +39,19 @@ public class LocalPortForwarderTest { public HttpServer httpServer = new HttpServer(); @BeforeEach - public void setUp() throws IOException { + public void setUp() { fixture.getServer().setForwardingFilter(new AcceptAllForwardingFilter()); - File file = Files.createFile(httpServer.getDocRoot().toPath().resolve("index.html")).toFile(); - FileUtil.writeToFile(file, "

Hi!

"); } @Test public void shouldHaveWorkingHttpServer() throws IOException { - assertEquals(200, httpGet()); + assertEquals(HttpURLConnection.HTTP_NOT_FOUND, httpGet()); } @Test public void shouldHaveHttpServerThatClosesConnectionAfterResponse() throws IOException { // Just to check that the test server does close connections before we try through the forwarder... - httpGetAndAssertConnectionClosedByServer(8080); + httpGetAndAssertConnectionClosedByServer(httpServer.getServerUrl().getPort()); } @Test @@ -68,7 +62,8 @@ public class LocalPortForwarderTest { ServerSocket serverSocket = new ServerSocket(); serverSocket.setReuseAddress(true); serverSocket.bind(new InetSocketAddress("0.0.0.0", 12345)); - LocalPortForwarder localPortForwarder = sshClient.newLocalPortForwarder(new Parameters("0.0.0.0", 12345, "localhost", 8080), serverSocket); + final int serverPort = httpServer.getServerUrl().getPort(); + LocalPortForwarder localPortForwarder = sshClient.newLocalPortForwarder(new Parameters("0.0.0.0", 12345, "localhost", serverPort), serverSocket); new Thread(() -> { try { localPortForwarder.listen(); @@ -90,7 +85,7 @@ public class LocalPortForwarderTest { // It returns 400 Bad Request because it's missing a bunch of info, but the HTTP response doesn't matter, we just want to test the connection closing. OutputStream outputStream = socket.getOutputStream(); PrintWriter writer = new PrintWriter(outputStream); - writer.println("GET / HTTP/1.1"); + writer.println("GET / HTTP/1.1\r\n"); writer.println(""); writer.flush(); @@ -111,7 +106,7 @@ public class LocalPortForwarderTest { } private int httpGet() throws IOException { - final URL url = new URL(LOCALHOST_URL); + final URL url = httpServer.getServerUrl().toURL(); final HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.setConnectTimeout(3000); urlConnection.setRequestMethod("GET"); diff --git a/src/test/java/com/hierynomus/sshj/connection/channel/forwarded/RemotePortForwarderTest.java b/src/test/java/com/hierynomus/sshj/connection/channel/forwarded/RemotePortForwarderTest.java index b07f2d2c..8a1da440 100644 --- a/src/test/java/com/hierynomus/sshj/connection/channel/forwarded/RemotePortForwarderTest.java +++ b/src/test/java/com/hierynomus/sshj/connection/channel/forwarded/RemotePortForwarderTest.java @@ -17,7 +17,6 @@ package com.hierynomus.sshj.connection.channel.forwarded; import com.hierynomus.sshj.test.HttpServer; import com.hierynomus.sshj.test.SshServerExtension; -import com.hierynomus.sshj.test.util.FileUtil; import net.schmizz.sshj.SSHClient; import net.schmizz.sshj.connection.ConnectionException; import net.schmizz.sshj.connection.channel.forwarded.RemotePortForwarder; @@ -27,20 +26,18 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; -import java.io.File; import java.io.IOException; import java.net.HttpURLConnection; import java.net.InetSocketAddress; +import java.net.URI; import java.net.URL; -import java.nio.file.Files; import static org.junit.jupiter.api.Assertions.assertEquals; public class RemotePortForwarderTest { private static final PortRange RANGE = new PortRange(9000, 9999); private static final String LOCALHOST = "127.0.0.1"; - private static final String LOCALHOST_URL_FORMAT = "http://127.0.0.1:%d"; - private static final InetSocketAddress HTTP_SERVER_SOCKET_ADDR = new InetSocketAddress(LOCALHOST, 8080); + private static final String URL_FORMAT = "http://%s:%d"; @RegisterExtension public SshServerExtension fixture = new SshServerExtension(); @@ -49,21 +46,21 @@ public class RemotePortForwarderTest { public HttpServer httpServer = new HttpServer(); @BeforeEach - public void setUp() throws IOException { + public void setUp() { fixture.getServer().setForwardingFilter(new AcceptAllForwardingFilter()); - File file = Files.createFile(httpServer.getDocRoot().toPath().resolve("index.html")).toFile(); - FileUtil.writeToFile(file, "

Hi!

"); } @Test public void shouldHaveWorkingHttpServer() throws IOException { - assertEquals(200, httpGet(8080)); + final URI serverUrl = httpServer.getServerUrl(); + + assertEquals(HttpURLConnection.HTTP_NOT_FOUND, httpGet(serverUrl.getHost(), serverUrl.getPort())); } @Test public void shouldDynamicallyForwardPortForLocalhost() throws IOException { SSHClient sshClient = getFixtureClient(); - RemotePortForwarder.Forward bind = forwardPort(sshClient, "127.0.0.1", new SinglePort(0)); + RemotePortForwarder.Forward bind = forwardPort(sshClient, LOCALHOST, new SinglePort(0)); assertHttpGetSuccess(bind); } @@ -84,7 +81,7 @@ public class RemotePortForwarderTest { @Test public void shouldForwardPortForLocalhost() throws IOException { SSHClient sshClient = getFixtureClient(); - RemotePortForwarder.Forward bind = forwardPort(sshClient, "127.0.0.1", RANGE); + RemotePortForwarder.Forward bind = forwardPort(sshClient, LOCALHOST, RANGE); assertHttpGetSuccess(bind); } @@ -103,17 +100,22 @@ public class RemotePortForwarderTest { } private void assertHttpGetSuccess(final RemotePortForwarder.Forward bind) throws IOException { - assertEquals(200, httpGet(bind.getPort())); + final String bindAddress = bind.getAddress(); + final String address = bindAddress.isEmpty() ? LOCALHOST : bindAddress; + final int port = bind.getPort(); + assertEquals(HttpURLConnection.HTTP_NOT_FOUND, httpGet(address, port)); } private RemotePortForwarder.Forward forwardPort(SSHClient sshClient, String address, PortRange portRange) throws IOException { while (true) { + final URI serverUrl = httpServer.getServerUrl(); + final InetSocketAddress serverAddress = new InetSocketAddress(serverUrl.getHost(), serverUrl.getPort()); try { return sshClient.getRemotePortForwarder().bind( // where the server should listen new RemotePortForwarder.Forward(address, portRange.nextPort()), // what we do with incoming connections that are forwarded to us - new SocketForwardingConnectListener(HTTP_SERVER_SOCKET_ADDR)); + new SocketForwardingConnectListener(serverAddress)); } catch (ConnectionException ce) { if (!portRange.hasNext()) { throw ce; @@ -122,8 +124,8 @@ public class RemotePortForwarderTest { } } - private int httpGet(final int port) throws IOException { - final URL url = new URL(String.format(LOCALHOST_URL_FORMAT, port)); + private int httpGet(final String address, final int port) throws IOException { + final URL url = new URL(String.format(URL_FORMAT, address, port)); final HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.setConnectTimeout(3000); urlConnection.setRequestMethod("GET"); diff --git a/src/test/java/com/hierynomus/sshj/test/HttpServer.java b/src/test/java/com/hierynomus/sshj/test/HttpServer.java index 259235b7..ed7b725a 100644 --- a/src/test/java/com/hierynomus/sshj/test/HttpServer.java +++ b/src/test/java/com/hierynomus/sshj/test/HttpServer.java @@ -19,42 +19,36 @@ import org.junit.jupiter.api.extension.AfterEachCallback; import org.junit.jupiter.api.extension.BeforeEachCallback; import org.junit.jupiter.api.extension.ExtensionContext; -import java.io.File; -import java.nio.file.Files; +import java.net.InetSocketAddress; +import java.net.URI; /** * Can be used to setup a test HTTP server */ public class HttpServer implements BeforeEachCallback, AfterEachCallback { - private org.glassfish.grizzly.http.server.HttpServer httpServer; + private static final String BIND_ADDRESS = "127.0.0.1"; - - private File docRoot ; + private com.sun.net.httpserver.HttpServer httpServer; @Override - public void afterEach(ExtensionContext context) throws Exception { + public void afterEach(ExtensionContext context) { try { - httpServer.shutdownNow(); - } catch (Exception e) {} - try { - docRoot.delete(); - } catch (Exception e) {} - + httpServer.stop(0); + } catch (Exception ignored) {} } @Override public void beforeEach(ExtensionContext context) throws Exception { - docRoot = Files.createTempDirectory("sshj").toFile(); - httpServer = org.glassfish.grizzly.http.server.HttpServer.createSimpleServer(docRoot.getAbsolutePath()); + httpServer = com.sun.net.httpserver.HttpServer.create(); + final InetSocketAddress socketAddress = new InetSocketAddress(BIND_ADDRESS, 0); + httpServer.bind(socketAddress, 10); httpServer.start(); } - public org.glassfish.grizzly.http.server.HttpServer getHttpServer() { - return httpServer; - } - - public File getDocRoot() { - return docRoot; + public URI getServerUrl() { + final InetSocketAddress bindAddress = httpServer.getAddress(); + final String serverUrl = String.format("http://%s:%d", BIND_ADDRESS, bindAddress.getPort()); + return URI.create(serverUrl); } }