Browse Source

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>
stable-4.7
David Ostrovsky 6 years ago committed by David Ostrovsky
parent
commit
5c134f4d42
  1. 24
      org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/fs/ObjectDownloadListener.java

24
org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/fs/ObjectDownloadListener.java

@ -80,7 +80,7 @@ public class ObjectDownloadListener implements WriteListener {
private final WritableByteChannel outChannel; private final WritableByteChannel outChannel;
private final ByteBuffer buffer = ByteBuffer.allocateDirect(8192); private ByteBuffer buffer = ByteBuffer.allocateDirect(8192);
/** /**
* @param repository * @param repository
@ -115,20 +115,26 @@ public class ObjectDownloadListener implements WriteListener {
@Override @Override
public void onWritePossible() throws IOException { public void onWritePossible() throws IOException {
while (out.isReady()) { while (out.isReady()) {
if (in.read(buffer) != -1) { try {
buffer.flip(); buffer.clear();
outChannel.write(buffer); if (in.read(buffer) < 0) {
buffer.compact(); buffer = null;
} else { } else {
in.close();
buffer.flip(); buffer.flip();
while (out.isReady()) { }
if (buffer.hasRemaining()) { } catch(Throwable t) {
LOG.log(Level.SEVERE, t.getMessage(), t);
buffer = null;
} finally {
if (buffer != null) {
outChannel.write(buffer); outChannel.write(buffer);
} else { } else {
try {
out.close();
} finally {
context.complete(); context.complete();
return;
} }
return;
} }
} }
} }

Loading…
Cancel
Save