diff options
-rw-r--r-- | containers/org.eclipse.linuxtools.docker.ui/src/org/eclipse/linuxtools/internal/docker/ui/commands/CopyFromContainerCommandHandler.java | 42 |
1 files changed, 34 insertions, 8 deletions
diff --git a/containers/org.eclipse.linuxtools.docker.ui/src/org/eclipse/linuxtools/internal/docker/ui/commands/CopyFromContainerCommandHandler.java b/containers/org.eclipse.linuxtools.docker.ui/src/org/eclipse/linuxtools/internal/docker/ui/commands/CopyFromContainerCommandHandler.java index 9a28890bd9..a6ad0806a3 100644 --- a/containers/org.eclipse.linuxtools.docker.ui/src/org/eclipse/linuxtools/internal/docker/ui/commands/CopyFromContainerCommandHandler.java +++ b/containers/org.eclipse.linuxtools.docker.ui/src/org/eclipse/linuxtools/internal/docker/ui/commands/CopyFromContainerCommandHandler.java @@ -13,6 +13,7 @@ package org.eclipse.linuxtools.internal.docker.ui.commands; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStream; import java.util.List; import org.apache.commons.compress.archivers.tar.TarArchiveEntry; @@ -109,10 +110,17 @@ public class CopyFromContainerCommandHandler extends AbstractHandler { COPY_FROM_CONTAINER_JOB_SUBTASK, proxy.getFullPath())); monitor.worked(1); + InputStream in = ((DockerConnection) connection) + .copyContainer(container.id(), + proxy.getLink()); + /* + * The input stream from copyContainer might be + * incomplete or non-blocking so we should wrap it + * in a stream that is guaranteed to block until + * data is available. + */ TarArchiveInputStream k = new TarArchiveInputStream( - ((DockerConnection) connection) - .copyContainer(container.id(), - proxy.getLink())); + new BlockingInputStream(in)); TarArchiveEntry te = null; while ((te = k.getNextTarEntry()) != null) { long size = te.getSize(); @@ -126,17 +134,19 @@ public class CopyFromContainerCommandHandler extends AbstractHandler { f.createNewFile(); } FileOutputStream os = new FileOutputStream(f); - if (size > 4096) - size = 4096; - byte[] barray = new byte[(int) size]; - while (k.read(barray) > -1) { + int bufferSize = ((int) size > 4096 ? 4096 + : (int) size); + byte[] barray = new byte[bufferSize]; + int result = -1; + while ((result = k.read(barray, 0, + bufferSize)) > -1) { if (monitor.isCanceled()) { monitor.done(); k.close(); os.close(); return Status.CANCEL_STATUS; } - os.write(barray); + os.write(barray, 0, result); } os.close(); } @@ -172,4 +182,20 @@ public class CopyFromContainerCommandHandler extends AbstractHandler { } + /** + * A blocking input stream that waits until data is available. + */ + public class BlockingInputStream extends InputStream { + private InputStream in; + + public BlockingInputStream(InputStream in) { + this.in = in; + } + + @Override + public int read() throws IOException { + return in.read(); + } + } + } |