* stable-4.9: 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: Ib7d01cb0ece8b259156855045a53b8baf3fa2968 Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>tags/v4.11.3.201809181037-r
@@ -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); | |||
PrintWriter writer = rsp.getWriter(); | |||
LfsGson.toJson(message, writer); |
@@ -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; | |||
} | |||
} | |||
} |
@@ -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(); | |||
} |
@@ -902,13 +902,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); | |||
} | |||
} | |||