diff --git a/src/main/java/net/schmizz/sshj/sftp/PacketReader.java b/src/main/java/net/schmizz/sshj/sftp/PacketReader.java index d54633a0..30e55edf 100644 --- a/src/main/java/net/schmizz/sshj/sftp/PacketReader.java +++ b/src/main/java/net/schmizz/sshj/sftp/PacketReader.java @@ -103,8 +103,11 @@ public class PacketReader promise.deliver(resp); } - public void expectResponseTo(Request req) { - promises.put(req.getRequestID(), req.getResponsePromise()); + public Promise expectResponseTo(long requestId) { + final Promise promise + = new Promise("sftp / " + requestId, SFTPException.chainer); + promises.put(requestId, promise); + return promise; } } diff --git a/src/main/java/net/schmizz/sshj/sftp/RemoteDirectory.java b/src/main/java/net/schmizz/sshj/sftp/RemoteDirectory.java index 91e75dde..8622f5c9 100644 --- a/src/main/java/net/schmizz/sshj/sftp/RemoteDirectory.java +++ b/src/main/java/net/schmizz/sshj/sftp/RemoteDirectory.java @@ -20,6 +20,7 @@ import net.schmizz.sshj.sftp.Response.StatusCode; import java.io.IOException; import java.util.LinkedList; import java.util.List; +import java.util.concurrent.TimeUnit; public class RemoteDirectory extends RemoteResource { @@ -33,7 +34,8 @@ public class RemoteDirectory List rri = new LinkedList(); loop: for (; ; ) { - Response res = requester.doRequest(newRequest(PacketType.READDIR)); + final Response res = requester.request(newRequest(PacketType.READDIR)) + .retrieve(requester.getTimeout(), TimeUnit.SECONDS); switch (res.getType()) { case NAME: diff --git a/src/main/java/net/schmizz/sshj/sftp/RemoteFile.java b/src/main/java/net/schmizz/sshj/sftp/RemoteFile.java index 4d78084e..3d5df132 100644 --- a/src/main/java/net/schmizz/sshj/sftp/RemoteFile.java +++ b/src/main/java/net/schmizz/sshj/sftp/RemoteFile.java @@ -20,6 +20,7 @@ import net.schmizz.sshj.sftp.Response.StatusCode; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.util.concurrent.TimeUnit; public class RemoteFile extends RemoteResource { @@ -38,9 +39,10 @@ public class RemoteFile public FileAttributes fetchAttributes() throws IOException { - return requester.doRequest(newRequest(PacketType.FSTAT)) - .ensurePacketTypeIs(PacketType.ATTRS) - .readFileAttributes(); + return requester.request(newRequest(PacketType.FSTAT)) + .retrieve(requester.getTimeout(), TimeUnit.SECONDS) + .ensurePacketTypeIs(PacketType.ATTRS) + .readFileAttributes(); } public long length() @@ -55,7 +57,9 @@ public class RemoteFile public int read(long fileOffset, byte[] to, int offset, int len) throws IOException { - Response res = requester.doRequest(newRequest(PacketType.READ).putUInt64(fileOffset).putUInt32(len)); + final Response res = requester.request( + newRequest(PacketType.READ).putUInt64(fileOffset).putUInt32(len) + ).retrieve(requester.getTimeout(), TimeUnit.SECONDS); switch (res.getType()) { case DATA: int recvLen = res.readUInt32AsInt(); @@ -73,16 +77,17 @@ public class RemoteFile public void write(long fileOffset, byte[] data, int off, int len) throws IOException { - requester.doRequest(newRequest(PacketType.WRITE) + requester.request(newRequest(PacketType.WRITE) .putUInt64(fileOffset) .putUInt32(len - off) .putRawBytes(data, off, len) - ).ensureStatusPacketIsOK(); + ).retrieve(requester.getTimeout(), TimeUnit.SECONDS).ensureStatusPacketIsOK(); } public void setAttributes(FileAttributes attrs) throws IOException { - requester.doRequest(newRequest(PacketType.FSETSTAT).putFileAttributes(attrs)).ensureStatusPacketIsOK(); + requester.request(newRequest(PacketType.FSETSTAT).putFileAttributes(attrs)) + .retrieve(requester.getTimeout(), TimeUnit.SECONDS).ensureStatusPacketIsOK(); } public int getOutgoingPacketOverhead() { diff --git a/src/main/java/net/schmizz/sshj/sftp/RemoteResource.java b/src/main/java/net/schmizz/sshj/sftp/RemoteResource.java index 6be9abfd..09aea9da 100644 --- a/src/main/java/net/schmizz/sshj/sftp/RemoteResource.java +++ b/src/main/java/net/schmizz/sshj/sftp/RemoteResource.java @@ -20,6 +20,7 @@ import org.slf4j.LoggerFactory; import java.io.Closeable; import java.io.IOException; +import java.util.concurrent.TimeUnit; public abstract class RemoteResource implements Closeable { @@ -49,7 +50,9 @@ public abstract class RemoteResource public void close() throws IOException { log.debug("Closing `{}`", this); - requester.doRequest(newRequest(PacketType.CLOSE)).ensureStatusPacketIsOK(); + requester.request(newRequest(PacketType.CLOSE)) + .retrieve(requester.getTimeout(), TimeUnit.SECONDS) + .ensureStatusPacketIsOK(); } @Override diff --git a/src/main/java/net/schmizz/sshj/sftp/Request.java b/src/main/java/net/schmizz/sshj/sftp/Request.java index 3172e5ad..29066e0e 100644 --- a/src/main/java/net/schmizz/sshj/sftp/Request.java +++ b/src/main/java/net/schmizz/sshj/sftp/Request.java @@ -15,20 +15,16 @@ */ package net.schmizz.sshj.sftp; -import net.schmizz.concurrent.Promise; - public final class Request extends SFTPPacket { private final PacketType type; private final long reqID; - private final Promise responsePromise; public Request(PacketType type, long reqID) { super(type); this.type = type; this.reqID = reqID; - responsePromise = new Promise("sftp / " + reqID, SFTPException.chainer); putUInt32(reqID); } @@ -40,10 +36,6 @@ public final class Request return type; } - public Promise getResponsePromise() { - return responsePromise; - } - @Override public String toString() { return "Request{" + reqID + ";" + type + "}"; diff --git a/src/main/java/net/schmizz/sshj/sftp/Requester.java b/src/main/java/net/schmizz/sshj/sftp/Requester.java index 2cb4cba7..81c38bfa 100644 --- a/src/main/java/net/schmizz/sshj/sftp/Requester.java +++ b/src/main/java/net/schmizz/sshj/sftp/Requester.java @@ -15,6 +15,8 @@ */ package net.schmizz.sshj.sftp; +import net.schmizz.concurrent.Promise; + import java.io.IOException; public interface Requester { @@ -23,7 +25,9 @@ public interface Requester { Request newRequest(PacketType type); - Response doRequest(Request req) + Promise request(Request req) throws IOException; + int getTimeout(); + } diff --git a/src/main/java/net/schmizz/sshj/sftp/SFTPEngine.java b/src/main/java/net/schmizz/sshj/sftp/SFTPEngine.java index 2814f973..d34b2e82 100644 --- a/src/main/java/net/schmizz/sshj/sftp/SFTPEngine.java +++ b/src/main/java/net/schmizz/sshj/sftp/SFTPEngine.java @@ -15,6 +15,7 @@ */ package net.schmizz.sshj.sftp; +import net.schmizz.concurrent.Promise; import net.schmizz.sshj.common.SSHException; import net.schmizz.sshj.connection.channel.direct.Session.Subsystem; import net.schmizz.sshj.connection.channel.direct.SessionFactory; @@ -116,12 +117,17 @@ public class SFTPEngine } @Override - public Response doRequest(Request req) + public Promise request(Request req) throws IOException { - reader.expectResponseTo(req); + final Promise promise = reader.expectResponseTo(req.getRequestID()); log.debug("Sending {}", req); transmit(req); - return req.getResponsePromise().retrieve(timeout, TimeUnit.SECONDS); + return promise; + } + + private Response doRequest(Request req) + throws IOException { + return request(req).retrieve(getTimeout(), TimeUnit.SECONDS); } public RemoteFile open(String path, Set modes, FileAttributes fa)