aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Pursehouse <david.pursehouse@gmail.com>2018-09-18 09:19:13 +0900
committerDavid Pursehouse <david.pursehouse@gmail.com>2018-09-18 09:19:18 +0900
commit1cfb4241de69a170fe12444dac75ee195038e1d3 (patch)
tree39b2617471e7f37dbadefe553baaac3660cedfde
parent0c8200b27b60baafd81bbaeeec0eb671891308e5 (diff)
parentca922217e258bbfd56dd07d8638f48a5df0d831a (diff)
downloadjgit-1cfb4241de69a170fe12444dac75ee195038e1d3.tar.gz
jgit-1cfb4241de69a170fe12444dac75ee195038e1d3.zip
Merge branch 'stable-5.0' into stable-5.1
* stable-5.0: Fix ObjectUploadListener#close Fix error handling in FileLfsServlet ObjectDownloadListener#onWritePossible: Make code spec compatible ObjectDownloadListener: Return from onWritePossible when data is written Fix IOException when LockToken#close fails Change-Id: Ib7a63b5144a89c213aff3b32c30a2a6526355e64 Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
-rw-r--r--org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/fs/FileLfsServlet.java5
-rw-r--r--org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/fs/ObjectDownloadListener.java31
-rw-r--r--org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/fs/ObjectUploadListener.java4
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java19
4 files changed, 39 insertions, 20 deletions
diff --git a/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/fs/FileLfsServlet.java b/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/fs/FileLfsServlet.java
index 36dc7606b4..c86e15b265 100644
--- a/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/fs/FileLfsServlet.java
+++ b/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/fs/FileLfsServlet.java
@@ -177,6 +177,11 @@ public class FileLfsServlet extends HttpServlet {
*/
protected static void sendError(HttpServletResponse rsp, int status, String message)
throws IOException {
+ if (rsp.isCommitted()) {
+ rsp.getOutputStream().close();
+ return;
+ }
+ rsp.reset();
rsp.setStatus(status);
try (PrintWriter writer = rsp.getWriter()) {
LfsGson.toJson(message, writer);
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 ec1d3cd5dc..ef359121bb 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 @@ public class ObjectDownloadListener implements WriteListener {
private final WritableByteChannel outChannel;
- private final ByteBuffer buffer = ByteBuffer.allocateDirect(8192);
+ private ByteBuffer buffer = ByteBuffer.allocateDirect(8192);
/**
* <p>Constructor for ObjectDownloadListener.</p>
@@ -117,19 +117,26 @@ public class ObjectDownloadListener implements WriteListener {
@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;
}
}
}
diff --git a/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/fs/ObjectUploadListener.java b/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/fs/ObjectUploadListener.java
index e4c04c19b1..c5b6a67876 100644
--- a/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/fs/ObjectUploadListener.java
+++ b/org.eclipse.jgit.lfs.server/src/org/eclipse/jgit/lfs/server/fs/ObjectUploadListener.java
@@ -156,7 +156,9 @@ public class ObjectUploadListener implements ReadListener {
channel.close();
// TODO check if status 200 is ok for PUT request, HTTP foresees 204
// for successful PUT without response body
- response.setStatus(HttpServletResponse.SC_OK);
+ if (!response.isCommitted()) {
+ response.setStatus(HttpServletResponse.SC_OK);
+ }
} finally {
context.complete();
}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java
index ea3cf5f518..e5c2922cfa 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/FS.java
@@ -916,13 +916,18 @@ public abstract class FS {
@Override
public void close() {
- if (link.isPresent()) {
- try {
- Files.delete(link.get());
- } catch (IOException e) {
- LOG.error(MessageFormat.format(JGitText.get().closeLockTokenFailed,
- this), e);
- }
+ if (!link.isPresent()) {
+ return;
+ }
+ Path p = link.get();
+ if (!Files.exists(p)) {
+ return;
+ }
+ try {
+ Files.delete(p);
+ } catch (IOException e) {
+ LOG.error(MessageFormat
+ .format(JGitText.get().closeLockTokenFailed, this), e);
}
}