ObjectDownloadListener#onWritePossible: Make code spec compatible

Current code violates the ServletOutputStream contract. For every
out.isReady() == true either write or close of that ServletOutputStream
should be called.

See also this issue upstream for more context: [1].

[1] https://github.com/eclipse/jetty.project/issues/2911

Change-Id: Ied575f3603a6be0d2dafc6c3329d685fc212c7a3
Signed-off-by: David Ostrovsky <david@ostrovsky.org>
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
diff --git a/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/fs/ObjectDownloadListener.java b/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/fs/ObjectDownloadListener.java
index 0b96426..6025860 100644
--- a/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/fs/ObjectDownloadListener.java
+++ b/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/fs/ObjectDownloadListener.java
@@ -80,7 +80,7 @@
 
 	private final WritableByteChannel outChannel;
 
-	private final ByteBuffer buffer = ByteBuffer.allocateDirect(8192);
+	private ByteBuffer buffer = ByteBuffer.allocateDirect(8192);
 
 	/**
 	 * @param repository
@@ -115,20 +115,26 @@
 	@Override
 	public void onWritePossible() throws IOException {
 		while (out.isReady()) {
-			if (in.read(buffer) != -1) {
-				buffer.flip();
-				outChannel.write(buffer);
-				buffer.compact();
-			} else {
-				in.close();
-				buffer.flip();
-				while (out.isReady()) {
-					if (buffer.hasRemaining()) {
-						outChannel.write(buffer);
-					} else {
+			try {
+				buffer.clear();
+				if (in.read(buffer) < 0) {
+					buffer = null;
+				} else {
+					buffer.flip();
+				}
+			} catch(Throwable t) {
+				LOG.log(Level.SEVERE, t.getMessage(), t);
+				buffer = null;
+			} finally {
+				if (buffer != null) {
+					outChannel.write(buffer);
+				} else {
+					try {
+						out.close();
+					} finally {
 						context.complete();
-						return;
 					}
+					return;
 				}
 			}
 		}